diff --git a/content/browser/media/capture/web_contents_frame_tracker.cc b/content/browser/media/capture/web_contents_frame_tracker.cc index 6f2ffc0e72c7f823ba3c8d40e003f7136d4152c0..13a8d4cae402b75e2ee7bdc4c3c301f34d25cf46 100644 --- a/content/browser/media/capture/web_contents_frame_tracker.cc +++ b/content/browser/media/capture/web_contents_frame_tracker.cc @@ -90,12 +90,16 @@ WebContentsFrameTracker::WebContentsFrameTracker( base::WeakPtr device, MouseCursorOverlayController* cursor_controller) : device_(std::move(device)), - device_task_runner_(base::ThreadTaskRunnerHandle::Get()) { - DCHECK(device_task_runner_); + device_task_runner_(base::ThreadTaskRunnerHandle::Get()) +#if !BUILDFLAG(IS_ANDROID) + , + cursor_controller_(cursor_controller->GetWeakPtr()) +#endif +{ + CHECK(device_task_runner_); #if !BUILDFLAG(IS_ANDROID) - cursor_controller_ = cursor_controller; - DCHECK(cursor_controller_); + CHECK(cursor_controller_); #endif } @@ -289,7 +293,9 @@ void WebContentsFrameTracker::SetTargetView(gfx::NativeView view) { return; target_native_view_ = view; #if !BUILDFLAG(IS_ANDROID) - cursor_controller_->SetTargetView(view); + if (cursor_controller_) { + cursor_controller_->SetTargetView(view); + } #endif } diff --git a/content/browser/media/capture/web_contents_frame_tracker.h b/content/browser/media/capture/web_contents_frame_tracker.h index 56e7775622b5aefb88444127ff7dfc522b974eff..8220bb11cba008e6754ae5aac655ebde46616ab5 100644 --- a/content/browser/media/capture/web_contents_frame_tracker.h +++ b/content/browser/media/capture/web_contents_frame_tracker.h @@ -120,12 +120,12 @@ class CONTENT_EXPORT WebContentsFrameTracker final // The task runner to be used for device callbacks. const scoped_refptr device_task_runner_; - // Owned by FrameSinkVideoCaptureDevice. This will be valid for the life of - // WebContentsFrameTracker because the WebContentsFrameTracker deleter task - // will be posted to the UI thread before the MouseCursorOverlayController - // deleter task. + // Owned by FrameSinkVideoCaptureDevice. This may only be accessed on the + // UI thread. This is not guaranteed to be valid and must be checked before + // use. + // https://crbug.com/1480152 #if !BUILDFLAG(IS_ANDROID) - raw_ptr cursor_controller_ = nullptr; + const base::WeakPtr cursor_controller_; #endif // We may not have a frame sink ID target at all times.