Commit d3b96ebe authored by Noah Rose Ledesma's avatar Noah Rose Ledesma Committed by Commit Bot

Do not notify MediaSessionControllersManager after MediaWebContentsObserver dies

Fix a crash caused by posting a callback to the UI thread with a pointer
to a member variable without checking that the originating object is still
alive.

Bug: 1115364
Change-Id: Idf1594e8072d6269d3a0d2e04c17a583400e71c0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2353396Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Commit-Queue: Noah Rose Ledesma <noahrose@google.com>
Cr-Commit-Position: refs/heads/master@{#798288}
parent bcb7dfde
...@@ -43,6 +43,21 @@ static void SuspendAllMediaPlayersInRenderFrame( ...@@ -43,6 +43,21 @@ static void SuspendAllMediaPlayersInRenderFrame(
} }
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
static void OnAudioOutputDeviceIdTranslated(
base::WeakPtr<MediaWebContentsObserver> observer,
RenderFrameHost* render_frame_host,
int delegate_id,
const base::Optional<std::string>& raw_device_id) {
if (!raw_device_id)
return;
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(&MediaWebContentsObserver::OnReceivedTranslatedDeviceId,
std::move(observer), render_frame_host, delegate_id,
raw_device_id.value()));
}
} // anonymous namespace } // anonymous namespace
// Maintains state for a single player. Issues WebContents and power-related // Maintains state for a single player. Issues WebContents and power-related
...@@ -402,7 +417,7 @@ void MediaWebContentsObserver::OnAudioOutputSinkChanged( ...@@ -402,7 +417,7 @@ void MediaWebContentsObserver::OnAudioOutputSinkChanged(
}, },
salt_and_origin.device_id_salt, std::move(salt_and_origin.origin), salt_and_origin.device_id_salt, std::move(salt_and_origin.origin),
hashed_device_id, hashed_device_id,
base::BindOnce(&MediaWebContentsObserver::OnAudioOutputDeviceIdTranslated, base::BindOnce(&OnAudioOutputDeviceIdTranslated,
weak_ptr_factory_.GetWeakPtr(), render_frame_host, weak_ptr_factory_.GetWeakPtr(), render_frame_host,
delegate_id)); delegate_id));
...@@ -410,25 +425,12 @@ void MediaWebContentsObserver::OnAudioOutputSinkChanged( ...@@ -410,25 +425,12 @@ void MediaWebContentsObserver::OnAudioOutputSinkChanged(
FROM_HERE, std::move(callback_on_io_thread)); FROM_HERE, std::move(callback_on_io_thread));
} }
void MediaWebContentsObserver::OnAudioOutputDeviceIdTranslated( void MediaWebContentsObserver::OnReceivedTranslatedDeviceId(
RenderFrameHost* render_frame_host, RenderFrameHost* render_frame_host,
int delegate_id, int delegate_id,
const base::Optional<std::string>& raw_device_id) { const std::string& raw_device_id) {
if (!raw_device_id.has_value()) session_controllers_manager_.OnAudioOutputSinkChanged(
return; MediaPlayerId(render_frame_host, delegate_id), raw_device_id);
auto callback_on_ui_thread = base::BindOnce(
[](MediaSessionControllersManager* controllers_manager,
RenderFrameHost* render_frame_host, int delegate_id,
const std::string& raw_device_id) {
controllers_manager->OnAudioOutputSinkChanged(
MediaPlayerId(render_frame_host, delegate_id), raw_device_id);
},
session_controllers_manager(), render_frame_host, delegate_id,
raw_device_id.value());
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, std::move(callback_on_ui_thread));
} }
void MediaWebContentsObserver::OnBufferUnderflow( void MediaWebContentsObserver::OnBufferUnderflow(
......
...@@ -99,6 +99,10 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { ...@@ -99,6 +99,10 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver {
audible_metrics_ = audible_metrics; audible_metrics_ = audible_metrics;
} }
void OnReceivedTranslatedDeviceId(RenderFrameHost* render_frame_host,
int delegate_id,
const std::string& raw_device_id);
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Called by the WebContents when a tab has been closed but may still be // Called by the WebContents when a tab has been closed but may still be
// available for "undo" -- indicates that all media players (even audio only // available for "undo" -- indicates that all media players (even audio only
...@@ -152,10 +156,6 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { ...@@ -152,10 +156,6 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver {
void OnAudioOutputSinkChanged(RenderFrameHost* render_frame_host, void OnAudioOutputSinkChanged(RenderFrameHost* render_frame_host,
int delegate_id, int delegate_id,
std::string hashed_device_id); std::string hashed_device_id);
void OnAudioOutputDeviceIdTranslated(
RenderFrameHost* render_frame_host,
int delegate_id,
const base::Optional<std::string>& raw_device_id);
void OnBufferUnderflow(RenderFrameHost* render_frame_host, int delegate_id); void OnBufferUnderflow(RenderFrameHost* render_frame_host, int delegate_id);
device::mojom::WakeLock* GetAudioWakeLock(); device::mojom::WakeLock* GetAudioWakeLock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment