Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6916)

Unified Diff: content/browser/media/session/media_session_impl_browsertest.cc

Issue 2475473002: Implement one-shot audio focus inside MediaSession (Closed)
Patch Set: nits Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/media/session/media_session_impl_browsertest.cc
diff --git a/content/browser/media/session/media_session_impl_browsertest.cc b/content/browser/media/session/media_session_impl_browsertest.cc
index 755bfac19cb2df12615a5523067e96346a2b8495..60ff64ebe3ccc316e0a1a1a7884d25e0a2c755be 100644
--- a/content/browser/media/session/media_session_impl_browsertest.cc
+++ b/content/browser/media/session/media_session_impl_browsertest.cc
@@ -33,6 +33,7 @@ using content::MediaSessionUmaHelper;
using content::MockMediaSessionPlayerObserver;
using ::testing::Expectation;
+using ::testing::_;
namespace {
@@ -41,11 +42,13 @@ const double kDuckingVolumeMultiplier = 0.2;
class MockAudioFocusDelegate : public AudioFocusDelegate {
public:
- bool RequestAudioFocus(content::AudioFocusManager::AudioFocusType) override {
- return true;
+ MockAudioFocusDelegate() {
+ ON_CALL(*this, RequestAudioFocus(_)).WillByDefault(::testing::Return(true));
}
- void AbandonAudioFocus() override {}
+ MOCK_METHOD1(RequestAudioFocus,
+ bool(content::AudioFocusManager::AudioFocusType));
+ MOCK_METHOD0(AbandonAudioFocus, void());
};
class MockMediaSessionObserver : public MediaSessionObserver {
@@ -70,8 +73,9 @@ class MediaSessionImplBrowserTest : public content::ContentBrowserTest {
media_session_ = MediaSessionImpl::Get(shell()->web_contents());
mock_media_session_observer_.reset(
new MockMediaSessionObserver(media_session_));
+ mock_audio_focus_delegate_ = new MockAudioFocusDelegate();
media_session_->SetDelegateForTests(
- std::unique_ptr<AudioFocusDelegate>(new MockAudioFocusDelegate()));
+ std::unique_ptr<AudioFocusDelegate>(mock_audio_focus_delegate_));
dcheng 2016/11/08 06:59:38 Nit: base::WrapUnique
Zhiqiang Zhang (Slow) 2016/11/10 15:07:18 Done.
ASSERT_TRUE(media_session_);
}
@@ -144,6 +148,10 @@ class MediaSessionImplBrowserTest : public content::ContentBrowserTest {
return mock_media_session_observer_.get();
}
+ MockAudioFocusDelegate* mock_audio_focus_delegate() {
+ return mock_audio_focus_delegate_;
+ }
+
std::unique_ptr<MediaSessionImpl> CreateDummyMediaSession() {
return std::unique_ptr<MediaSessionImpl>(new MediaSessionImpl(nullptr));
}
@@ -155,6 +163,7 @@ class MediaSessionImplBrowserTest : public content::ContentBrowserTest {
protected:
MediaSessionImpl* media_session_;
std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_;
+ MockAudioFocusDelegate* mock_audio_focus_delegate_;
DISALLOW_COPY_AND_ASSIGN(MediaSessionImplBrowserTest);
};
@@ -888,6 +897,67 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
+ ControlsDontShowWhenOneShotIsPresent) {
+ EXPECT_CALL(*mock_media_session_observer(),
+ MediaSessionStateChanged(false, false));
+
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
dcheng 2016/11/08 06:59:38 Optional nit: auto player_observer = base::MakeUni
Zhiqiang Zhang (Slow) 2016/11/10 15:07:18 Done.
+ new MockMediaSessionPlayerObserver);
+
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
+ ControlsShowAfterRemoveOneShot) {
+ Expectation uncontrollable = EXPECT_CALL(
+ *mock_media_session_observer(), MediaSessionStateChanged(false, false));
+
+ EXPECT_CALL(*mock_media_session_observer(),
+ MediaSessionStateChanged(true, false))
+ .After(uncontrollable);
+
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
+ new MockMediaSessionPlayerObserver);
+
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
+
+ RemovePlayer(player_observer.get(), 0);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
+ DontSuspendWhenOneShotIsPresent) {
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
+ new MockMediaSessionPlayerObserver);
+
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
+
+ SystemSuspend(false);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+
+ EXPECT_EQ(0, player_observer->received_suspend_calls());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
DontResumeBySystemUISuspendedSessions) {
std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
new MockMediaSessionPlayerObserver);
@@ -945,6 +1015,41 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ResumeSuspendFromSystem) {
EXPECT_FALSE(IsSuspended());
}
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, OneShotTakesGainFocus) {
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
+ new MockMediaSessionPlayerObserver);
+ EXPECT_CALL(
+ *mock_audio_focus_delegate(),
+ RequestAudioFocus(content::AudioFocusManager::AudioFocusType::Gain))
+ .Times(1);
+ EXPECT_CALL(*mock_audio_focus_delegate(),
+ RequestAudioFocus(::testing::Ne(
+ content::AudioFocusManager::AudioFocusType::Gain)))
+ .Times(0);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, RemovingOneShotDropsFocus) {
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
+ new MockMediaSessionPlayerObserver);
+ EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus());
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+ RemovePlayer(player_observer.get(), 0);
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
+ RemovingOneShotWhileStillHavingOtherPlayersKeepsFocus) {
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(
+ new MockMediaSessionPlayerObserver);
+ EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus())
+ .Times(1); // Called in TearDown
+ StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
+ StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
+ RemovePlayer(player_observer.get(), 0);
+}
+
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_Suspended_SystemTransient) {
std::unique_ptr<MockMediaSessionPlayerObserver> player_observer(

Powered by Google App Engine
This is Rietveld 408576698