diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/content/browser/renderer_host/media | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/content/browser/renderer_host/media')
27 files changed, 256 insertions, 206 deletions
diff --git a/chromium/content/browser/renderer_host/media/audio_input_device_manager.cc b/chromium/content/browser/renderer_host/media/audio_input_device_manager.cc index f32a49429ae..b86fbf71e23 100644 --- a/chromium/content/browser/renderer_host/media/audio_input_device_manager.cc +++ b/chromium/content/browser/renderer_host/media/audio_input_device_manager.cc @@ -12,7 +12,6 @@ #include "base/command_line.h" #include "base/metrics/histogram_macros.h" #include "base/strings/stringprintf.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/public/browser/browser_task_traits.h" @@ -136,7 +135,6 @@ base::UnguessableToken AudioInputDeviceManager::Open( audio_system_->GetAssociatedOutputDeviceID( device.id, base::BindOnce(&AudioInputDeviceManager::OpenedOnIOThread, base::Unretained(this), session_id, device, - base::TimeTicks::Now(), base::Optional<media::AudioParameters>())); } else { // TODO(tommi): As is, we hit this code path when device.type is @@ -152,8 +150,7 @@ base::UnguessableToken AudioInputDeviceManager::Open( audio_system_->GetInputDeviceInfo( device.id, base::BindOnce(&AudioInputDeviceManager::OpenedOnIOThread, - base::Unretained(this), session_id, device, - base::TimeTicks::Now())); + base::Unretained(this), session_id, device)); } return session_id; @@ -170,8 +167,8 @@ void AudioInputDeviceManager::Close(const base::UnguessableToken& session_id) { // Post a callback through the listener on IO thread since // MediaStreamManager is expecting the callback asynchronously. - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&AudioInputDeviceManager::ClosedOnIOThread, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&AudioInputDeviceManager::ClosedOnIOThread, this, stream_type, session_id)); } @@ -200,8 +197,8 @@ void AudioInputDeviceManager::KeyboardMicRegistration::DeregisterIfNeeded() { --*shared_registration_count_; DCHECK_GE(*shared_registration_count_, 0); if (*shared_registration_count_ == 0) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&SetKeyboardMicStreamActiveOnUIThread, false)); } } @@ -217,9 +214,8 @@ void AudioInputDeviceManager::RegisterKeyboardMicStream( ++keyboard_mic_streams_count_; if (keyboard_mic_streams_count_ == 1) { - base::PostTaskAndReply( - FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&SetKeyboardMicStreamActiveOnUIThread, true), + GetUIThreadTaskRunner({})->PostTaskAndReply( + FROM_HERE, base::BindOnce(&SetKeyboardMicStreamActiveOnUIThread, true), base::BindOnce(std::move(callback), KeyboardMicRegistration(&keyboard_mic_streams_count_))); } else { @@ -232,7 +228,6 @@ void AudioInputDeviceManager::RegisterKeyboardMicStream( void AudioInputDeviceManager::OpenedOnIOThread( const base::UnguessableToken& session_id, const blink::MediaStreamDevice& device, - base::TimeTicks start_time, const base::Optional<media::AudioParameters>& input_params, const base::Optional<std::string>& matched_output_device_id) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -240,10 +235,7 @@ void AudioInputDeviceManager::OpenedOnIOThread( DCHECK(!input_params || input_params->IsValid()); DCHECK(!matched_output_device_id || !matched_output_device_id->empty()); - UMA_HISTOGRAM_TIMES("Media.AudioInputDeviceManager.OpenOnDeviceThreadTime", - base::TimeTicks::Now() - start_time); SendAudioLogMessage("Opened({session_id=" + session_id.ToString() + "})"); - blink::MediaStreamDevice media_stream_device(device.type, device.id, device.name); media_stream_device.set_session_id(session_id); diff --git a/chromium/content/browser/renderer_host/media/audio_input_device_manager.h b/chromium/content/browser/renderer_host/media/audio_input_device_manager.h index c534ea09c63..17008e13bec 100644 --- a/chromium/content/browser/renderer_host/media/audio_input_device_manager.h +++ b/chromium/content/browser/renderer_host/media/audio_input_device_manager.h @@ -94,7 +94,6 @@ class CONTENT_EXPORT AudioInputDeviceManager : public MediaStreamProvider { void OpenedOnIOThread( const base::UnguessableToken& session_id, const blink::MediaStreamDevice& device, - base::TimeTicks start_time, const base::Optional<media::AudioParameters>& input_params, const base::Optional<std::string>& matched_output_device_id); diff --git a/chromium/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/chromium/content/browser/renderer_host/media/audio_output_authorization_handler.cc index 760a8169262..adfe08bc33f 100644 --- a/chromium/content/browser/renderer_host/media/audio_output_authorization_handler.cc +++ b/chromium/content/browser/renderer_host/media/audio_output_authorization_handler.cc @@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" -#include "base/task/post_task.h" #include "base/task_runner_util.h" #include "base/trace_event/trace_event.h" #include "content/browser/media/media_devices_permission_checker.h" @@ -170,8 +169,8 @@ void AudioOutputAuthorizationHandler::RequestDeviceAuthorization( trace_scope->UsingSessionId(session_id, device->id); // We don't need the origin for authorization in this case, but it's used // for hashing the device id before sending it back to the renderer. - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&GetMediaDeviceSaltAndOrigin, render_process_id_, render_frame_id), base::BindOnce(&AudioOutputAuthorizationHandler::HashDeviceId, @@ -191,8 +190,8 @@ void AudioOutputAuthorizationHandler::RequestDeviceAuthorization( trace_scope->CheckAccessStart(device_id); // Check device permissions if nondefault device is requested. - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&CheckAccessOnUIThread, render_process_id_, render_frame_id, override_permissions_, permissions_override_value_, diff --git a/chromium/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc b/chromium/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc index 3ae089addba..173428c097b 100644 --- a/chromium/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc +++ b/chromium/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc @@ -9,9 +9,9 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "base/test/mock_callback.h" #include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" @@ -118,15 +118,15 @@ class AudioOutputAuthorizationHandlerTest : public RenderViewHostTestHarness { // enough for our code. for (int i = 0; i < 20; ++i) { base::RunLoop().RunUntilIdle(); - SyncWith(base::CreateSingleThreadTaskRunner({BrowserThread::IO})); + SyncWith(GetIOThreadTaskRunner({})); SyncWith(audio_manager_->GetWorkerTaskRunner()); } } std::string GetRawNondefaultId() { std::string id; - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandlerTest::GetRawNondefaultIdOnIOThread, base::Unretained(this), base::Unretained(&id))); @@ -187,15 +187,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeDefaultDevice_Ok) { std::make_unique<AudioOutputAuthorizationHandler>( GetAudioSystem(), GetMediaStreamManager(), process()->GetID()); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken(), kDefaultDeviceId, listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -209,15 +209,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::make_unique<AudioOutputAuthorizationHandler>( GetAudioSystem(), GetMediaStreamManager(), process()->GetID()); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken(), kEmptyDeviceId, listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -234,8 +234,8 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::unique_ptr<AudioOutputAuthorizationHandler> handler = std::make_unique<AudioOutputAuthorizationHandler>( GetAudioSystem(), GetMediaStreamManager(), process()->GetID()); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, base::Unretained(handler.get()), false)); @@ -245,15 +245,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::string(), std::string())) .Times(1); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken(), hashed_id, listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -269,8 +269,8 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::unique_ptr<AudioOutputAuthorizationHandler> handler = std::make_unique<AudioOutputAuthorizationHandler>( GetAudioSystem(), GetMediaStreamManager(), process()->GetID()); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, base::Unretained(handler.get()), true)); @@ -279,15 +279,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, raw_nondefault_id, std::string())) .Times(1); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken(), hashed_id, listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -301,8 +301,8 @@ TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeInvalidDeviceId_NotFound) { std::string(), std::string())) .Times(1); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), @@ -312,7 +312,7 @@ TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeInvalidDeviceId_NotFound) { // It is possible to request an invalid device id from JS APIs, // so we don't want to crash the renderer for this. EXPECT_EQ(process()->bad_msg_count(), 0); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -336,8 +336,8 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::string(), std::string())) .Times(1); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), @@ -345,7 +345,7 @@ TEST_F(AudioOutputAuthorizationHandlerTest, SyncWithAllThreads(); EXPECT_EQ(process()->bad_msg_count(), 0); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -360,15 +360,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::string())) .Times(1); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken::Create(), std::string(), listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } @@ -384,16 +384,16 @@ TEST_F(AudioOutputAuthorizationHandlerTest, std::unique_ptr<AudioOutputAuthorizationHandler> handler = std::make_unique<AudioOutputAuthorizationHandler>( GetAudioSystem(), GetMediaStreamManager(), process()->GetID()); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, base::Unretained(handler.get()), true)); EXPECT_CALL(listener, Run(media::OUTPUT_DEVICE_STATUS_OK, _, raw_nondefault_id, std::string())); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), @@ -408,15 +408,15 @@ TEST_F(AudioOutputAuthorizationHandlerTest, context->set_media_device_id_salt("new salt"); EXPECT_CALL(listener, Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, _, _, std::string())); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &AudioOutputAuthorizationHandler::RequestDeviceAuthorization, base::Unretained(handler.get()), main_rfh()->GetRoutingID(), base::UnguessableToken(), hashed_id, listener.Get())); SyncWithAllThreads(); - base::DeleteSoon(FROM_HERE, {BrowserThread::IO}, handler.release()); + GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, handler.release()); SyncWithAllThreads(); } diff --git a/chromium/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc b/chromium/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc index def79b7ed57..a0d5196417f 100644 --- a/chromium/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc +++ b/chromium/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc @@ -11,7 +11,6 @@ #include "base/command_line.h" #include "base/metrics/histogram_macros.h" #include "base/strings/stringprintf.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/renderer_host/media/in_process_launched_video_capture_device.h" #include "content/browser/renderer_host/media/video_capture_controller.h" @@ -55,8 +54,7 @@ namespace { std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder( media::VideoCaptureJpegDecoder::DecodeDoneCB decode_done_cb, base::RepeatingCallback<void(const std::string&)> send_log_message_cb) { - auto io_task_runner = - base::CreateSingleThreadTaskRunner({content::BrowserThread::IO}); + auto io_task_runner = content::GetIOThreadTaskRunner({}); return std::make_unique<media::ScopedVideoCaptureJpegDecoder>( std::make_unique<media::VideoCaptureJpegDecoderImpl>( base::BindRepeating( @@ -111,8 +109,7 @@ void InProcessVideoCaptureDeviceLauncher::LaunchDeviceAsync( // Wrap the receiver, to trampoline all its method calls from the device // to the IO thread. auto receiver = std::make_unique<media::VideoFrameReceiverOnTaskRunner>( - receiver_on_io_thread, - base::CreateSingleThreadTaskRunner({BrowserThread::IO})); + receiver_on_io_thread, GetIOThreadTaskRunner({})); base::OnceClosure start_capture_closure; // Use of Unretained |this| is safe, because |done_cb| guarantees that |this| diff --git a/chromium/content/browser/renderer_host/media/media_capture_devices_impl.cc b/chromium/content/browser/renderer_host/media/media_capture_devices_impl.cc index 41d390bd896..a00bedff6e0 100644 --- a/chromium/content/browser/renderer_host/media/media_capture_devices_impl.cc +++ b/chromium/content/browser/renderer_host/media/media_capture_devices_impl.cc @@ -5,7 +5,6 @@ #include "content/browser/renderer_host/media/media_capture_devices_impl.h" #include "base/bind.h" -#include "base/task/post_task.h" #include "content/browser/browser_main_loop.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/public/browser/browser_task_traits.h" @@ -17,8 +16,8 @@ namespace { void EnsureMonitorCaptureDevices() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &MediaStreamManager::EnsureDeviceMonitorStarted, base::Unretained( @@ -60,8 +59,8 @@ void MediaCaptureDevicesImpl::AddVideoCaptureObserver( MediaStreamManager* media_stream_manager = BrowserMainLoop::GetInstance()->media_stream_manager(); if (media_stream_manager != nullptr) { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::AddVideoCaptureObserver, base::Unretained(media_stream_manager), observer)); } else { @@ -73,8 +72,8 @@ void MediaCaptureDevicesImpl::RemoveAllVideoCaptureObservers() { MediaStreamManager* media_stream_manager = BrowserMainLoop::GetInstance()->media_stream_manager(); if (media_stream_manager != nullptr) { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::RemoveAllVideoCaptureObservers, base::Unretained(media_stream_manager))); } else { @@ -87,8 +86,8 @@ void MediaCaptureDevicesImpl::OnAudioCaptureDevicesChanged( if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { UpdateAudioDevicesOnUIThread(devices); } else { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaCaptureDevicesImpl::UpdateAudioDevicesOnUIThread, base::Unretained(this), devices)); } @@ -99,8 +98,8 @@ void MediaCaptureDevicesImpl::OnVideoCaptureDevicesChanged( if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { UpdateVideoDevicesOnUIThread(devices); } else { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaCaptureDevicesImpl::UpdateVideoDevicesOnUIThread, base::Unretained(this), devices)); } diff --git a/chromium/content/browser/renderer_host/media/media_devices_dispatcher_host.cc b/chromium/content/browser/renderer_host/media/media_devices_dispatcher_host.cc index a06e23c2aa4..eb26134fc0f 100644 --- a/chromium/content/browser/renderer_host/media/media_devices_dispatcher_host.cc +++ b/chromium/content/browser/renderer_host/media/media_devices_dispatcher_host.cc @@ -12,9 +12,12 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" +#include "base/run_loop.h" #include "base/task/post_task.h" #include "base/task_runner_util.h" #include "content/browser/bad_message.h" +#include "content/browser/frame_host/back_forward_cache_impl.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/media/media_devices_permission_checker.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/browser/renderer_host/media/video_capture_manager.h" @@ -22,7 +25,6 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/media_device_id.h" -#include "content/public/browser/render_frame_host.h" #include "media/audio/audio_system.h" #include "media/base/media_switches.h" #include "media/base/video_facing.h" @@ -71,6 +73,21 @@ void MediaDevicesDispatcherHost::Create( std::make_unique<MediaDevicesDispatcherHost>( render_process_id, render_frame_id, media_stream_manager), std::move(receiver)); + + base::PostTask(FROM_HERE, {BrowserThread::UI}, + base::BindOnce( + [](int render_process_id, int render_frame_id) { + RenderFrameHost* render_frame_host = + RenderFrameHost::FromID(render_process_id, + render_frame_id); + + if (!render_frame_host) + return; + + BackForwardCache::DisableForRenderFrameHost( + render_frame_host, "MediaDevicesDispatcherHost"); + }, + render_process_id, render_frame_id)); } MediaDevicesDispatcherHost::MediaDevicesDispatcherHost( @@ -132,7 +149,7 @@ void MediaDevicesDispatcherHost::GetVideoInputCapabilities( GetVideoInputCapabilitiesCallback client_callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(media_stream_manager_->media_devices_manager() ->salt_and_origin_callback(), render_process_id_, render_frame_id_), @@ -159,7 +176,7 @@ void MediaDevicesDispatcherHost::GetAvailableVideoInputDeviceFormats( void MediaDevicesDispatcherHost::GetAudioInputCapabilities( GetAudioInputCapabilitiesCallback client_callback) { base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(media_stream_manager_->media_devices_manager() ->salt_and_origin_callback(), render_process_id_, render_frame_id_), @@ -249,6 +266,8 @@ void MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities( media_stream_manager_->media_devices_manager()->GetVideoInputFormats( device_info.device_id, true /* try_in_use_first */); capabilities->facing_mode = device_info.video_facing; + capabilities->pan_tilt_zoom_supported = + device_info.pan_tilt_zoom_supported.value_or(false); if (device_info.device_id == default_device_id) { video_input_capabilities.insert(video_input_capabilities.begin(), std::move(capabilities)); @@ -266,7 +285,7 @@ void MediaDevicesDispatcherHost::GetVideoInputDeviceFormats( GetVideoInputDeviceFormatsCallback client_callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(media_stream_manager_->media_devices_manager() ->salt_and_origin_callback(), render_process_id_, render_frame_id_), diff --git a/chromium/content/browser/renderer_host/media/media_devices_manager.cc b/chromium/content/browser/renderer_host/media/media_devices_manager.cc index 10610f0c455..c3337edfa39 100644 --- a/chromium/content/browser/renderer_host/media/media_devices_manager.cc +++ b/chromium/content/browser/renderer_host/media/media_devices_manager.cc @@ -334,8 +334,8 @@ class MediaDevicesManager::AudioServiceDeviceListener DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!mojo_audio_device_notifier_); DCHECK(!receiver_.is_bound()); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &BindDeviceNotifierFromUIThread, mojo_audio_device_notifier_.BindNewPipeAndPassReceiver())); @@ -439,7 +439,7 @@ void MediaDevicesManager::EnumerateDevices( request_video_input_capabilities ? "true" : "false")); base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(salt_and_origin_callback_, render_process_id, render_frame_id), base::BindOnce(&MediaDevicesManager::CheckPermissionsForEnumerateDevices, @@ -525,8 +525,8 @@ void MediaDevicesManager::StartMonitoring() { } #if defined(OS_MACOSX) - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&MediaDevicesManager::StartMonitoringOnUIThread, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaDevicesManager::StartMonitoringOnUIThread, base::Unretained(this))); #endif } @@ -769,8 +769,8 @@ void MediaDevicesManager::GetAudioInputCapabilities( size_t capabilities_index = enumeration_states_[state_id].audio_capabilities.size() - 1; if (use_fake_devices_) { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaDevicesManager::GotAudioInputCapabilities, weak_factory_.GetWeakPtr(), state_id, capabilities_index, @@ -1111,8 +1111,7 @@ void MediaDevicesManager::NotifyDeviceChangeSubscribers( const SubscriptionRequest& request = subscription.second; if (request.subscribe_types[type]) { base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), - FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(salt_and_origin_callback_, request.render_process_id, request.render_frame_id), base::BindOnce(&MediaDevicesManager::CheckPermissionForDeviceChange, diff --git a/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host.cc index cf2716e593b..3e43ba7ad5c 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host.cc @@ -102,8 +102,8 @@ MediaStreamDispatcherHost::GetMediaStreamDeviceObserver() { media_stream_device_observer_.set_disconnect_handler(base::BindOnce( &MediaStreamDispatcherHost::OnMediaStreamDeviceObserverConnectionError, weak_factory_.GetWeakPtr())); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&BindMediaStreamDeviceObserverReceiver, render_process_id_, render_frame_id_, std::move(dispatcher_receiver))); return media_stream_device_observer_; @@ -138,7 +138,7 @@ void MediaStreamDispatcherHost::GenerateStream( } base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(salt_and_origin_callback_, render_process_id_, render_frame_id_), base::BindOnce(&MediaStreamDispatcherHost::DoGenerateStream, @@ -159,8 +159,8 @@ void MediaStreamDispatcherHost::DoGenerateStream( salt_and_origin.origin)) { std::move(callback).Run( blink::mojom::MediaStreamRequestResult::INVALID_SECURITY_ORIGIN, - std::string(), blink::MediaStreamDevices(), - blink::MediaStreamDevices()); + std::string(), blink::MediaStreamDevices(), blink::MediaStreamDevices(), + /*pan_tilt_zoom_allowed=*/false); return; } @@ -198,7 +198,7 @@ void MediaStreamDispatcherHost::OpenDevice(int32_t page_request_id, DCHECK_CURRENTLY_ON(BrowserThread::IO); base::PostTaskAndReplyWithResult( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}).get(), FROM_HERE, + GetUIThreadTaskRunner({}).get(), FROM_HERE, base::BindOnce(salt_and_origin_callback_, render_process_id_, render_frame_id_), base::BindOnce(&MediaStreamDispatcherHost::DoOpenDevice, diff --git a/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc index beccf8a5425..d1e3cf88016 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc @@ -160,7 +160,8 @@ class MockMediaStreamDispatcherHost blink::mojom::MediaStreamRequestResult result, const std::string& label, const blink::MediaStreamDevices& audio_devices, - const blink::MediaStreamDevices& video_devices) { + const blink::MediaStreamDevices& video_devices, + bool pan_tilt_zoom_allowed) { if (result != blink::mojom::MediaStreamRequestResult::OK) { OnStreamGenerationFailed(request_id, result); return; diff --git a/chromium/content/browser/renderer_host/media/media_stream_manager.cc b/chromium/content/browser/renderer_host/media/media_stream_manager.cc index 3d4610db625..0929cab302e 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_manager.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_manager.cc @@ -19,12 +19,12 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/power_monitor/power_monitor.h" +#include "base/power_monitor/power_monitor_source.h" #include "base/rand_util.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "base/task/post_task.h" #include "base/task_runner_util.h" #include "base/threading/thread.h" #include "base/threading/thread_local.h" @@ -32,6 +32,7 @@ #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/media/capture/desktop_capture_device_uma_types.h" +#include "content/browser/media/media_devices_permission_checker.h" #include "content/browser/renderer_host/media/audio_input_device_manager.h" #include "content/browser/renderer_host/media/audio_service_listener.h" #include "content/browser/renderer_host/media/in_process_video_capture_provider.h" @@ -605,7 +606,8 @@ class MediaStreamManager::DeviceRequest { if (generate_stream_cb) { std::move(generate_stream_cb) .Run(MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN, std::string(), - MediaStreamDevices(), MediaStreamDevices()); + MediaStreamDevices(), MediaStreamDevices(), + /*pan_tilt_zoom_allowed=*/false); } if (open_device_cb) { @@ -679,8 +681,8 @@ class MediaStreamManager::DeviceRequest { // static void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::SendMessageToNativeLog, message)); return; } @@ -767,7 +769,7 @@ MediaStreamManager::MediaStreamManager( video_capture_provider = InProcessVideoCaptureProvider::CreateInstance( std::make_unique<media::VideoCaptureSystemImpl>( media::CreateVideoCaptureDeviceFactory( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}))), + GetUIThreadTaskRunner({}))), std::move(device_task_runner), base::BindRepeating(&SendVideoCaptureLogMessage)); } @@ -859,8 +861,8 @@ std::string MediaStreamManager::MakeMediaAccessRequest( // and thus can not handle a response. Using base::Unretained is safe since // MediaStreamManager is deleted on the UI thread, after the IO thread has // been stopped. - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&MediaStreamManager::SetUpRequest, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::SetUpRequest, base::Unretained(this), label)); return label; } @@ -910,8 +912,8 @@ void MediaStreamManager::GenerateStream( // and thus can not handle a response. Using base::Unretained is safe since // MediaStreamManager is deleted on the UI thread, after the IO thread has // been stopped. - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&MediaStreamManager::SetUpRequest, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::SetUpRequest, base::Unretained(this), label)); } @@ -1133,8 +1135,8 @@ void MediaStreamManager::OpenDevice(int render_process_id, // and thus can not handle a response. Using base::Unretained is safe since // MediaStreamManager is deleted on the UI thread, after the IO thread has // been stopped. - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&MediaStreamManager::SetUpRequest, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::SetUpRequest, base::Unretained(this), label)); } @@ -1333,8 +1335,6 @@ void MediaStreamManager::ReadOutputParamsAndPostRequestToUI( // Actual audio parameters are required only for // MEDIA_GUM_TAB_AUDIO_CAPTURE. - // TODO(guidou): MEDIA_GUM_TAB_AUDIO_CAPTURE should not be a special - // case. See https://crbug.com/584287. if (request->audio_type() == MediaStreamType::GUM_TAB_AUDIO_CAPTURE) { // Using base::Unretained is safe: |audio_system_| will post // PostRequestToUI() to IO thread, and MediaStreamManager is deleted on the @@ -1555,8 +1555,8 @@ bool MediaStreamManager::SetUpTabCaptureRequest(DeviceRequest* request, return false; } - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&MediaStreamManager::ResolveTabCaptureDeviceIdOnUIThread, base::Unretained(this), capture_device_id, request->requesting_process_id, @@ -1763,8 +1763,38 @@ void MediaStreamManager::FinalizeGenerateStream(const std::string& label, NOTREACHED(); } + // It is safe to bind base::Unretained(this) because MediaStreamManager is + // owned by BrowserMainLoop and so outlives the IO thread. + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&MediaDevicesPermissionChecker:: + HasPanTiltZoomPermissionGrantedOnUIThread, + request->requesting_process_id, + request->requesting_frame_id), + base::BindOnce(&MediaStreamManager::PanTiltZoomPermissionChecked, + base::Unretained(this), label, audio_devices, + video_devices)); +} + +void MediaStreamManager::PanTiltZoomPermissionChecked( + const std::string& label, + MediaStreamDevices audio_devices, + MediaStreamDevices video_devices, + bool pan_tilt_zoom_allowed) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DeviceRequest* request = FindRequest(label); + if (!request) + return; + + SendLogMessage(base::StringPrintf( + "PanTiltZoomPermissionChecked({label=%s}, {requester_id=" + "%d}, {request_type=%s}, {pan_tilt_zoom_allowed=%d})", + label.c_str(), request->requester_id, + RequestTypeToString(request->request_type()), pan_tilt_zoom_allowed)); + std::move(request->generate_stream_cb) - .Run(MediaStreamRequestResult::OK, label, audio_devices, video_devices); + .Run(MediaStreamRequestResult::OK, label, audio_devices, video_devices, + pan_tilt_zoom_allowed); } void MediaStreamManager::FinalizeRequestFailed( @@ -1781,7 +1811,7 @@ void MediaStreamManager::FinalizeRequestFailed( DCHECK(request->generate_stream_cb); std::move(request->generate_stream_cb) .Run(result, std::string(), MediaStreamDevices(), - MediaStreamDevices()); + MediaStreamDevices(), /*pan_tilt_zoom_allowed=*/false); break; } case blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY: { @@ -1804,8 +1834,8 @@ void MediaStreamManager::FinalizeRequestFailed( if (device.type == MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE) { DesktopMediaID source = DesktopMediaID::Parse(device.id); DCHECK(source.type == DesktopMediaID::TYPE_WEB_CONTENTS); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::ActivateTabOnUIThread, base::Unretained(this), source)); break; @@ -1891,8 +1921,8 @@ void MediaStreamManager::InitializeMaybeAsync( // initialization is done synchronously. Other clients call this from a // different thread and expect initialization to run asynchronously. if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&MediaStreamManager::InitializeMaybeAsync, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamManager::InitializeMaybeAsync, base::Unretained(this), std::move(video_capture_provider))); return; @@ -2068,6 +2098,14 @@ void MediaStreamManager::OnResume() { SendLogMessage(base::StringPrintf("OnResume([this=%p])", this)); } +void MediaStreamManager::OnThermalStateChange( + base::PowerObserver::DeviceThermalState new_state) { + const char* state_name = + base::PowerMonitorSource::DeviceThermalStateToString(new_state); + SendLogMessage(base::StringPrintf( + "OnThermalStateChange({this=%p}, {new_state=%s})", this, state_name)); +} + void MediaStreamManager::UseFakeUIFactoryForTests( base::RepeatingCallback<std::unique_ptr<FakeMediaStreamUIProxy>(void)> fake_ui_factory) { @@ -2510,7 +2548,8 @@ MediaStreamDevices MediaStreamManager::ConvertToMediaStreamDevices( MediaStreamDevices devices; for (const auto& info : device_infos) { devices.emplace_back(stream_type, info.device_id, info.label, - info.video_facing, info.group_id); + info.video_facing, info.group_id, + info.pan_tilt_zoom_supported); } return devices; diff --git a/chromium/content/browser/renderer_host/media/media_stream_manager.h b/chromium/content/browser/renderer_host/media/media_stream_manager.h index e0057e5727f..4468b5c9064 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_manager.h +++ b/chromium/content/browser/renderer_host/media/media_stream_manager.h @@ -90,7 +90,8 @@ class CONTENT_EXPORT MediaStreamManager base::OnceCallback<void(blink::mojom::MediaStreamRequestResult result, const std::string& label, const blink::MediaStreamDevices& audio_devices, - const blink::MediaStreamDevices& video_devices)>; + const blink::MediaStreamDevices& video_devices, + bool pan_tilt_zoom_allowed)>; using OpenDeviceCallback = base::OnceCallback<void(bool success, @@ -278,6 +279,8 @@ class CONTENT_EXPORT MediaStreamManager // base::PowerObserver overrides. void OnSuspend() override; void OnResume() override; + void OnThermalStateChange( + base::PowerObserver::DeviceThermalState new_state) override; // Called by the tests to specify a factory for creating // FakeMediaStreamUIProxys to be used for generated streams. @@ -456,6 +459,10 @@ class CONTENT_EXPORT MediaStreamManager MediaRequestState* existing_request_state) const; void FinalizeGenerateStream(const std::string& label, DeviceRequest* request); + void PanTiltZoomPermissionChecked(const std::string& label, + blink::MediaStreamDevices audio_devices, + blink::MediaStreamDevices video_devices, + bool pan_tilt_zoom_allowed); void FinalizeRequestFailed(const std::string& label, DeviceRequest* request, blink::mojom::MediaStreamRequestResult result); diff --git a/chromium/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/chromium/content/browser/renderer_host/media/media_stream_manager_unittest.cc index a6489ccad9e..53722c38ca3 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_manager_unittest.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_manager_unittest.cc @@ -325,7 +325,8 @@ class MediaStreamManagerTest : public ::testing::Test { blink::mojom::MediaStreamRequestResult result, const std::string& label, const blink::MediaStreamDevices& audio_devices, - const blink::MediaStreamDevices& video_devices) { + const blink::MediaStreamDevices& video_devices, + bool pan_tilt_zoom_allowed) { if (request_audio) { EXPECT_EQ(1u, audio_devices.size()); *audio_device = audio_devices[0]; @@ -697,7 +698,8 @@ TEST_F(MediaStreamManagerTest, GetDisplayMediaRequestCallsUIProxy) { base::BindOnce([](blink::mojom::MediaStreamRequestResult result, const std::string& label, const blink::MediaStreamDevices& audio_devices, - const blink::MediaStreamDevices& video_devices) {}); + const blink::MediaStreamDevices& video_devices, + bool pan_tilt_zoom_allowed) {}); EXPECT_CALL( *media_observer_, OnMediaRequestStateChanged( diff --git a/chromium/content/browser/renderer_host/media/media_stream_ui_proxy.cc b/chromium/content/browser/renderer_host/media/media_stream_ui_proxy.cc index 4966540938f..63d1744a77c 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_ui_proxy.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_ui_proxy.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/macros.h" -#include "base/task/post_task.h" #include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/render_frame_host_delegate.h" #include "content/browser/frame_host/render_frame_host_impl.h" @@ -183,8 +182,8 @@ void MediaStreamUIProxy::Core::ProcessAccessRequestResponse( if (host && result == blink::mojom::MediaStreamRequestResult::OK) host->OnGrantedMediaStreamAccess(); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamUIProxy::ProcessAccessRequestResponse, proxy_, filtered_devices, result)); } @@ -192,8 +191,8 @@ void MediaStreamUIProxy::Core::ProcessAccessRequestResponse( void MediaStreamUIProxy::Core::ProcessStopRequestFromUI() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamUIProxy::ProcessStopRequestFromUI, proxy_)); } @@ -201,8 +200,8 @@ void MediaStreamUIProxy::Core::ProcessChangeSourceRequestFromUI( const DesktopMediaID& media_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamUIProxy::ProcessChangeSourceRequestFromUI, proxy_, media_id)); } @@ -245,8 +244,8 @@ void MediaStreamUIProxy::RequestAccess( DCHECK_CURRENTLY_ON(BrowserThread::IO); response_callback_ = std::move(response_callback); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&Core::RequestAccess, base::Unretained(core_.get()), std::move(request))); } @@ -263,8 +262,8 @@ void MediaStreamUIProxy::OnStarted( // Owned by the PostTaskAndReply callback. gfx::NativeViewId* window_id = new gfx::NativeViewId(0); - base::PostTaskAndReply( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReply( + FROM_HERE, base::BindOnce(&Core::OnStarted, base::Unretained(core_.get()), window_id, !!source_callback_), base::BindOnce(&MediaStreamUIProxy::OnWindowId, @@ -334,8 +333,8 @@ void FakeMediaStreamUIProxy::RequestAccess( if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kUseFakeUIForMediaStream) == "deny") { // Immediately deny the request. - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &MediaStreamUIProxy::Core::ProcessAccessRequestResponse, base::Unretained(core_.get()), request->render_process_id, @@ -377,8 +376,8 @@ void FakeMediaStreamUIProxy::RequestAccess( devices_to_use.clear(); } - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamUIProxy::Core::ProcessAccessRequestResponse, base::Unretained(core_.get()), request->render_process_id, request->render_frame_id, devices_to_use, diff --git a/chromium/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/chromium/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc index d8bd747edd1..802c06f0d90 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc @@ -10,11 +10,11 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "base/test/gmock_move_support.h" #include "build/build_config.h" #include "content/browser/frame_host/render_frame_host_delegate.h" #include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/media_stream_request.h" #include "content/public/test/browser_task_environment.h" #include "content/test/test_render_frame_host.h" @@ -393,8 +393,8 @@ class MediaStreamUIProxyFeaturePolicyTest DCHECK_CURRENTLY_ON(BrowserThread::UI); base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure(); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &MediaStreamUIProxyFeaturePolicyTest::GetResultForRequestOnIOThread, base::Unretained(this), std::move(request))); @@ -453,8 +453,8 @@ class MediaStreamUIProxyFeaturePolicyTest blink::mojom::MediaStreamRequestResult result) { DCHECK_CURRENTLY_ON(BrowserThread::IO); proxy_.reset(); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaStreamUIProxyFeaturePolicyTest::FinishedGetResult, base::Unretained(this), devices, result)); } diff --git a/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.cc b/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.cc index 87c9ea24fe9..a1d323a6c63 100644 --- a/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.cc +++ b/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.cc @@ -21,6 +21,13 @@ PeerConnectionTrackerHost::PeerConnectionTrackerHost(RenderProcessHost* rph) DCHECK_CURRENTLY_ON(BrowserThread::UI); base::PowerMonitor::AddObserver(this); rph->BindReceiver(tracker_.BindNewPipeAndPassReceiver()); + // Ensure that the initial thermal state is known by the |tracker_|. + base::PowerObserver::DeviceThermalState initial_thermal_state = + base::PowerMonitor::GetCurrentThermalState(); + if (initial_thermal_state != + base::PowerObserver::DeviceThermalState::kUnknown) { + OnThermalStateChange(initial_thermal_state); + } } PeerConnectionTrackerHost::~PeerConnectionTrackerHost() { @@ -143,6 +150,12 @@ void PeerConnectionTrackerHost::OnSuspend() { tracker_->OnSuspend(); } +void PeerConnectionTrackerHost::OnThermalStateChange( + base::PowerObserver::DeviceThermalState new_state) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + tracker_->OnThermalStateChange(new_state); +} + void PeerConnectionTrackerHost::StartEventLog(int lid, int output_period_ms) { DCHECK_CURRENTLY_ON(BrowserThread::UI); tracker_->StartEventLog(lid, output_period_ms); diff --git a/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.h b/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.h index 65045c68b60..fecc08dfcd5 100644 --- a/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.h +++ b/chromium/content/browser/renderer_host/media/peer_connection_tracker_host.h @@ -36,6 +36,8 @@ class PeerConnectionTrackerHost // base::PowerObserver override. void OnSuspend() override; + void OnThermalStateChange( + base::PowerObserver::DeviceThermalState new_state) override; // These methods call out to blink::mojom::PeerConnectionManager on renderer // side. diff --git a/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc b/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc index fd591ee5428..acc14c66913 100644 --- a/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc +++ b/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc @@ -13,7 +13,6 @@ #include "base/check_op.h" #include "base/location.h" #include "base/memory/weak_ptr.h" -#include "base/task/post_task.h" #include "base/trace_event/trace_event.h" #include "base/unguessable_token.h" #include "content/browser/media/audio_stream_broker.h" @@ -91,8 +90,8 @@ void GetSaltOriginAndPermissionsOnUIThread( auto salt_and_origin = GetMediaDeviceSaltAndOrigin(process_id, frame_id); bool access = MediaDevicesPermissionChecker().CheckPermissionOnUIThread( blink::MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, process_id, frame_id); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(cb), std::move(salt_and_origin), access)); } @@ -169,8 +168,8 @@ RenderFrameAudioInputStreamFactory::~RenderFrameAudioInputStreamFactory() { // as it doesn't post in case it is already executed on the right thread. That // causes issues in unit tests where the UI thread and the IO thread are the // same. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce([](std::unique_ptr<Core>) {}, std::move(core_))); } @@ -198,8 +197,8 @@ RenderFrameAudioInputStreamFactory::Core::Core( // Unretained is safe since the destruction of |this| is posted to the IO // thread. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&Core::Init, base::Unretained(this), std::move(receiver))); } @@ -244,8 +243,8 @@ void RenderFrameAudioInputStreamFactory::Core::CreateStream( // TODO(qiangchen): Analyze audio constraints to make a duplicating or // diverting decision. It would give web developer more flexibility. - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&GetLoopbackSourceOnUIThread, capture_id.render_process_id, capture_id.main_render_frame_id), @@ -294,8 +293,8 @@ void RenderFrameAudioInputStreamFactory::Core::AssociateInputAndOutputForAec( if (!IsValidDeviceId(output_device_id)) return; - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &GetSaltOriginAndPermissionsOnUIThread, process_id_, frame_id_, base::BindOnce( diff --git a/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc b/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc index 115a2967682..e62a47e5b25 100644 --- a/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc +++ b/chromium/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc @@ -11,7 +11,6 @@ #include "base/bind_helpers.h" #include "base/macros.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/media/forwarding_audio_stream_factory.h" #include "content/browser/renderer_host/media/audio_input_device_manager.h" @@ -61,9 +60,9 @@ class MAYBE_RenderFrameAudioInputStreamFactoryTest audio_manager_(std::make_unique<media::TestAudioThread>(), &log_factory_), audio_system_(media::AudioSystemImpl::CreateInstance()), - media_stream_manager_(std::make_unique<MediaStreamManager>( - audio_system_.get(), - base::CreateSingleThreadTaskRunner({BrowserThread::UI}))) {} + media_stream_manager_( + std::make_unique<MediaStreamManager>(audio_system_.get(), + GetUIThreadTaskRunner({}))) {} ~MAYBE_RenderFrameAudioInputStreamFactoryTest() override {} diff --git a/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc b/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc index 6c2363b02ef..5f2a7fc6859 100644 --- a/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc +++ b/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory.cc @@ -16,7 +16,6 @@ #include "base/location.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "base/task/post_task.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "base/unguessable_token.h" @@ -170,8 +169,8 @@ RenderFrameAudioOutputStreamFactory::~RenderFrameAudioOutputStreamFactory() { // as it doesn't post in case it is already executed on the right thread. That // causes issues in unit tests where the UI thread and the IO thread are the // same. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce([](std::unique_ptr<Core>) {}, std::move(core_))); } @@ -204,8 +203,8 @@ RenderFrameAudioOutputStreamFactory::Core::Core( // Unretained is safe since the destruction of |this| is posted to the IO // thread. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&Core::Init, base::Unretained(this), std::move(receiver))); } diff --git a/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc b/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc index 1950b393af9..dbe40d2e00a 100644 --- a/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc +++ b/chromium/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc @@ -12,7 +12,6 @@ #include "base/bind_helpers.h" #include "base/macros.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "base/test/mock_callback.h" #include "base/test/task_environment.h" #include "base/unguessable_token.h" @@ -53,9 +52,9 @@ class RenderFrameAudioOutputStreamFactoryTest : audio_manager_(std::make_unique<media::TestAudioThread>(), &log_factory_), audio_system_(media::AudioSystemImpl::CreateInstance()), - media_stream_manager_(std::make_unique<MediaStreamManager>( - audio_system_.get(), - base::CreateSingleThreadTaskRunner({BrowserThread::UI}))) {} + media_stream_manager_( + std::make_unique<MediaStreamManager>(audio_system_.get(), + GetUIThreadTaskRunner({}))) {} ~RenderFrameAudioOutputStreamFactoryTest() override {} diff --git a/chromium/content/browser/renderer_host/media/service_video_capture_device_launcher.cc b/chromium/content/browser/renderer_host/media/service_video_capture_device_launcher.cc index 9d85f8cbd22..b953c5d85c4 100644 --- a/chromium/content/browser/renderer_host/media/service_video_capture_device_launcher.cc +++ b/chromium/content/browser/renderer_host/media/service_video_capture_device_launcher.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" -#include "base/task/post_task.h" #include "content/browser/renderer_host/media/service_launched_video_capture_device.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -117,8 +116,7 @@ void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAsync( auto receiver_adapter = std::make_unique<video_capture::ReceiverMediaToMojoAdapter>( std::make_unique<media::VideoFrameReceiverOnTaskRunner>( - std::move(receiver), - base::CreateSingleThreadTaskRunner({BrowserThread::IO}))); + std::move(receiver), GetIOThreadTaskRunner({}))); mojo::PendingRemote<video_capture::mojom::VideoFrameHandler> pending_remote_proxy; mojo::MakeSelfOwnedReceiver( diff --git a/chromium/content/browser/renderer_host/media/service_video_capture_provider.cc b/chromium/content/browser/renderer_host/media/service_video_capture_provider.cc index e3f8cea24ec..38164896644 100644 --- a/chromium/content/browser/renderer_host/media/service_video_capture_provider.cc +++ b/chromium/content/browser/renderer_host/media/service_video_capture_provider.cc @@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/renderer_host/media/service_video_capture_device_launcher.h" #include "content/browser/renderer_host/media/virtual_video_capture_devices_changed_observer.h" @@ -59,8 +58,7 @@ class ServiceVideoCaptureProvider::ServiceProcessObserver public: ServiceProcessObserver(base::RepeatingClosure start_callback, base::RepeatingClosure stop_callback) - : io_task_runner_( - base::CreateSingleThreadTaskRunner({BrowserThread::IO})), + : io_task_runner_(GetIOThreadTaskRunner({})), start_callback_(std::move(start_callback)), stop_callback_(std::move(stop_callback)) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -117,18 +115,17 @@ ServiceVideoCaptureProvider::ServiceVideoCaptureProvider( #endif // defined(OS_CHROMEOS) if (features::IsVideoCaptureServiceEnabledForOutOfProcess()) { service_process_observer_.emplace( - base::CreateSingleThreadTaskRunner({BrowserThread::UI}), + GetUIThreadTaskRunner({}), base::BindRepeating(&ServiceVideoCaptureProvider::OnServiceStarted, weak_ptr_factory_.GetWeakPtr()), base::BindRepeating(&ServiceVideoCaptureProvider::OnServiceStopped, weak_ptr_factory_.GetWeakPtr())); } else if (features::IsVideoCaptureServiceEnabledForBrowserProcess()) { // Connect immediately and permanently when the service runs in-process. - base::CreateSingleThreadTaskRunner({BrowserThread::IO}) - ->PostTask( - FROM_HERE, - base::BindOnce(&ServiceVideoCaptureProvider::OnServiceStarted, - weak_ptr_factory_.GetWeakPtr())); + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, + base::BindOnce(&ServiceVideoCaptureProvider::OnServiceStarted, + weak_ptr_factory_.GetWeakPtr())); } } @@ -216,7 +213,7 @@ ServiceVideoCaptureProvider::LazyConnectToService() { launcher_has_connected_to_source_provider_ = false; time_of_last_connect_ = base::TimeTicks::Now(); - auto ui_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::UI}); + auto ui_task_runner = GetUIThreadTaskRunner({}); #if defined(OS_CHROMEOS) mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> accelerator_factory; diff --git a/chromium/content/browser/renderer_host/media/video_capture_browsertest.cc b/chromium/content/browser/renderer_host/media/video_capture_browsertest.cc index f0373bbb0b4..a5039b99ae7 100644 --- a/chromium/content/browser/renderer_host/media/video_capture_browsertest.cc +++ b/chromium/content/browser/renderer_host/media/video_capture_browsertest.cc @@ -6,7 +6,6 @@ #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/browser_main_loop.h" @@ -254,8 +253,8 @@ IN_PROC_BROWSER_TEST_P(VideoCaptureBrowserTest, StartAndImmediatelyStop) { base::BindOnce(&VideoCaptureBrowserTest::TearDownCaptureDeviceOnIOThread, base::Unretained(this), std::move(quit_run_loop_on_current_thread_cb), true); - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &VideoCaptureBrowserTest::SetUpAndStartCaptureDeviceOnIOThread, base::Unretained(this), std::move(after_start_continuation))); @@ -338,8 +337,8 @@ IN_PROC_BROWSER_TEST_P(VideoCaptureBrowserTest, } })); - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( &VideoCaptureBrowserTest::SetUpAndStartCaptureDeviceOnIOThread, base::Unretained(this), base::DoNothing::Once())); diff --git a/chromium/content/browser/renderer_host/media/video_capture_controller.cc b/chromium/content/browser/renderer_host/media/video_capture_controller.cc index 8a3f1c3be3d..09afd022035 100644 --- a/chromium/content/browser/renderer_host/media/video_capture_controller.cc +++ b/chromium/content/browser/renderer_host/media/video_capture_controller.cc @@ -548,11 +548,8 @@ void VideoCaptureController::OnFrameReadyInBuffer( frame_info->coded_size.height()); double frame_rate = 0.0f; if (video_capture_format_) { - media::VideoFrameMetadata metadata; - metadata.MergeInternalValuesFrom(frame_info->metadata); - if (!metadata.GetDouble(VideoFrameMetadata::FRAME_RATE, &frame_rate)) { - frame_rate = video_capture_format_->frame_rate; - } + frame_rate = frame_info->metadata.frame_rate.value_or( + video_capture_format_->frame_rate); } UMA_HISTOGRAM_COUNTS_1M("Media.VideoCapture.FrameRate", frame_rate); UMA_HISTOGRAM_TIMES("Media.VideoCapture.DelayUntilFirstFrame", @@ -709,6 +706,10 @@ void VideoCaptureController::ReleaseDeviceAsync(base::OnceClosure done_cb) { device_launcher_->AbortLaunch(); return; } + // |buffer_contexts_| contain references to |launched_device_| as observers. + // Clear those observer references prior to resetting |launced_device_|. + for (auto& entry : buffer_contexts_) + entry.set_consumer_feedback_observer(nullptr); launched_device_.reset(); } diff --git a/chromium/content/browser/renderer_host/media/video_capture_controller_unittest.cc b/chromium/content/browser/renderer_host/media/video_capture_controller_unittest.cc index c4db5b9877f..2a487b37a22 100644 --- a/chromium/content/browser/renderer_host/media/video_capture_controller_unittest.cc +++ b/chromium/content/browser/renderer_host/media/video_capture_controller_unittest.cc @@ -19,7 +19,6 @@ #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/task/post_task.h" #include "base/test/bind_test_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/threading/thread_task_runner_handle.h" @@ -109,11 +108,7 @@ class MockVideoCaptureControllerEventHandler const media::mojom::VideoFrameInfoPtr& frame_info) override { EXPECT_EQ(expected_pixel_format_, frame_info->pixel_format); EXPECT_EQ(expected_color_space_, frame_info->color_space); - media::VideoFrameMetadata metadata; - metadata.MergeInternalValuesFrom(frame_info->metadata); - base::TimeTicks reference_time; - EXPECT_TRUE(metadata.GetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME, - &reference_time)); + EXPECT_TRUE(frame_info->metadata.reference_time.has_value()); DoBufferReady(id, frame_info->coded_size); if (enable_auto_return_buffer_on_buffer_ready_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -188,15 +183,13 @@ class VideoCaptureControllerTest device_client_.reset(new media::VideoCaptureDeviceClient( media::VideoCaptureBufferType::kSharedMemory, std::make_unique<media::VideoFrameReceiverOnTaskRunner>( - controller_->GetWeakPtrForIOThread(), - base::CreateSingleThreadTaskRunner({BrowserThread::IO})), + controller_->GetWeakPtrForIOThread(), GetIOThreadTaskRunner({})), buffer_pool_, media::VideoCaptureJpegDecoderFactoryCB())); #else device_client_.reset(new media::VideoCaptureDeviceClient( media::VideoCaptureBufferType::kSharedMemory, std::make_unique<media::VideoFrameReceiverOnTaskRunner>( - controller_->GetWeakPtrForIOThread(), - base::CreateSingleThreadTaskRunner({BrowserThread::IO})), + controller_->GetWeakPtrForIOThread(), GetIOThreadTaskRunner({})), buffer_pool_)); #endif // defined(OS_CHROMEOS) } diff --git a/chromium/content/browser/renderer_host/media/video_capture_host.cc b/chromium/content/browser/renderer_host/media/video_capture_host.cc index c726b06c722..a5b883c7eef 100644 --- a/chromium/content/browser/renderer_host/media/video_capture_host.cc +++ b/chromium/content/browser/renderer_host/media/video_capture_host.cc @@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/task/post_task.h" #include "content/browser/browser_main_loop.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/browser/renderer_host/media/video_capture_manager.h" @@ -103,16 +102,16 @@ VideoCaptureHost::~VideoCaptureHost() { } NotifyAllStreamsRemoved(); - base::DeleteSoon(FROM_HERE, {BrowserThread::UI}, - render_process_host_delegate_.release()); + GetUIThreadTaskRunner({})->DeleteSoon( + FROM_HERE, render_process_host_delegate_.release()); } void VideoCaptureHost::OnError(const VideoCaptureControllerID& controller_id, media::VideoCaptureError error) { DVLOG(1) << __func__; DCHECK_CURRENTLY_ON(BrowserThread::IO); - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&VideoCaptureHost::DoError, weak_factory_.GetWeakPtr(), controller_id, error)); } @@ -160,8 +159,8 @@ void VideoCaptureHost::OnBufferReady( void VideoCaptureHost::OnEnded(const VideoCaptureControllerID& controller_id) { DVLOG(1) << __func__; DCHECK_CURRENTLY_ON(BrowserThread::IO); - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&VideoCaptureHost::DoEnded, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&VideoCaptureHost::DoEnded, weak_factory_.GetWeakPtr(), controller_id)); } @@ -434,8 +433,8 @@ void VideoCaptureHost::NotifyStreamAdded() { ++number_of_active_streams_; // base::Unretained() usage is safe because |render_process_host_delegate_| // is destroyed on UI thread. - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&RenderProcessHostDelegate::NotifyStreamAdded, base::Unretained(render_process_host_delegate_.get()))); } @@ -451,8 +450,8 @@ void VideoCaptureHost::NotifyStreamRemoved() { --number_of_active_streams_; // base::Unretained() usage is safe because |render_process_host_delegate_| is // destroyed on UI thread. - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&RenderProcessHostDelegate::NotifyStreamRemoved, base::Unretained(render_process_host_delegate_.get()))); } |