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..77c3db92554b69cd372fd802b7a1803ddb872986 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, bool()); |
MOCK_METHOD0(OnPlay, void()); |
MOCK_METHOD0(OnPause, void()); |
MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double)); |
@@ -77,23 +73,18 @@ class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest { |
return delegate_manager_->playing_videos_.count(delegate_id); |
} |
- void SetPlayingBackgroundVideo(bool is_playing) { |
- delegate_manager_->is_playing_background_video_ = is_playing; |
- } |
- |
- void CallOnMediaDelegatePlay(int delegate_id) { |
- delegate_manager_->OnMediaDelegatePlay(delegate_id); |
- } |
- |
- void CallOnMediaDelegatePause(int delegate_id) { |
- delegate_manager_->OnMediaDelegatePause(delegate_id); |
- } |
- |
void SetIsLowEndDeviceForTesting() { |
delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, |
&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_; |
@@ -109,10 +100,10 @@ TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) { |
// Verify the playing message. |
{ |
- const bool kHasVideo = true, kHasAudio = false, kIsRemote = false; |
+ const bool kHasAudio = false, kHasVideo = true, kIsRemote = false; |
const media::MediaContentType kMediaContentType = |
media::MediaContentType::Transient; |
- delegate_manager_->DidPlay(delegate_id, kHasVideo, kHasAudio, kIsRemote, |
+ delegate_manager_->DidPlay(delegate_id, kHasAudio, kHasVideo, |
kMediaContentType); |
const IPC::Message* msg = test_sink().GetUniqueMessageMatching( |
@@ -131,8 +122,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 +153,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 +173,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 +182,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,58 +202,56 @@ 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()).WillOnce(Return(true)); |
+ 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()).WillOnce(Return(true)); |
+ EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true)); |
+ int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_); |
+ delegate_manager_->SetIdle(delegate_id_3, true); |
+ EXPECT_CALL(observer_3_, OnIdleTimeout()).WillOnce(Return(true)); |
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)); |
+ int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
+ delegate_manager_->SetIdle(delegate_id_1, true); |
+ // Return true from OnIdleTimeout() to indicate that it was handled. |
+ EXPECT_CALL(observer_1_, OnIdleTimeout()).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)) |
+ int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
+ delegate_manager_->SetIdle(delegate_id_1, true); |
+ // Return false from OnIdleTimeout() to indicate that it was not handled. |
+ // The observer should get another OnIdleTimeout() call. |
+ EXPECT_CALL(observer_1_, OnIdleTimeout()) |
.WillOnce(Return(false)) |
.WillOnce(Return(true)); |
tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
@@ -274,51 +261,23 @@ 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)); |
- tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
- base::RunLoop().RunUntilIdle(); |
- } |
- |
- // 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. |
- { |
- 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_2_, OnIdleTimeout()).WillOnce(Return(true)); |
tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
- run_loop.Run(); |
+ RunLoopOnce(); |
} |
- 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. |
+ // 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()).WillOnce(Return(true)); |
tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
- run_loop.Run(); |
+ RunLoopOnce(); |
} |
} |
@@ -327,84 +286,35 @@ TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) { |
EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
// Playing a local video adds it to the set. |
- delegate_manager_->DidPlay(delegate_id, true, true, false, |
+ delegate_manager_->DidPlay(delegate_id, true, true, |
MediaContentType::Persistent); |
EXPECT_TRUE(HasPlayingVideo(delegate_id)); |
// Pause doesn't remove the video from the set. |
- delegate_manager_->DidPause(delegate_id, false); |
+ delegate_manager_->DidPause(delegate_id); |
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, |
+ delegate_manager_->DidPlay(delegate_id, false, true, |
MediaContentType::Persistent); |
EXPECT_TRUE(HasPlayingVideo(delegate_id)); |
// Playing a local audio removes it from the set. |
- delegate_manager_->DidPlay(delegate_id, false, true, false, |
+ delegate_manager_->DidPlay(delegate_id, 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, |
+ delegate_manager_->DidPlay(delegate_id, true, true, |
MediaContentType::Persistent); |
delegate_manager_->RemoveObserver(delegate_id); |
EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
} |
-TEST_F(RendererWebMediaPlayerDelegateTest, IsPlayingBackgroundVideo) { |
- NiceMock<MockWebMediaPlayerDelegateObserver> observer; |
- int delegate_id = delegate_manager_->AddObserver(&observer); |
- EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo()); |
- |
- // Showing the frame always clears the flag. |
- SetPlayingBackgroundVideo(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()); |
- |
- // Pausing a currently playing video clears the flag. |
- delegate_manager_->DidPlay(delegate_id, true, true, false, |
- MediaContentType::Persistent); |
- CallOnMediaDelegatePause(delegate_id); |
- EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo()); |
- |
- // TODO(avayvod): this test can't mock the IsHidden() 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 defined(OS_ANDROID) |
TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) { |
@@ -415,28 +325,22 @@ TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) { |
// Pausing or showing doesn't record anything as background playback |
// hasn't started yet. |
- delegate_manager_->DidPlay(delegate_id, true, true, false, |
- MediaContentType::Persistent); |
- CallOnMediaDelegatePause(delegate_id); |
- histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); |
- |
- delegate_manager_->DidPlay(delegate_id, true, true, false, |
+ delegate_manager_->DidPlay(delegate_id, true, true, |
MediaContentType::Persistent); |
- delegate_manager_->WasShown(); |
+ RunLoopOnce(); |
+ delegate_manager_->DidPause(delegate_id); |
+ RunLoopOnce(); |
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, |
+ // Doing the same while hidden should record the time. |
+ delegate_manager_->SetFrameHiddenForTesting(true); |
+ delegate_manager_->DidPlay(delegate_id, true, true, |
MediaContentType::Persistent); |
- SetPlayingBackgroundVideo(true); |
- CallOnMediaDelegatePause(delegate_id); |
+ RunLoopOnce(); |
histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1); |
- delegate_manager_->DidPlay(delegate_id, true, true, false, |
- MediaContentType::Persistent); |
- SetPlayingBackgroundVideo(true); |
- delegate_manager_->WasShown(); |
+ delegate_manager_->SetFrameHiddenForTesting(false); |
+ RunLoopOnce(); |
histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2); |
} |