diff --git a/ash/ambient/ui/media_string_view.cc b/ash/ambient/ui/media_string_view.cc index c0d40882516e5b..4a87052ec61032 100644 --- a/ash/ambient/ui/media_string_view.cc +++ b/ash/ambient/ui/media_string_view.cc @@ -17,8 +17,8 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "components/prefs/pref_service.h" -#include "services/media_session/public/cpp/media_session_service.h" #include "services/media_session/public/mojom/media_session.mojom.h" +#include "services/media_session/public/mojom/media_session_service.mojom.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/compositor/layer.h" #include "ui/compositor/paint_recorder.h" @@ -242,7 +242,7 @@ void MediaStringView::InitLayout() { } void MediaStringView::BindMediaControllerObserver() { - media_session::MediaSessionService* service = + media_session::mojom::MediaSessionService* service = Shell::Get()->shell_delegate()->GetMediaSessionService(); // Service might be unavailable under some test environments. if (!service) diff --git a/ash/login/ui/lock_screen_media_controls_view.cc b/ash/login/ui/lock_screen_media_controls_view.cc index d377f0981cc14c..5a499d872b370d 100644 --- a/ash/login/ui/lock_screen_media_controls_view.cc +++ b/ash/login/ui/lock_screen_media_controls_view.cc @@ -396,7 +396,7 @@ LockScreenMediaControlsView::LockScreenMediaControlsView( SetArtwork(base::nullopt); // |service| can be null in tests. - media_session::MediaSessionService* service = + media_session::mojom::MediaSessionService* service = Shell::Get()->shell_delegate()->GetMediaSessionService(); if (!service) return; diff --git a/ash/media/media_controller_impl.cc b/ash/media/media_controller_impl.cc index ae323a42be7ebe..fe8a670b91964b 100644 --- a/ash/media/media_controller_impl.cc +++ b/ash/media/media_controller_impl.cc @@ -361,7 +361,7 @@ MediaControllerImpl::GetMediaSessionController() { if (!Shell::HasInstance()) return nullptr; - media_session::MediaSessionService* service = + media_session::mojom::MediaSessionService* service = Shell::Get()->shell_delegate()->GetMediaSessionService(); if (!service) return nullptr; diff --git a/ash/media/media_notification_controller_impl.cc b/ash/media/media_notification_controller_impl.cc index 64d759e9985b79..5e5c0c55c0e91b 100644 --- a/ash/media/media_notification_controller_impl.cc +++ b/ash/media/media_notification_controller_impl.cc @@ -108,7 +108,7 @@ MediaNotificationControllerImpl::MediaNotificationControllerImpl() } // May be null in tests. - media_session::MediaSessionService* service = + media_session::mojom::MediaSessionService* service = Shell::Get()->shell_delegate()->GetMediaSessionService(); if (!service) return; diff --git a/ash/shell_delegate.cc b/ash/shell_delegate.cc index 930023f51dc389..14d6a022036e1c 100644 --- a/ash/shell_delegate.cc +++ b/ash/shell_delegate.cc @@ -24,7 +24,8 @@ aura::Window* ShellDelegate::CreateBrowserForTabDrop( return nullptr; } -media_session::MediaSessionService* ShellDelegate::GetMediaSessionService() { +media_session::mojom::MediaSessionService* +ShellDelegate::GetMediaSessionService() { return nullptr; } diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h index 292e19cf558f30..84054219f4e1f1 100644 --- a/ash/shell_delegate.h +++ b/ash/shell_delegate.h @@ -15,7 +15,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/device/public/mojom/bluetooth_system.mojom-forward.h" #include "services/device/public/mojom/fingerprint.mojom-forward.h" -#include "services/media_session/public/cpp/media_session_service.h" +#include "services/media_session/public/mojom/media_session_service.mojom-forward.h" #include "ui/gfx/native_widget_types.h" namespace aura { @@ -104,7 +104,7 @@ class ASH_EXPORT ShellDelegate { // Returns an interface to the Media Session service, or null if not // available. - virtual media_session::MediaSessionService* GetMediaSessionService(); + virtual media_session::mojom::MediaSessionService* GetMediaSessionService(); virtual void OpenKeyboardShortcutHelpPage() const {} }; diff --git a/ash/system/media/unified_media_controls_controller.cc b/ash/system/media/unified_media_controls_controller.cc index caf361a9b3fb7f..507cc804fd34da 100644 --- a/ash/system/media/unified_media_controls_controller.cc +++ b/ash/system/media/unified_media_controls_controller.cc @@ -34,7 +34,7 @@ constexpr base::TimeDelta kHideArtworkDelay = UnifiedMediaControlsController::UnifiedMediaControlsController( Delegate* delegate) : delegate_(delegate) { - media_session::MediaSessionService* service = + media_session::mojom::MediaSessionService* service = Shell::Get()->shell_delegate()->GetMediaSessionService(); // Happens in test. if (!service) diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc index bcd4aee9a0d229..84d1c742f7a345 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.cc +++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc @@ -180,7 +180,7 @@ void ChromeShellDelegate::BindMultiDeviceSetup( service->BindMultiDeviceSetup(std::move(receiver)); } -media_session::MediaSessionService* +media_session::mojom::MediaSessionService* ChromeShellDelegate::GetMediaSessionService() { return &content::GetMediaSessionService(); } diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h index 73613eca4926b6..348c94ceb5093e 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.h +++ b/chrome/browser/ui/ash/chrome_shell_delegate.h @@ -42,7 +42,7 @@ class ChromeShellDelegate : public ash::ShellDelegate { mojo::PendingReceiver< chromeos::multidevice_setup::mojom::MultiDeviceSetup> receiver) override; - media_session::MediaSessionService* GetMediaSessionService() override; + media_session::mojom::MediaSessionService* GetMediaSessionService() override; std::unique_ptr CreateNearbyShareDelegate( ash::NearbyShareController* controller) const override; diff --git a/content/browser/media/session/media_session_impl_unittest.cc b/content/browser/media/session/media_session_impl_unittest.cc index 7f6ef30181fb6a..15573c26f08ea8 100644 --- a/content/browser/media/session/media_session_impl_unittest.cc +++ b/content/browser/media/session/media_session_impl_unittest.cc @@ -203,6 +203,9 @@ TEST_F(MediaSessionImplTest, SessionInfoState) { MockMediaSessionMojoObserver observer(*GetMediaSession()); GetMediaSession()->StartDucking(); observer.WaitForState(MediaSessionInfo::SessionState::kDucking); + + EXPECT_TRUE(observer.session_info().Equals( + media_session::test::GetMediaSessionInfoSync(GetMediaSession()))); } { diff --git a/content/browser/media_session/media_session_service.cc b/content/browser/media_session/media_session_service.cc index 6896ed9897c4eb..4d683e6bb1ec9e 100644 --- a/content/browser/media_session/media_session_service.cc +++ b/content/browser/media_session/media_session_service.cc @@ -9,16 +9,36 @@ #include "base/threading/sequence_local_storage_slot.h" #include "content/public/browser/browser_thread.h" #include "mojo/public/cpp/bindings/remote.h" -#include "services/media_session/media_session_service_impl.h" +#include "services/media_session/media_session_service.h" #include "services/media_session/public/cpp/features.h" namespace content { -media_session::MediaSessionService& GetMediaSessionService() { +media_session::mojom::MediaSessionService& GetMediaSessionService() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - static base::NoDestructor service; - return *service; + // NOTE: We use sequence-local storage here strictly to limit the lifetime of + // this Remote to that of the UI-thread sequence. This ensures that it doesn't + // persist when the task environment is torn down and reinitialized e.g. + // between unit tests. + static base::NoDestructor>> + remote_slot; + auto& remote = remote_slot->GetOrCreateValue(); + if (!remote) { + if (base::FeatureList::IsEnabled( + media_session::features::kMediaSessionService)) { + static base::NoDestructor< + std::unique_ptr> + service; + *service = std::make_unique( + remote.BindNewPipeAndPassReceiver()); + } else { + // If the service is not enabled, bind to a disconnected pipe. + ignore_result(remote.BindNewPipeAndPassReceiver()); + } + } + return *remote.get(); } } // namespace content diff --git a/content/public/browser/media_session_service.h b/content/public/browser/media_session_service.h index 15e7d34a84f712..75ddff3837814d 100644 --- a/content/public/browser/media_session_service.h +++ b/content/public/browser/media_session_service.h @@ -6,13 +6,14 @@ #define CONTENT_PUBLIC_BROWSER_MEDIA_SESSION_SERVICE_H_ #include "content/common/content_export.h" -#include "services/media_session/public/cpp/media_session_service.h" +#include "services/media_session/public/mojom/media_session_service.mojom.h" namespace content { // Returns the main control interface into the Media Session Service which runs // in the browser process. -CONTENT_EXPORT media_session::MediaSessionService& GetMediaSessionService(); +CONTENT_EXPORT media_session::mojom::MediaSessionService& +GetMediaSessionService(); } // namespace content diff --git a/services/media_session/BUILD.gn b/services/media_session/BUILD.gn index 9ee525f224f47e..a2aa38213d3eef 100644 --- a/services/media_session/BUILD.gn +++ b/services/media_session/BUILD.gn @@ -15,8 +15,8 @@ source_set("lib") { "audio_focus_request.h", "media_controller.cc", "media_controller.h", - "media_session_service_impl.cc", - "media_session_service_impl.h", + "media_session_service.cc", + "media_session_service.h", ] configs += [ "//build/config/compiler:wexit_time_destructors" ] @@ -36,7 +36,7 @@ source_set("tests") { sources = [ "audio_focus_manager_unittest.cc", "media_controller_unittest.cc", - "media_session_service_impl_unittest.cc", + "media_session_service_unittest.cc", ] deps = [ diff --git a/services/media_session/audio_focus_manager_unittest.cc b/services/media_session/audio_focus_manager_unittest.cc index 4aa4125493e8fa..d2cc3173a11b64 100644 --- a/services/media_session/audio_focus_manager_unittest.cc +++ b/services/media_session/audio_focus_manager_unittest.cc @@ -17,11 +17,12 @@ #include "build/chromeos_buildflags.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/media_session/audio_focus_request.h" -#include "services/media_session/media_session_service_impl.h" +#include "services/media_session/media_session_service.h" #include "services/media_session/public/cpp/test/audio_focus_test_util.h" #include "services/media_session/public/cpp/test/mock_media_session.h" #include "services/media_session/public/mojom/audio_focus.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" +#include "services/media_session/public/mojom/media_session_service.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace media_session { @@ -47,12 +48,13 @@ class AudioFocusManagerTest base::PowerMonitor::Initialize(std::move(power_source)); // Create an instance of the MediaSessionService. - service_ = std::make_unique(); - service_->BindAudioFocusManager( + service_ = std::make_unique( + service_remote_.BindNewPipeAndPassReceiver()); + service_remote_->BindAudioFocusManager( audio_focus_remote_.BindNewPipeAndPassReceiver()); - service_->BindAudioFocusManagerDebug( + service_remote_->BindAudioFocusManagerDebug( audio_focus_debug_remote_.BindNewPipeAndPassReceiver()); - service_->BindMediaControllerManager( + service_remote_->BindMediaControllerManager( controller_manager_remote_.BindNewPipeAndPassReceiver()); audio_focus_remote_->SetEnforcementMode(GetParam()); @@ -64,6 +66,7 @@ class AudioFocusManagerTest base::RunLoop().RunUntilIdle(); service_.reset(); + service_remote_.reset(); base::PowerMonitor::ShutdownForTesting(); } @@ -181,7 +184,7 @@ class AudioFocusManagerTest mojo::Remote CreateAudioFocusManagerRemote() { mojo::Remote remote; - service_->BindAudioFocusManager(remote.BindNewPipeAndPassReceiver()); + service_remote_->BindAudioFocusManager(remote.BindNewPipeAndPassReceiver()); return remote; } @@ -279,7 +282,8 @@ class AudioFocusManagerTest base::test::TaskEnvironment task_environment_; - std::unique_ptr service_; + std::unique_ptr service_; + mojo::Remote service_remote_; mojo::Remote audio_focus_remote_; mojo::Remote audio_focus_debug_remote_; diff --git a/services/media_session/media_controller_unittest.cc b/services/media_session/media_controller_unittest.cc index 77b608d0a5c56c..164cd39745720d 100644 --- a/services/media_session/media_controller_unittest.cc +++ b/services/media_session/media_controller_unittest.cc @@ -14,12 +14,13 @@ #include "base/time/time.h" #include "base/unguessable_token.h" #include "mojo/public/cpp/bindings/remote.h" -#include "services/media_session/media_session_service_impl.h" +#include "services/media_session/media_session_service.h" #include "services/media_session/public/cpp/media_metadata.h" #include "services/media_session/public/cpp/test/mock_media_session.h" #include "services/media_session/public/cpp/test/test_media_controller.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" +#include "services/media_session/public/mojom/media_session_service.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace media_session { @@ -30,10 +31,11 @@ class MediaControllerTest : public testing::Test { void SetUp() override { // Create an instance of the MediaSessionService and bind some interfaces. - service_ = std::make_unique(); - service_->BindAudioFocusManager( + service_ = std::make_unique( + service_remote_.BindNewPipeAndPassReceiver()); + service_remote_->BindAudioFocusManager( audio_focus_remote_.BindNewPipeAndPassReceiver()); - service_->BindMediaControllerManager( + service_remote_->BindMediaControllerManager( controller_manager_remote_.BindNewPipeAndPassReceiver()); controller_manager_remote_->CreateActiveMediaController( @@ -70,6 +72,7 @@ class MediaControllerTest : public testing::Test { private: base::test::TaskEnvironment task_environment_; std::unique_ptr service_; + mojo::Remote service_remote_; mojo::Remote audio_focus_remote_; mojo::Remote media_controller_remote_; mojo::Remote controller_manager_remote_; diff --git a/services/media_session/media_session_service_impl.cc b/services/media_session/media_session_service.cc similarity index 60% rename from services/media_session/media_session_service_impl.cc rename to services/media_session/media_session_service.cc index 27534e2cc1ad12..7672a8d0703b1d 100644 --- a/services/media_session/media_session_service_impl.cc +++ b/services/media_session/media_session_service.cc @@ -2,29 +2,31 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "services/media_session/media_session_service_impl.h" +#include "services/media_session/media_session_service.h" #include "base/bind.h" #include "services/media_session/audio_focus_manager.h" namespace media_session { -MediaSessionServiceImpl::MediaSessionServiceImpl() - : audio_focus_manager_(std::make_unique()) {} +MediaSessionService::MediaSessionService( + mojo::PendingReceiver receiver) + : receiver_(this, std::move(receiver)), + audio_focus_manager_(std::make_unique()) {} -MediaSessionServiceImpl::~MediaSessionServiceImpl() = default; +MediaSessionService::~MediaSessionService() = default; -void MediaSessionServiceImpl::BindAudioFocusManager( +void MediaSessionService::BindAudioFocusManager( mojo::PendingReceiver receiver) { audio_focus_manager_->BindToInterface(std::move(receiver)); } -void MediaSessionServiceImpl::BindAudioFocusManagerDebug( +void MediaSessionService::BindAudioFocusManagerDebug( mojo::PendingReceiver receiver) { audio_focus_manager_->BindToDebugInterface(std::move(receiver)); } -void MediaSessionServiceImpl::BindMediaControllerManager( +void MediaSessionService::BindMediaControllerManager( mojo::PendingReceiver receiver) { audio_focus_manager_->BindToControllerManagerInterface(std::move(receiver)); } diff --git a/services/media_session/media_session_service_impl.h b/services/media_session/media_session_service.h similarity index 61% rename from services/media_session/media_session_service_impl.h rename to services/media_session/media_session_service.h index c608ab181b1b99..947c92b2c34cda 100644 --- a/services/media_session/media_session_service_impl.h +++ b/services/media_session/media_session_service.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_ -#define SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_ +#ifndef SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_H_ +#define SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_H_ #include #include @@ -11,20 +11,24 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" -#include "services/media_session/public/cpp/media_session_service.h" +#include "services/media_session/public/mojom/media_session_service.mojom.h" namespace media_session { class AudioFocusManager; -class MediaSessionServiceImpl : public MediaSessionService { +class MediaSessionService : public mojom::MediaSessionService { public: - MediaSessionServiceImpl(); - ~MediaSessionServiceImpl() override; - MediaSessionServiceImpl(const MediaSessionServiceImpl&) = delete; - MediaSessionServiceImpl& operator=(const MediaSessionServiceImpl&) = delete; + explicit MediaSessionService( + mojo::PendingReceiver receiver); + ~MediaSessionService() override; - // MediaSessionService implementation: + const AudioFocusManager& audio_focus_manager_for_testing() const { + return *audio_focus_manager_.get(); + } + + private: + // mojom::MediaSessionService implementation: void BindAudioFocusManager( mojo::PendingReceiver receiver) override; void BindAudioFocusManagerDebug( @@ -32,14 +36,12 @@ class MediaSessionServiceImpl : public MediaSessionService { void BindMediaControllerManager( mojo::PendingReceiver receiver) override; - const AudioFocusManager& audio_focus_manager_for_testing() const { - return *audio_focus_manager_.get(); - } - - private: + mojo::Receiver receiver_; std::unique_ptr audio_focus_manager_; + + DISALLOW_COPY_AND_ASSIGN(MediaSessionService); }; } // namespace media_session -#endif // SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_ +#endif // SERVICES_MEDIA_SESSION_MEDIA_SESSION_SERVICE_H_ diff --git a/services/media_session/media_session_service_impl_unittest.cc b/services/media_session/media_session_service_unittest.cc similarity index 52% rename from services/media_session/media_session_service_impl_unittest.cc rename to services/media_session/media_session_service_unittest.cc index f889e7e44cdd0a..34c8597ecad095 100644 --- a/services/media_session/media_session_service_impl_unittest.cc +++ b/services/media_session/media_session_service_unittest.cc @@ -2,27 +2,28 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "services/media_session/media_session_service_impl.h" +#include "services/media_session/media_session_service.h" #include "base/macros.h" #include "base/test/task_environment.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "testing/gtest/include/gtest/gtest.h" namespace media_session { -class MediaSessionImplTest : public testing::Test { +class MediaSessionTest : public testing::Test { public: - MediaSessionImplTest() = default; - ~MediaSessionImplTest() override = default; + MediaSessionTest() = default; + ~MediaSessionTest() override = default; private: base::test::TaskEnvironment task_environment_; - DISALLOW_COPY_AND_ASSIGN(MediaSessionImplTest); + DISALLOW_COPY_AND_ASSIGN(MediaSessionTest); }; -TEST_F(MediaSessionImplTest, InstantiateService) { - MediaSessionServiceImpl service; +TEST_F(MediaSessionTest, InstantiateService) { + MediaSessionService service{mojo::NullReceiver()}; } } // namespace media_session diff --git a/services/media_session/public/cpp/BUILD.gn b/services/media_session/public/cpp/BUILD.gn index 93bdbb714c3b6e..e6801541378326 100644 --- a/services/media_session/public/cpp/BUILD.gn +++ b/services/media_session/public/cpp/BUILD.gn @@ -44,7 +44,6 @@ component("cpp") { "features.h", "media_image_manager.cc", "media_image_manager.h", - "media_session_service.h", "util.cc", "util.h", ] diff --git a/services/media_session/public/cpp/media_session_service.h b/services/media_session/public/cpp/media_session_service.h deleted file mode 100644 index d1ebc60a13f686..00000000000000 --- a/services/media_session/public/cpp/media_session_service.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_SESSION_SERVICE_H_ -#define SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_SESSION_SERVICE_H_ - -#include - -#include "base/component_export.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "services/media_session/public/mojom/audio_focus.mojom.h" -#include "services/media_session/public/mojom/media_controller.mojom.h" - -namespace media_session { - -class AudioFocusManager; - -class COMPONENT_EXPORT(MEDIA_SESSION_CPP) MediaSessionService { - public: - virtual ~MediaSessionService() = default; - - virtual void BindAudioFocusManager( - mojo::PendingReceiver receiver) = 0; - virtual void BindAudioFocusManagerDebug( - mojo::PendingReceiver receiver) = 0; - virtual void BindMediaControllerManager( - mojo::PendingReceiver receiver) = 0; - - protected: - MediaSessionService() = default; -}; - -} // namespace media_session - -#endif // SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_SESSION_SERVICE_H_ diff --git a/services/media_session/public/mojom/BUILD.gn b/services/media_session/public/mojom/BUILD.gn index 00f77dd120b39a..4ee7adcc43eef1 100644 --- a/services/media_session/public/mojom/BUILD.gn +++ b/services/media_session/public/mojom/BUILD.gn @@ -11,6 +11,7 @@ mojom("mojom") { "constants.mojom", "media_controller.mojom", "media_session.mojom", + "media_session_service.mojom", ] public_deps = [ diff --git a/services/media_session/public/mojom/media_session_service.mojom b/services/media_session/public/mojom/media_session_service.mojom new file mode 100644 index 00000000000000..977340211c46e7 --- /dev/null +++ b/services/media_session/public/mojom/media_session_service.mojom @@ -0,0 +1,21 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module media_session.mojom; + +import "services/media_session/public/mojom/audio_focus.mojom"; +import "services/media_session/public/mojom/media_controller.mojom"; + +// The main interface to the Media Session service. Privileged and bound only by +// the browser process. +interface MediaSessionService { + // Binds an AudioFocusManager endpoint in the service. + BindAudioFocusManager(pending_receiver receiver); + + // Binds an endpoint for debugging the AudioFocusManager. + BindAudioFocusManagerDebug(pending_receiver receiver); + + // Binds a MediaControllerManager endpoint in the service. + BindMediaControllerManager(pending_receiver receiver); +};