blob: 37827e1c3691e5c7aa1cbb9dc9d598b5272f035c [file] [log] [blame]
// Copyright 2015 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.
#include "content/browser/media/session/media_session_impl.h"
#include <stddef.h>
#include <list>
#include <vector>
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_samples.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/histogram_tester.h"
#include "base/test/simple_test_tick_clock.h"
#include "content/browser/media/session/audio_focus_delegate.h"
#include "content/browser/media/session/media_session_service_impl.h"
#include "content/browser/media/session/mock_media_session_observer.h"
#include "content/browser/media/session/mock_media_session_player_observer.h"
#include "content/public/browser/media_session.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/content_browser_test.h"
#include "content/shell/browser/shell.h"
#include "media/base/media_content_type.h"
#include "testing/gmock/include/gmock/gmock.h"
using content::WebContents;
using content::MediaSession;
using content::MediaSessionImpl;
using content::MediaSessionObserver;
using content::AudioFocusDelegate;
using content::MediaSessionPlayerObserver;
using content::MediaSessionUmaHelper;
using content::MockMediaSessionPlayerObserver;
using ::testing::Eq;
using ::testing::Expectation;
using ::testing::NiceMock;
using ::testing::_;
namespace {
const double kDefaultVolumeMultiplier = 1.0;
const double kDuckingVolumeMultiplier = 0.2;
class MockAudioFocusDelegate : public AudioFocusDelegate {
public:
MockAudioFocusDelegate() {
ON_CALL(*this, RequestAudioFocus(_)).WillByDefault(::testing::Return(true));
}
MOCK_METHOD1(RequestAudioFocus,
bool(content::AudioFocusManager::AudioFocusType));
MOCK_METHOD0(AbandonAudioFocus, void());
};
class MockMediaSessionServiceImpl : public content::MediaSessionServiceImpl {
public:
explicit MockMediaSessionServiceImpl(content::RenderFrameHost* rfh)
: MediaSessionServiceImpl(rfh) {}
~MockMediaSessionServiceImpl() override = default;
};
} // namespace
class MediaSessionImplBrowserTest : public content::ContentBrowserTest {
protected:
MediaSessionImplBrowserTest() = default;
void SetUpOnMainThread() override {
ContentBrowserTest::SetUpOnMainThread();
media_session_ = MediaSessionImpl::Get(shell()->web_contents());
mock_media_session_observer_.reset(
new NiceMock<content::MockMediaSessionObserver>(media_session_));
mock_audio_focus_delegate_ = new NiceMock<MockAudioFocusDelegate>;
media_session_->SetDelegateForTests(
base::WrapUnique(mock_audio_focus_delegate_));
ASSERT_TRUE(media_session_);
}
void TearDownOnMainThread() override {
mock_media_session_observer_.reset();
media_session_->RemoveAllPlayersForTest();
mock_media_session_service_.reset();
media_session_ = nullptr;
ContentBrowserTest::TearDownOnMainThread();
}
void StartNewPlayer(MockMediaSessionPlayerObserver* player_observer,
media::MediaContentType media_content_type) {
bool result = AddPlayer(player_observer, player_observer->StartNewPlayer(),
media_content_type);
EXPECT_TRUE(result);
}
bool AddPlayer(MockMediaSessionPlayerObserver* player_observer,
int player_id,
media::MediaContentType type) {
return media_session_->AddPlayer(player_observer, player_id, type);
}
void RemovePlayer(MockMediaSessionPlayerObserver* player_observer,
int player_id) {
media_session_->RemovePlayer(player_observer, player_id);
}
void RemovePlayers(MockMediaSessionPlayerObserver* player_observer) {
media_session_->RemovePlayers(player_observer);
}
void OnPlayerPaused(MockMediaSessionPlayerObserver* player_observer,
int player_id) {
media_session_->OnPlayerPaused(player_observer, player_id);
}
bool IsActive() { return media_session_->IsActive(); }
content::AudioFocusManager::AudioFocusType GetSessionAudioFocusType() {
return media_session_->audio_focus_type();
}
bool IsControllable() { return media_session_->IsControllable(); }
void UIResume() { media_session_->Resume(MediaSession::SuspendType::UI); }
void SystemResume() {
media_session_->OnResumeInternal(MediaSession::SuspendType::SYSTEM);
}
void UISuspend() { media_session_->Suspend(MediaSession::SuspendType::UI); }
void SystemSuspend(bool temporary) {
media_session_->OnSuspendInternal(MediaSession::SuspendType::SYSTEM,
temporary
? MediaSessionImpl::State::SUSPENDED
: MediaSessionImpl::State::INACTIVE);
}
void SystemStartDucking() { media_session_->StartDucking(); }
void SystemStopDucking() { media_session_->StopDucking(); }
void EnsureMediaSessionService() {
mock_media_session_service_.reset(new NiceMock<MockMediaSessionServiceImpl>(
shell()->web_contents()->GetMainFrame()));
}
void SetPlaybackState(blink::mojom::MediaSessionPlaybackState state) {
mock_media_session_service_->SetPlaybackState(state);
}
content::MockMediaSessionObserver* mock_media_session_observer() {
return mock_media_session_observer_.get();
}
MockAudioFocusDelegate* mock_audio_focus_delegate() {
return mock_audio_focus_delegate_;
}
std::unique_ptr<MediaSessionImpl> CreateDummyMediaSession() {
return base::WrapUnique<MediaSessionImpl>(new MediaSessionImpl(nullptr));
}
MediaSessionUmaHelper* GetMediaSessionUMAHelper() {
return media_session_->uma_helper_for_test();
}
protected:
MediaSessionImpl* media_session_;
std::unique_ptr<content::MockMediaSessionObserver>
mock_media_session_observer_;
MockAudioFocusDelegate* mock_audio_focus_delegate_;
std::unique_ptr<MockMediaSessionServiceImpl> mock_media_session_service_;
DISALLOW_COPY_AND_ASSIGN(MediaSessionImplBrowserTest);
};
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
PlayersFromSameObserverDoNotStopEachOtherInSameSession) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
EXPECT_TRUE(player_observer->IsPlaying(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
PlayersFromManyObserverDoNotStopEachOtherInSameSession) {
auto player_observer_1 = base::MakeUnique<MockMediaSessionPlayerObserver>();
auto player_observer_2 = base::MakeUnique<MockMediaSessionPlayerObserver>();
auto player_observer_3 = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_3.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(player_observer_1->IsPlaying(0));
EXPECT_TRUE(player_observer_2->IsPlaying(0));
EXPECT_TRUE(player_observer_3->IsPlaying(0));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
SuspendedMediaSessionStopsPlayers) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
EXPECT_FALSE(player_observer->IsPlaying(0));
EXPECT_FALSE(player_observer->IsPlaying(1));
EXPECT_FALSE(player_observer->IsPlaying(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ResumedMediaSessionRestartsPlayers) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
SystemResume();
EXPECT_TRUE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
EXPECT_TRUE(player_observer->IsPlaying(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
StartedPlayerOnSuspendedSessionPlaysAlone) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(player_observer->IsPlaying(0));
SystemSuspend(true);
EXPECT_FALSE(player_observer->IsPlaying(0));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_FALSE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_FALSE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
EXPECT_TRUE(player_observer->IsPlaying(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, InitialVolumeMultiplier) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
StartDuckingReducesVolumeMultiplier) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemStartDucking();
EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
StopDuckingRecoversVolumeMultiplier) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemStartDucking();
SystemStopDucking();
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(2));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, AudioFocusInitialState) {
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, StartPlayerGivesFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
SuspendGivesAwayAudioFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, StopGivesAwayAudioFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
media_session_->Stop(MediaSession::SuspendType::UI);
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ResumeGivesBackAudioFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
SystemResume();
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
RemovingLastPlayerDropsAudioFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer.get(), 0);
EXPECT_TRUE(IsActive());
RemovePlayer(player_observer.get(), 1);
EXPECT_TRUE(IsActive());
RemovePlayer(player_observer.get(), 2);
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
RemovingLastPlayerFromManyObserversDropsAudioFocus) {
auto player_observer_1 = base::MakeUnique<MockMediaSessionPlayerObserver>();
auto player_observer_2 = base::MakeUnique<MockMediaSessionPlayerObserver>();
auto player_observer_3 = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_3.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer_1.get(), 0);
EXPECT_TRUE(IsActive());
RemovePlayer(player_observer_2.get(), 0);
EXPECT_TRUE(IsActive());
RemovePlayer(player_observer_3.get(), 0);
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
RemovingAllPlayersFromObserversDropsAudioFocus) {
auto player_observer_1 = base::MakeUnique<MockMediaSessionPlayerObserver>();
auto player_observer_2 = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
RemovePlayers(player_observer_1.get());
EXPECT_TRUE(IsActive());
RemovePlayers(player_observer_2.get());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ResumePlayGivesAudioFocus) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer.get(), 0);
EXPECT_FALSE(IsActive());
EXPECT_TRUE(
AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent));
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ResumeSuspendAreSentOnlyOncePerPlayers) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_EQ(0, player_observer->received_suspend_calls());
EXPECT_EQ(0, player_observer->received_resume_calls());
SystemSuspend(true);
EXPECT_EQ(3, player_observer->received_suspend_calls());
SystemResume();
EXPECT_EQ(3, player_observer->received_resume_calls());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ResumeSuspendAreSentOnlyOncePerPlayersAddedTwice) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
// Adding the three players above again.
EXPECT_TRUE(
AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent));
EXPECT_TRUE(
AddPlayer(player_observer.get(), 1, media::MediaContentType::Persistent));
EXPECT_TRUE(
AddPlayer(player_observer.get(), 2, media::MediaContentType::Persistent));
EXPECT_EQ(0, player_observer->received_suspend_calls());
EXPECT_EQ(0, player_observer->received_resume_calls());
SystemSuspend(true);
EXPECT_EQ(3, player_observer->received_suspend_calls());
SystemResume();
EXPECT_EQ(3, player_observer->received_resume_calls());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
RemovingTheSamePlayerTwiceIsANoop) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer.get(), 0);
RemovePlayer(player_observer.get(), 0);
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, AudioFocusType) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
// Starting a player with a given type should set the session to that type.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::GainTransientMayDuck,
GetSessionAudioFocusType());
// Adding a player of the same type should have no effect on the type.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::GainTransientMayDuck,
GetSessionAudioFocusType());
// Adding a player of Content type should override the current type.
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::Gain,
GetSessionAudioFocusType());
// Adding a player of the Transient type should have no effect on the type.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::Gain,
GetSessionAudioFocusType());
EXPECT_TRUE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
EXPECT_TRUE(player_observer->IsPlaying(2));
EXPECT_TRUE(player_observer->IsPlaying(3));
SystemSuspend(true);
EXPECT_FALSE(player_observer->IsPlaying(0));
EXPECT_FALSE(player_observer->IsPlaying(1));
EXPECT_FALSE(player_observer->IsPlaying(2));
EXPECT_FALSE(player_observer->IsPlaying(3));
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::Gain,
GetSessionAudioFocusType());
SystemResume();
EXPECT_TRUE(player_observer->IsPlaying(0));
EXPECT_TRUE(player_observer->IsPlaying(1));
EXPECT_TRUE(player_observer->IsPlaying(2));
EXPECT_TRUE(player_observer->IsPlaying(3));
EXPECT_EQ(content::AudioFocusManager::AudioFocusType::Gain,
GetSessionAudioFocusType());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ControlsShowForContent) {
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
// Starting a player with a content type should show the media controls.
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsNoShowForTransient) {
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, false));
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
// Starting a player with a transient type should not show the media controls.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_FALSE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ControlsHideWhenStopped) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayers(player_observer.get());
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsShownAcceptTransient) {
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
// Transient player join the session without affecting the controls.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsShownAfterContentAdded) {
Expectation dontShowControls = EXPECT_CALL(
*mock_media_session_observer(), MediaSessionStateChanged(false, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(dontShowControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
// The controls are shown when the content player is added.
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsStayIfOnlyOnePlayerHasBeenPaused) {
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
// Removing only content player doesn't hide the controls since the session
// is still active.
RemovePlayer(player_observer.get(), 0);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsHideWhenTheLastPlayerIsRemoved) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer.get(), 0);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
RemovePlayer(player_observer.get(), 1);
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsHideWhenAllThePlayersAreRemoved) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayers(player_observer.get());
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsNotHideWhenTheLastPlayerIsPaused) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
OnPlayerPaused(player_observer.get(), 0);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
OnPlayerPaused(player_observer.get(), 1);
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
SuspendTemporaryUpdatesControls) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsUpdatedWhenResumed) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
SystemResume();
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsHideWhenSessionSuspendedPermanently) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(false);
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ConstrolsHideWhenSessionStops) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
media_session_->Stop(MediaSession::SuspendType::UI);
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsHideWhenSessionChangesFromContentToTransient) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, false))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
// This should reset the session and change it to a transient, so
// hide the controls.
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_FALSE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsUpdatedWhenNewPlayerResetsSession) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
// This should reset the session and update the controls.
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsResumedWhenPlayerIsResumed) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
// This should resume the session and update the controls.
AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent);
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsUpdatedDueToResumeSessionAction) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsUpdatedDueToSuspendSessionAction) {
Expectation showControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
Expectation pauseControls = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.After(showControls);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(pauseControls);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
UIResume();
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsDontShowWhenOneShotIsPresent) {
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, false));
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
EXPECT_FALSE(IsControllable());
EXPECT_TRUE(IsActive());
StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
EXPECT_FALSE(IsControllable());
EXPECT_TRUE(IsActive());
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
EXPECT_FALSE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsHiddenAfterRemoveOneShotWithoutOtherPlayers) {
Expectation expect_1 = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, false));
Expectation expect_2 = EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true))
.After(expect_1);
EXPECT_CALL(*mock_media_session_observer(), MediaSessionStateChanged(true, _))
.Times(0)
.After(expect_2);
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
RemovePlayer(player_observer.get(), 0);
EXPECT_FALSE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ControlsShowAfterRemoveOneShotWithPersistentPresent) {
Expectation uncontrollable = EXPECT_CALL(
*mock_media_session_observer(), MediaSessionStateChanged(false, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.After(uncontrollable);
auto player_observer = base::MakeUnique<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_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
DontSuspendWhenOneShotIsPresent) {
auto player_observer = base::MakeUnique<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_TRUE(IsActive());
EXPECT_EQ(0, player_observer->received_suspend_calls());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
DontResumeBySystemUISuspendedSessions) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
SystemResume();
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
AllowUIResumeForSystemSuspend) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
UIResume();
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ResumeSuspendFromUI) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
UIResume();
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ResumeSuspendFromSystem) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
EXPECT_TRUE(IsControllable());
EXPECT_FALSE(IsActive());
SystemResume();
EXPECT_TRUE(IsControllable());
EXPECT_TRUE(IsActive());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, OneShotTakesGainFocus) {
auto player_observer = base::MakeUnique<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) {
auto player_observer = base::MakeUnique<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) {
auto player_observer = base::MakeUnique<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,
ActualPlaybackStateWhilePlayerPaused) {
EnsureMediaSessionService();
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
shell()->web_contents()->GetMainFrame());
::testing::Sequence s;
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, true))
.InSequence(s);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
OnPlayerPaused(player_observer.get(), 0);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
// Verify before test exists. Otherwise the sequence will expire and cause
// weird problems.
::testing::Mock::VerifyAndClear(mock_media_session_observer());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ActualPlaybackStateWhilePlayerPlaying) {
EnsureMediaSessionService();
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
shell()->web_contents()->GetMainFrame());
::testing::Sequence s;
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
// Verify before test exists. Otherwise the sequence will expire and cause
// weird problems.
::testing::Mock::VerifyAndClear(mock_media_session_observer());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
ActualPlaybackStateWhilePlayerRemoved) {
EnsureMediaSessionService();
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
shell()->web_contents()->GetMainFrame());
::testing::Sequence s;
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false))
.InSequence(s);
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, _))
.InSequence(s);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
RemovePlayer(player_observer.get(), 0);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
// Verify before test exists. Otherwise the sequence will expire and cause
// weird problems.
::testing::Mock::VerifyAndClear(mock_media_session_observer());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_Suspended_SystemTransient) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(true);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0)); // System Transient
EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
EXPECT_EQ(0, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_Suspended_SystemPermantent) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
SystemSuspend(false);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0)); // System Transient
EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
EXPECT_EQ(0, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UMA_Suspended_UI) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0)); // System Transient
EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
EXPECT_EQ(1, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UMA_Suspended_Multiple) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
UIResume();
SystemSuspend(true);
SystemResume();
UISuspend();
UIResume();
SystemSuspend(false);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(4, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0)); // System Transient
EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
EXPECT_EQ(2, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UMA_Suspended_Crossing) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
UISuspend();
SystemSuspend(true);
SystemSuspend(false);
UIResume();
SystemSuspend(true);
SystemSuspend(true);
SystemSuspend(false);
SystemResume();
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(2, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0)); // System Transient
EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
EXPECT_EQ(1, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UMA_Suspended_Stop) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0)); // System Transient
EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
EXPECT_EQ(1, samples->GetCount(2)); // UI
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_NoActivation) {
base::HistogramTester tester;
std::unique_ptr<MediaSessionImpl> media_session = CreateDummyMediaSession();
media_session.reset();
// A MediaSession that wasn't active doesn't register an active time.
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_SimpleActivation) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_ActivationWithUISuspension) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
UISuspend();
clock->Advance(base::TimeDelta::FromMilliseconds(2000));
UIResume();
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(2000));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_ActivationWithSystemSuspension) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
SystemSuspend(true);
clock->Advance(base::TimeDelta::FromMilliseconds(2000));
SystemResume();
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(2000));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_ActivateSuspendedButNotStopped) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(500));
SystemSuspend(true);
{
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
SystemResume();
clock->Advance(base::TimeDelta::FromMilliseconds(5000));
UISuspend();
{
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_ActivateSuspendStopTwice) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(500));
SystemSuspend(true);
media_session_->Stop(MediaSession::SuspendType::UI);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(5000));
SystemResume();
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(2, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(500));
EXPECT_EQ(1, samples->GetCount(5000));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UMA_ActiveTime_MultipleActivations) {
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
base::HistogramTester tester;
MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
clock->SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper->SetClockForTest(
std::unique_ptr<base::SimpleTestTickClock>(clock));
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(10000));
RemovePlayer(player_observer.get(), 0);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
clock->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_->Stop(MediaSession::SuspendType::UI);
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
EXPECT_EQ(2, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
EXPECT_EQ(1, samples->GetCount(10000));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
AddingObserverNotifiesCurrentInformation_EmptyInfo) {
media_session_->RemoveObserver(mock_media_session_observer());
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(false, true));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionMetadataChanged(Eq(base::nullopt)));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionActionsChanged(
Eq(std::set<blink::mojom::MediaSessionAction>())));
media_session_->AddObserver(mock_media_session_observer());
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
AddingObserverNotifiesCurrentInformation_WithInfo) {
// Set up the service and information.
EnsureMediaSessionService();
content::MediaMetadata metadata;
metadata.title = base::ASCIIToUTF16("title");
metadata.artist = base::ASCIIToUTF16("artist");
metadata.album = base::ASCIIToUTF16("album");
mock_media_session_service_->SetMetadata(metadata);
mock_media_session_service_->EnableAction(
blink::mojom::MediaSessionAction::PLAY);
std::set<blink::mojom::MediaSessionAction> expectedActions =
mock_media_session_service_->actions();
// Make sure the service is routed,
auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
shell()->web_contents()->GetMainFrame());
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
// Check if the expectations are met when the observer is newly added.
media_session_->RemoveObserver(mock_media_session_observer());
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionStateChanged(true, false));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionMetadataChanged(Eq(metadata)));
EXPECT_CALL(*mock_media_session_observer(),
MediaSessionActionsChanged(Eq(expectedActions)));
media_session_->AddObserver(mock_media_session_observer());
}