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

Unified Diff: content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc

Issue 2490783002: Refactor WebMediaPlayerDelegate interface. (Closed)
Patch Set: Unit tests found a real bug! Created 3 years, 11 months 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/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);
}
« no previous file with comments | « content/renderer/media/renderer_webmediaplayer_delegate.cc ('k') | content/renderer/media/webmediaplayer_ms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698