From 7b8fd7a2b61866970bb05ed9a31728186d662d32 Mon Sep 17 00:00:00 2001 From: xurui Date: Tue, 18 Jun 2024 21:07:18 +0800 Subject: [PATCH] =?UTF-8?q?fixed=20967c482=20from=20https://gitee.com/clea?= =?UTF-8?q?r=5Faddr/chromium=5Fsrc/pulls/1107=20=E4=BF=AE=E5=A4=8DCVE-2024?= =?UTF-8?q?-5496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xurui --- .../media/session/media_session_impl.cc | 4 ++ .../media/session/media_session_impl.h | 6 ++ .../session/media_session_service_impl.cc | 60 ++++++++++--------- .../session/media_session_service_impl.h | 2 + 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index 6af9bda41f..b691fc78bc 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc @@ -1664,6 +1664,10 @@ const base::UnguessableToken& MediaSessionImpl::GetRequestId() const { return delegate_->request_id(); } +base::WeakPtr MediaSessionImpl::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + void MediaSessionImpl::RebuildAndNotifyActionsChanged() { std::set actions = routed_service_ ? routed_service_->actions() diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h index cb066ccab8..12f77cee7c 100644 --- a/content/browser/media/session/media_session_impl.h +++ b/content/browser/media/session/media_session_impl.h @@ -16,6 +16,7 @@ #include "base/containers/id_map.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/weak_ptr.h" #include "base/timer/timer.h" #include "build/build_config.h" #include "content/browser/media/session/audio_focus_delegate.h" @@ -348,6 +349,9 @@ class MediaSessionImpl : public MediaSession, // Returns the Audio Focus request ID associated with this media session. const base::UnguessableToken& GetRequestId() const; + // Returns a WeakPtr to `this`. + base::WeakPtr GetWeakPtr(); + CONTENT_EXPORT bool HasImageCacheForTest(const GURL& image_url) const; #if defined(OHOS_MEDIA_POLICY) @@ -639,6 +643,8 @@ class MediaSessionImpl : public MediaSession, media_session::mojom::RemotePlaybackMetadataPtr remote_playback_metadata_; + base::WeakPtrFactory weak_factory_{this}; + WEB_CONTENTS_USER_DATA_KEY_DECL(); }; diff --git a/content/browser/media/session/media_session_service_impl.cc b/content/browser/media/session/media_session_service_impl.cc index 92230f7429..863dd9d9cb 100644 --- a/content/browser/media/session/media_session_service_impl.cc +++ b/content/browser/media/session/media_session_service_impl.cc @@ -22,14 +22,16 @@ MediaSessionServiceImpl::MediaSessionServiceImpl( : render_frame_host_id_(render_frame_host->GetGlobalId()), playback_state_(blink::mojom::MediaSessionPlaybackState::NONE) { MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnServiceCreated(this); + if (session) { + media_session_ = session->GetWeakPtr(); + media_session_->OnServiceCreated(this); + } } MediaSessionServiceImpl::~MediaSessionServiceImpl() { - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnServiceDestroyed(this); + if (media_session_) { + media_session_->OnServiceDestroyed(this); + } } // static @@ -70,17 +72,17 @@ void MediaSessionServiceImpl::SetClient( void MediaSessionServiceImpl::SetPlaybackState( blink::mojom::MediaSessionPlaybackState state) { playback_state_ = state; - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionPlaybackStateChanged(this); + if (media_session_) { + media_session_->OnMediaSessionPlaybackStateChanged(this); + } } void MediaSessionServiceImpl::SetPositionState( const absl::optional& position) { position_ = position; - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->RebuildAndNotifyMediaPositionChanged(); + if (media_session_) { + media_session_->RebuildAndNotifyMediaPositionChanged(); + } } void MediaSessionServiceImpl::SetMetadata( @@ -102,48 +104,48 @@ void MediaSessionServiceImpl::SetMetadata( metadata_ = std::move(metadata); } - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionMetadataChanged(this); + if (media_session_) { + media_session_->OnMediaSessionMetadataChanged(this); + } } void MediaSessionServiceImpl::SetMicrophoneState( media_session::mojom::MicrophoneState microphone_state) { microphone_state_ = microphone_state; - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionInfoChanged(this); + if (media_session_) { + media_session_->OnMediaSessionInfoChanged(this); + } } void MediaSessionServiceImpl::SetCameraState( media_session::mojom::CameraState camera_state) { camera_state_ = camera_state; - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionInfoChanged(this); + if (media_session_) { + media_session_->OnMediaSessionInfoChanged(this); + } } void MediaSessionServiceImpl::EnableAction( media_session::mojom::MediaSessionAction action) { actions_.insert(action); - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionActionsChanged(this); + if (media_session_) { + media_session_->OnMediaSessionActionsChanged(this); + } } void MediaSessionServiceImpl::DisableAction( media_session::mojom::MediaSessionAction action) { actions_.erase(action); - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionActionsChanged(this); + if (media_session_) { + media_session_->OnMediaSessionActionsChanged(this); + } } void MediaSessionServiceImpl::ClearActions() { actions_.clear(); - MediaSessionImpl* session = GetMediaSession(); - if (session) - session->OnMediaSessionActionsChanged(this); + if (media_session_) { + media_session_->OnMediaSessionActionsChanged(this); + } } MediaSessionImpl* MediaSessionServiceImpl::GetMediaSession() { diff --git a/content/browser/media/session/media_session_service_impl.h b/content/browser/media/session/media_session_service_impl.h index aae5d94e59..e2bfcdd200 100644 --- a/content/browser/media/session/media_session_service_impl.h +++ b/content/browser/media/session/media_session_service_impl.h @@ -85,6 +85,8 @@ class CONTENT_EXPORT MediaSessionServiceImpl const GlobalRenderFrameHostId render_frame_host_id_; + base::WeakPtr media_session_; + mojo::Remote client_; blink::mojom::MediaSessionPlaybackState playback_state_; blink::mojom::SpecMediaMetadataPtr metadata_; -- Gitee