| Index: content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc
|
| diff --git a/content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc b/content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc
|
| index 30fc19df0b00dea03e14810df9a2f5c10dbeb81d..986102445492a938f7f196dbc643f959810dba1b 100644
|
| --- a/content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc
|
| +++ b/content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc
|
| @@ -30,11 +30,6 @@ namespace {
|
| constexpr base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(1);
|
| }
|
|
|
| -ACTION_P(RunClosure, closure) {
|
| - closure.Run();
|
| - return true;
|
| -}
|
| -
|
| class MockWebMediaPlayerDelegateObserver
|
| : public WebMediaPlayerDelegate::Observer {
|
| public:
|
| @@ -42,9 +37,10 @@ class MockWebMediaPlayerDelegateObserver
|
| ~MockWebMediaPlayerDelegateObserver() {}
|
|
|
| // WebMediaPlayerDelegate::Observer implementation.
|
| - MOCK_METHOD0(OnHidden, void());
|
| - MOCK_METHOD0(OnShown, void());
|
| - MOCK_METHOD1(OnSuspendRequested, bool(bool));
|
| + MOCK_METHOD0(OnFrameHidden, void());
|
| + MOCK_METHOD0(OnFrameClosed, void());
|
| + MOCK_METHOD0(OnFrameShown, void());
|
| + MOCK_METHOD0(OnIdleTimeout, void());
|
| MOCK_METHOD0(OnPlay, void());
|
| MOCK_METHOD0(OnPause, void());
|
| MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double));
|
| @@ -73,12 +69,8 @@ class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest {
|
| protected:
|
| IPC::TestSink& test_sink() { return render_thread_->sink(); }
|
|
|
| - bool HasPlayingVideo(int delegate_id) {
|
| - return delegate_manager_->playing_videos_.count(delegate_id);
|
| - }
|
| -
|
| - void SetPlayingBackgroundVideo(bool is_playing) {
|
| - delegate_manager_->is_playing_background_video_ = is_playing;
|
| + void SetBackgroundVideoPlaybackUnlocked(bool is_unlocked) {
|
| + delegate_manager_->background_video_allowed_ = is_unlocked;
|
| }
|
|
|
| void CallOnMediaDelegatePlay(int delegate_id) {
|
| @@ -94,6 +86,13 @@ class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest {
|
| &tick_clock_, true);
|
| }
|
|
|
| + void RunLoopOnce() {
|
| + base::RunLoop run_loop;
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| + run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| +
|
| std::unique_ptr<RendererWebMediaPlayerDelegate> delegate_manager_;
|
| StrictMock<MockWebMediaPlayerDelegateObserver> observer_1_, observer_2_,
|
| observer_3_;
|
| @@ -112,7 +111,7 @@ TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) {
|
| const bool kHasVideo = true, kHasAudio = false, kIsRemote = false;
|
| const media::MediaContentType kMediaContentType =
|
| media::MediaContentType::Transient;
|
| - delegate_manager_->DidPlay(delegate_id, kHasVideo, kHasAudio, kIsRemote,
|
| + delegate_manager_->DidPlay(delegate_id, kHasVideo, kHasAudio,
|
| kMediaContentType);
|
|
|
| const IPC::Message* msg = test_sink().GetUniqueMessageMatching(
|
| @@ -131,8 +130,8 @@ TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) {
|
| // Verify the paused message.
|
| {
|
| test_sink().ClearMessages();
|
| - const bool kReachedEndOfStream = true;
|
| - delegate_manager_->DidPause(delegate_id, kReachedEndOfStream);
|
| + const bool kReachedEndOfStream = false;
|
| + delegate_manager_->DidPause(delegate_id);
|
|
|
| const IPC::Message* msg = test_sink().GetUniqueMessageMatching(
|
| MediaPlayerDelegateHostMsg_OnMediaPaused::ID);
|
| @@ -162,10 +161,10 @@ TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) {
|
| TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) {
|
| const int delegate_id = delegate_manager_->AddObserver(&observer_1_);
|
|
|
| - EXPECT_CALL(observer_1_, OnHidden());
|
| + EXPECT_CALL(observer_1_, OnFrameHidden());
|
| delegate_manager_->WasHidden();
|
|
|
| - EXPECT_CALL(observer_1_, OnShown());
|
| + EXPECT_CALL(observer_1_, OnFrameShown());
|
| delegate_manager_->WasShown();
|
|
|
| EXPECT_CALL(observer_1_, OnPause());
|
| @@ -182,7 +181,7 @@ TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) {
|
| kTestMultiplier);
|
| delegate_manager_->OnMessageReceived(volume_msg);
|
|
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(true));
|
| + EXPECT_CALL(observer_1_, OnFrameClosed());
|
| MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0);
|
| delegate_manager_->OnMessageReceived(suspend_msg);
|
| }
|
| @@ -191,21 +190,19 @@ TEST_F(RendererWebMediaPlayerDelegateTest, TheTimerIsInitiallyStopped) {
|
| ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
|
| }
|
|
|
| -TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnObserverStartsTheTimer) {
|
| - delegate_manager_->AddObserver(&observer_1_);
|
| +TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnIdleObserverStartsTheTimer) {
|
| + const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| + RunLoopOnce();
|
| ASSERT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
|
| }
|
|
|
| TEST_F(RendererWebMediaPlayerDelegateTest, RemovingAllObserversStopsTheTimer) {
|
| - delegate_manager_->RemoveObserver(
|
| - delegate_manager_->AddObserver(&observer_1_));
|
| - ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
|
| -}
|
| -
|
| -TEST_F(RendererWebMediaPlayerDelegateTest, PlayingDelegatesAreNotIdle) {
|
| const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| - delegate_manager_->DidPlay(delegate_id_1, true, true, false,
|
| - media::MediaContentType::Persistent);
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| + RunLoopOnce();
|
| + delegate_manager_->RemoveObserver(delegate_id_1);
|
| + RunLoopOnce();
|
| ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
|
| }
|
|
|
| @@ -213,60 +210,44 @@ TEST_F(RendererWebMediaPlayerDelegateTest, PlaySuspendsLowEndIdleDelegates) {
|
| SetIsLowEndDeviceForTesting();
|
|
|
| const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| - delegate_manager_->AddObserver(&observer_2_);
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| + const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
|
| + delegate_manager_->SetIdle(delegate_id_2, true);
|
| + RunLoopOnce();
|
|
|
| // Calling play on the first player should suspend the other idle player.
|
| - EXPECT_CALL(observer_2_, OnSuspendRequested(false));
|
| - tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1));
|
| - delegate_manager_->DidPlay(delegate_id_1, true, true, false,
|
| + EXPECT_CALL(observer_2_, OnIdleTimeout());
|
| + delegate_manager_->DidPlay(delegate_id_1, true, true,
|
| media::MediaContentType::Persistent);
|
| + delegate_manager_->SetIdle(delegate_id_1, false);
|
| + tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1));
|
| + RunLoopOnce();
|
| }
|
|
|
| TEST_F(RendererWebMediaPlayerDelegateTest, MaxLowEndIdleDelegates) {
|
| SetIsLowEndDeviceForTesting();
|
|
|
| - delegate_manager_->AddObserver(&observer_1_);
|
| - delegate_manager_->AddObserver(&observer_2_);
|
| -
|
| - // Just adding a third idle observer should suspend the others.
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false));
|
| - EXPECT_CALL(observer_2_, OnSuspendRequested(false));
|
| + int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| + int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
|
| + delegate_manager_->SetIdle(delegate_id_2, true);
|
| + RunLoopOnce();
|
| +
|
| + // Just adding a third idle observer should suspend all idle players.
|
| + EXPECT_CALL(observer_1_, OnIdleTimeout());
|
| + EXPECT_CALL(observer_2_, OnIdleTimeout());
|
| + int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_);
|
| + delegate_manager_->SetIdle(delegate_id_3, true);
|
| + EXPECT_CALL(observer_3_, OnIdleTimeout());
|
| tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1));
|
| - delegate_manager_->AddObserver(&observer_3_);
|
| -}
|
| -
|
| -// Make sure it's safe to call DidPause(), which modifies the idle delegate
|
| -// list, from OnSuspendRequested(), which iterates over the idle delegate list.
|
| -TEST_F(RendererWebMediaPlayerDelegateTest, ReentrantDelegateCallsAreSafe) {
|
| - const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false))
|
| - .WillOnce(RunClosure(base::Bind(&RendererWebMediaPlayerDelegate::DidPause,
|
| - base::Unretained(delegate_manager_.get()),
|
| - delegate_id_1, false)));
|
| - // Run an idle cleanup.
|
| - tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| - base::RunLoop().RunUntilIdle();
|
| + RunLoopOnce();
|
| }
|
|
|
| TEST_F(RendererWebMediaPlayerDelegateTest,
|
| SuspendRequestsAreOnlySentOnceIfHandled) {
|
| - delegate_manager_->AddObserver(&observer_1_);
|
| - // Return true from OnSuspendRequested() to indicate that it was handled. So
|
| - // even though the player did not call PlayerGone() it should be removed from
|
| - // future idle cleanup polls.
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true));
|
| - tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| - base::RunLoop().RunUntilIdle();
|
| -}
|
| -
|
| -TEST_F(RendererWebMediaPlayerDelegateTest,
|
| - SuspendRequestsAreSentAgainIfNotHandled) {
|
| - delegate_manager_->AddObserver(&observer_1_);
|
| - // Return false from OnSuspendRequested() to indicate that it was not handled.
|
| - // The observer should get another OnSuspendRequested.
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false))
|
| - .WillOnce(Return(false))
|
| - .WillOnce(Return(true));
|
| + int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| + EXPECT_CALL(observer_1_, OnIdleTimeout());
|
| tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
| @@ -274,135 +255,59 @@ TEST_F(RendererWebMediaPlayerDelegateTest,
|
| TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) {
|
| // Add one non-idle observer and one idle observer.
|
| const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
|
| - delegate_manager_->DidPlay(delegate_id_1, true, true, false,
|
| - media::MediaContentType::Persistent);
|
| - delegate_manager_->AddObserver(&observer_2_);
|
| + const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
|
| + delegate_manager_->SetIdle(delegate_id_2, true);
|
|
|
| // The idle cleanup task should suspend the second delegate while the first is
|
| // kept alive.
|
| {
|
| - EXPECT_CALL(observer_2_, OnSuspendRequested(false)).WillOnce(Return(true));
|
| + EXPECT_CALL(observer_2_, OnIdleTimeout());
|
| tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| - base::RunLoop().RunUntilIdle();
|
| + RunLoopOnce();
|
| }
|
|
|
| - // Pausing should count as idle if playback didn't reach end of stream, but
|
| - // in this case the player will not remove the MediaSession.
|
| - delegate_manager_->DidPause(delegate_id_1, false /* reached_end_of_stream */);
|
| - const int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_);
|
| - delegate_manager_->DidPlay(delegate_id_3, true, true, false,
|
| - media::MediaContentType::Persistent);
|
| -
|
| - // Adding the observer should instantly queue the timeout task. Once run only
|
| - // the first player should be suspended.
|
| + // Once the player is idle, it should be suspended after |kIdleTimeout|.
|
| + delegate_manager_->SetIdle(delegate_id_1, true);
|
| {
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true));
|
| - base::RunLoop run_loop;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - run_loop.QuitClosure());
|
| + EXPECT_CALL(observer_1_, OnIdleTimeout());
|
| tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| - run_loop.Run();
|
| - }
|
| -
|
| - delegate_manager_->DidPlay(delegate_id_1, true, true, false,
|
| - media::MediaContentType::Persistent);
|
| -
|
| - // Pausing after reaching end of stream should count as idle.
|
| - delegate_manager_->DidPause(delegate_id_1, true /* reached_end_of_stream */);
|
| -
|
| - // Once the timeout task runs the first delegate should be suspended while the
|
| - // third is kept alive.
|
| - {
|
| - EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true));
|
| - base::RunLoop run_loop;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - run_loop.QuitClosure());
|
| - tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
|
| - run_loop.Run();
|
| + RunLoopOnce();
|
| }
|
| }
|
|
|
| -TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) {
|
| - int delegate_id = delegate_manager_->AddObserver(&observer_1_);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Playing a local video adds it to the set.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - EXPECT_TRUE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Pause doesn't remove the video from the set.
|
| - delegate_manager_->DidPause(delegate_id, false);
|
| - EXPECT_TRUE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Reaching the end removes the video from the set.
|
| - delegate_manager_->DidPause(delegate_id, true);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Removing the player removes the video from the set.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - delegate_manager_->PlayerGone(delegate_id);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Playing a remote video removes it from the set.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - delegate_manager_->DidPlay(delegate_id, true, true, true,
|
| - MediaContentType::Persistent);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Playing a local video without audio adds it to the set (because of WMPA).
|
| - delegate_manager_->DidPlay(delegate_id, true, false, false,
|
| - MediaContentType::Persistent);
|
| - EXPECT_TRUE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Playing a local audio removes it from the set.
|
| - delegate_manager_->DidPlay(delegate_id, false, true, false,
|
| - MediaContentType::Persistent);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -
|
| - // Removing the observer also removes the video from the set.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - delegate_manager_->RemoveObserver(delegate_id);
|
| - EXPECT_FALSE(HasPlayingVideo(delegate_id));
|
| -}
|
| -
|
| -TEST_F(RendererWebMediaPlayerDelegateTest, IsPlayingBackgroundVideo) {
|
| +TEST_F(RendererWebMediaPlayerDelegateTest, IsBackgroundVideoPlaybackUnlocked) {
|
| NiceMock<MockWebMediaPlayerDelegateObserver> observer;
|
| int delegate_id = delegate_manager_->AddObserver(&observer);
|
| - EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
|
|
| // Showing the frame always clears the flag.
|
| - SetPlayingBackgroundVideo(true);
|
| + SetBackgroundVideoPlaybackUnlocked(true);
|
| delegate_manager_->WasShown();
|
| - EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
|
| -
|
| - // Pausing anything other than a local playing video doesn't affect the flag.
|
| - SetPlayingBackgroundVideo(true);
|
| - CallOnMediaDelegatePause(delegate_id);
|
| - EXPECT_TRUE(delegate_manager_->IsPlayingBackgroundVideo());
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
|
|
| // Pausing a currently playing video clears the flag.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| + delegate_manager_->DidPlay(delegate_id, true, true,
|
| MediaContentType::Persistent);
|
| + SetBackgroundVideoPlaybackUnlocked(true);
|
| CallOnMediaDelegatePause(delegate_id);
|
| - EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
|
|
| - // TODO(avayvod): this test can't mock the IsHidden() method.
|
| + // TODO(avayvod): this test can't mock the IsFrameHidden() method.
|
| // Just test that the value changes or doesn't depending on whether the video
|
| // is currently playing.
|
| - bool old_value = !delegate_manager_->IsHidden();
|
| - SetPlayingBackgroundVideo(old_value);
|
| - delegate_manager_->DidPause(delegate_id, true);
|
| - CallOnMediaDelegatePlay(delegate_id);
|
| - EXPECT_EQ(old_value, delegate_manager_->IsPlayingBackgroundVideo());
|
| -
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - CallOnMediaDelegatePlay(delegate_id);
|
| - EXPECT_NE(old_value, delegate_manager_->IsPlayingBackgroundVideo());
|
| + if (delegate_manager_->IsFrameHidden()) {
|
| + SetBackgroundVideoPlaybackUnlocked(false);
|
| + CallOnMediaDelegatePlay(delegate_id);
|
| + EXPECT_TRUE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
| + CallOnMediaDelegatePause(delegate_id);
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
| + } else {
|
| + SetBackgroundVideoPlaybackUnlocked(false);
|
| + CallOnMediaDelegatePlay(delegate_id);
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
| + CallOnMediaDelegatePause(delegate_id);
|
| + EXPECT_FALSE(delegate_manager_->IsBackgroundVideoPlaybackUnlocked());
|
| + }
|
| }
|
|
|
| #if defined(OS_ANDROID)
|
| @@ -413,30 +318,30 @@ TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) {
|
| base::HistogramTester histogram_tester;
|
| histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
|
|
|
| - // Pausing or showing doesn't record anything as background playback
|
| - // hasn't started yet.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| + // Play/pause while not hidden doesn't record anything.
|
| + delegate_manager_->DidPlay(delegate_id, true, true,
|
| MediaContentType::Persistent);
|
| - CallOnMediaDelegatePause(delegate_id);
|
| + RunLoopOnce();
|
| + delegate_manager_->DidPause(delegate_id);
|
| + RunLoopOnce();
|
| histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
|
|
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| + // Play/pause while hidden does.
|
| + delegate_manager_->SetFrameHiddenForTesting(true);
|
| + delegate_manager_->DidPlay(delegate_id, true, true,
|
| MediaContentType::Persistent);
|
| - delegate_manager_->WasShown();
|
| - histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
|
| -
|
| - // Doing this things after the background playback has started should record
|
| - // the time.
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| - MediaContentType::Persistent);
|
| - SetPlayingBackgroundVideo(true);
|
| - CallOnMediaDelegatePause(delegate_id);
|
| + RunLoopOnce();
|
| + delegate_manager_->DidPause(delegate_id);
|
| + RunLoopOnce();
|
| histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1);
|
|
|
| - delegate_manager_->DidPlay(delegate_id, true, true, false,
|
| + // As does ending background playback by becoming visible.
|
| + delegate_manager_->SetFrameHiddenForTesting(true);
|
| + delegate_manager_->DidPlay(delegate_id, true, true,
|
| MediaContentType::Persistent);
|
| - SetPlayingBackgroundVideo(true);
|
| - delegate_manager_->WasShown();
|
| + RunLoopOnce();
|
| + delegate_manager_->SetFrameHiddenForTesting(false);
|
| + RunLoopOnce();
|
| histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2);
|
| }
|
|
|
|
|