Chromium Code Reviews| Index: media/blink/webmediaplayer_impl_unittest.cc |
| diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc |
| index d7ef58e8525b61b96e94f1e8d190b290c12769e2..ea2582797f5c9b47622e45d6435a957da559608f 100644 |
| --- a/media/blink/webmediaplayer_impl_unittest.cc |
| +++ b/media/blink/webmediaplayer_impl_unittest.cc |
| @@ -111,13 +111,75 @@ class MockWebMediaPlayerDelegate |
| ~MockWebMediaPlayerDelegate() = default; |
| // WebMediaPlayerDelegate implementation. |
| - MOCK_METHOD1(AddObserver, int(Observer*)); |
| - MOCK_METHOD1(RemoveObserver, void(int)); |
| - MOCK_METHOD5(DidPlay, void(int, bool, bool, bool, MediaContentType)); |
| - MOCK_METHOD2(DidPause, void(int, bool)); |
| + int AddObserver(Observer* observer) override { |
| + DCHECK_EQ(nullptr, observer_); |
| + observer_ = observer; |
| + return player_id_; |
| + } |
| + |
| + void RemoveObserver(int player_id) override { |
| + DCHECK_EQ(player_id_, player_id); |
| + observer_ = nullptr; |
| + } |
| + |
| + MOCK_METHOD4(DidPlay, void(int, bool, bool, MediaContentType)); |
| + MOCK_METHOD1(DidPause, void(int)); |
| MOCK_METHOD1(PlayerGone, void(int)); |
| - MOCK_METHOD0(IsHidden, bool()); |
| - MOCK_METHOD0(IsPlayingBackgroundVideo, bool()); |
| + MOCK_METHOD0(IsBackgroundVideoPlaybackAllowed, bool()); |
| + |
| + void SetIdle(int player_id, bool is_idle) override { |
| + DCHECK_EQ(player_id_, player_id); |
| + is_idle_ = is_idle; |
| + is_stale_ &= is_idle; |
| + } |
| + |
| + bool IsIdle(int player_id) override { |
| + DCHECK_EQ(player_id_, player_id); |
| + return is_idle_; |
| + } |
| + |
| + void ClearStaleFlag(int player_id) override { |
| + DCHECK_EQ(player_id_, player_id); |
| + is_stale_ = false; |
| + } |
| + |
| + bool IsStale(int player_id) override { |
| + DCHECK_EQ(player_id_, player_id); |
| + return is_stale_; |
| + } |
| + |
| + // Currently |is_backgrounded| overrides this completely, so no explicit |
| + // control is needed. |
| + bool IsFrameHidden() override { return is_closed_; } |
| + |
| + bool IsFrameClosed() override { return is_closed_; } |
| + |
| + void SetIdleForTesting(bool is_idle) { is_idle_ = is_idle; } |
| + |
| + void SetStaleForTesting(bool is_stale) { |
| + is_idle_ |= is_stale; |
| + is_stale_ = is_stale; |
| + } |
| + |
| + // Returns true if the player does in fact expire. |
| + bool ExpireForTesting() { |
| + if (is_idle_ && !is_stale_) { |
| + if (observer_->OnIdleTimeout()) { |
| + is_stale_ = true; |
| + return true; |
| + } |
| + } |
| + return false; |
| + } |
| + |
| + void SetFrameClosedForTesting(bool is_closed) { is_closed_ = is_closed; } |
| + |
| + private: |
| + Observer* observer_ = nullptr; |
| + int player_id_ = 1234; |
| + bool is_idle_ = false; |
| + bool is_stale_ = false; |
| + bool is_closed_ = false; |
| }; |
| class WebMediaPlayerImplTest : public testing::Test { |
| @@ -189,51 +251,25 @@ class WebMediaPlayerImplTest : public testing::Test { |
| } |
| WebMediaPlayerImpl::PlayState ComputePlayState() { |
| - wmpi_->is_idle_ = false; |
| - wmpi_->must_suspend_ = false; |
| return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false); |
| } |
| - WebMediaPlayerImpl::PlayState ComputePlayStateSuspended() { |
| - wmpi_->is_idle_ = false; |
| - wmpi_->must_suspend_ = false; |
| - return wmpi_->UpdatePlayState_ComputePlayState(false, false, true, false); |
| - } |
| - |
| - WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { |
| - wmpi_->is_idle_ = false; |
| - wmpi_->must_suspend_ = false; |
| + WebMediaPlayerImpl::PlayState ComputePlayState_FrameHidden() { |
| return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, true); |
| } |
| - WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { |
| - wmpi_->is_idle_ = true; |
| - wmpi_->must_suspend_ = false; |
| - return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false); |
| - } |
| - |
| - WebMediaPlayerImpl::PlayState ComputeIdleSuspendedPlayState() { |
| - wmpi_->is_idle_ = true; |
| - wmpi_->must_suspend_ = false; |
| + WebMediaPlayerImpl::PlayState ComputePlayState_Suspended() { |
| return wmpi_->UpdatePlayState_ComputePlayState(false, false, true, false); |
| } |
| - WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() { |
| - wmpi_->is_idle_ = false; |
| - wmpi_->must_suspend_ = true; |
| - return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false); |
| + WebMediaPlayerImpl::PlayState ComputePlayState_Remote() { |
| + return wmpi_->UpdatePlayState_ComputePlayState(true, false, false, false); |
| } |
| - WebMediaPlayerImpl::PlayState ComputeStreamingPlayState(bool must_suspend) { |
| - wmpi_->is_idle_ = true; |
| - wmpi_->must_suspend_ = must_suspend; |
| + WebMediaPlayerImpl::PlayState ComputePlayState_BackgroundedStreaming() { |
| return wmpi_->UpdatePlayState_ComputePlayState(false, true, false, true); |
| } |
| - void SetDelegateState(WebMediaPlayerImpl::DelegateState state) { |
| - wmpi_->SetDelegateState(state); |
| - } |
| - |
| bool IsSuspended() { return wmpi_->pipeline_controller_.IsSuspended(); } |
| void AddBufferedRanges() { |
| @@ -249,6 +285,10 @@ class WebMediaPlayerImplTest : public testing::Test { |
| scoped_feature_list_.InitAndEnableFeature(kResumeBackgroundVideo); |
| } |
| + void SetDelegateState(WebMediaPlayerImpl::DelegateState state) { |
| + wmpi_->SetDelegateState(state, false); |
| + } |
| + |
| // "Renderer" thread. |
| base::MessageLoop message_loop_; |
| @@ -284,11 +324,12 @@ class WebMediaPlayerImplTest : public testing::Test { |
| TEST_F(WebMediaPlayerImplTest, ConstructAndDestroy) { |
| InitializeWebMediaPlayerImpl(); |
| + EXPECT_FALSE(IsSuspended()); |
| } |
| TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledBeforeLoadingBegins) { |
| InitializeWebMediaPlayerImpl(); |
| - wmpi_->OnSuspendRequested(false); |
| + EXPECT_TRUE(delegate_.ExpireForTesting()); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_TRUE(IsSuspended()); |
| } |
| @@ -303,7 +344,7 @@ TEST_F(WebMediaPlayerImplTest, |
| wmpi_->didLoadingProgress(); |
| // Advance less than the loading timeout. |
| clock->Advance(base::TimeDelta::FromSeconds(1)); |
| - wmpi_->OnSuspendRequested(false); |
| + EXPECT_FALSE(delegate_.ExpireForTesting()); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_FALSE(IsSuspended()); |
| } |
| @@ -317,344 +358,273 @@ TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledIfLoadingHasStalled) { |
| wmpi_->didLoadingProgress(); |
| // Advance more than the loading timeout. |
| clock->Advance(base::TimeDelta::FromSeconds(4)); |
| - wmpi_->OnSuspendRequested(false); |
| + EXPECT_TRUE(delegate_.ExpireForTesting()); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_TRUE(IsSuspended()); |
| } |
| TEST_F(WebMediaPlayerImplTest, DidLoadingProgressTriggersResume) { |
| + // Same setup as IdleSuspendIsEnabledBeforeLoadingBegins. |
| InitializeWebMediaPlayerImpl(); |
| - EXPECT_FALSE(IsSuspended()); |
| - wmpi_->OnSuspendRequested(false); |
| + EXPECT_TRUE(delegate_.ExpireForTesting()); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_TRUE(IsSuspended()); |
| + |
| + // Like IdleSuspendIsDisabledIfLoadingProgressedRecently, the idle timeout |
| + // should be rejected if it hasn't been long enough. |
| AddBufferedRanges(); |
| wmpi_->didLoadingProgress(); |
| + EXPECT_FALSE(delegate_.ExpireForTesting()); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_FALSE(IsSuspended()); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterConstruction) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_Constructed) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| - |
| - state = ComputePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeIdlePlayState(); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_HaveMetadata) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| - |
| - state = ComputePlayState(); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeIdlePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_HaveFutureData) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| - SetMetadata(true, false); |
| - |
| - state = ComputePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeIdlePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - SetPaused(false); |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| -} |
| - |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterFutureData) { |
| - InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - |
| - state = ComputePlayState(); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeBackgroundedPlayState(); |
| - |
| - if (base::FeatureList::IsEnabled(kResumeBackgroundVideo)) |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - else |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - // Idle suspension is possible after HaveFutureData. |
| - state = ComputeIdlePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| } |
| TEST_F(WebMediaPlayerImplTest, ComputePlayState_Playing) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(false); |
| - |
| - state = ComputePlayState(); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| + EXPECT_FALSE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeBackgroundedPlayState(); |
| - if (base::FeatureList::IsEnabled(kResumeBackgroundVideo)) |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - else |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| + EXPECT_TRUE(state.is_memory_reporting_enabled); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_PlayingThenUnderflow) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_Underflow) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(false); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveCurrentData); |
| - |
| - // Underflow should not trigger idle suspend. The user is still playing the |
| - // the video, just waiting on the network. |
| - state = ComputePlayState(); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| + EXPECT_FALSE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| + EXPECT_TRUE(state.is_memory_reporting_enabled); |
| +} |
| - // Background suspend should still be possible during underflow. |
| - state = ComputeBackgroundedPlayState(); |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_FrameHidden) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, true); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| + SetPaused(false); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden(); |
| + // TODO(sandersd): Make sure both variants are tested. |
|
whywhat
2016/12/12 18:11:23
nit: the enabled version should be tested on Andro
sandersd (OOO until July 31)
2017/01/05 23:12:21
Done.
|
| if (base::FeatureList::IsEnabled(kResumeBackgroundVideo)) |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| else |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_TRUE(state.is_suspended); |
| + EXPECT_FALSE(state.is_memory_reporting_enabled); |
| +} |
| - // Forced suspend should still be possible during underflow. |
| - state = ComputeMustSuspendPlayState(); |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_FrameClosed) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, true); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| + SetPaused(false); |
| + delegate_.SetFrameClosedForTesting(true); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_TRUE(state.is_suspended); |
| + EXPECT_FALSE(state.is_memory_reporting_enabled); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_Playing_AudioOnly) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_PausedSeek) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| - SetMetadata(true, false); |
| + SetMetadata(true, true); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| + SetSeeking(true); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| + EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| + EXPECT_FALSE(state.is_idle); |
| + EXPECT_FALSE(state.is_suspended); |
| + EXPECT_TRUE(state.is_memory_reporting_enabled); |
| +} |
| + |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_Ended) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(false); |
| + SetEnded(true); |
| + // Before Blink pauses us (or seeks for looping content), the media session |
| + // should be preserved. |
| + WebMediaPlayerImpl::PlayState state; |
| state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| + EXPECT_FALSE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - // Audio-only stays playing in the background. |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| EXPECT_TRUE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| - // Backgrounding a paused audio only player should suspend, but keep the |
| - // session alive for user interactions. |
| SetPaused(true); |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - state = ComputeMustSuspendPlayState(); |
| + state = ComputePlayState(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| + EXPECT_TRUE(state.is_idle); |
| + EXPECT_FALSE(state.is_suspended); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_StaysSuspended) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - SetSeeking(true); |
| - state = ComputePlayState(); |
| + // Should stay suspended even though not stale or backgrounded. |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState_Suspended(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| + EXPECT_TRUE(state.is_idle); |
| + EXPECT_TRUE(state.is_suspended); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Fullscreen) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_Remote) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - SetFullscreen(true); |
| - state = ComputePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| + // Remote media is always suspended. |
| + // TODO(sandersd): Decide whether this should count as idle or not. |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState_Remote(); |
| + EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| + EXPECT_TRUE(state.is_suspended); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_Ended) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_Fullscreen) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - SetEnded(true); |
| + SetFullscreen(true); |
| + SetPaused(true); |
| + delegate_.SetStaleForTesting(true); |
| - // The pipeline is not suspended immediately on ended. |
| - state = ComputePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + // Fullscreen media is never suspended (Android only behavior). |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState(); |
| + EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| - |
| - state = ComputeIdlePlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| } |
| TEST_F(WebMediaPlayerImplTest, ComputePlayState_Streaming) { |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| - |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(true); |
| + delegate_.SetStaleForTesting(true); |
| - // Streaming media should not suspend, even if paused, idle, and backgrounded. |
| - state = ComputeStreamingPlayState(false); |
| + // Streaming media should not suspend, even if paused, stale, and |
| + // backgrounded. |
| + WebMediaPlayerImpl::PlayState state; |
| + state = ComputePlayState_BackgroundedStreaming(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| + EXPECT_FALSE(state.is_memory_reporting_enabled); |
| // Streaming media should suspend when the tab is closed, regardless. |
| - state = ComputeStreamingPlayState(true); |
| + delegate_.SetFrameClosedForTesting(true); |
| + state = ComputePlayState_BackgroundedStreaming(); |
| EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + EXPECT_TRUE(state.is_idle); |
| EXPECT_TRUE(state.is_suspended); |
| + EXPECT_FALSE(state.is_memory_reporting_enabled); |
| } |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_Suspended) { |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_PlayingBackgroundedVideo) { |
| + SetupForResumingBackgroundVideo(); |
| + |
| InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| SetMetadata(true, true); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| + SetPaused(false); |
| + EXPECT_CALL(delegate_, IsBackgroundVideoPlaybackAllowed()) |
| + .WillRepeatedly(Return(true)); |
| - // Suspended players should be resumed unless we have reached the appropriate |
| - // ready state and are not seeking. |
| - SetPaused(true); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden(); |
| + EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| + EXPECT_FALSE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| + EXPECT_TRUE(state.is_memory_reporting_enabled); |
| +} |
| - // Paused players in the idle state are allowed to remain suspended. |
| - state = ComputeIdleSuspendedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| +TEST_F(WebMediaPlayerImplTest, ComputePlayState_AudioOnly) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, false); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(false); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| + |
| + // Backgrounded audio-only playback stays playing. |
| + WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden(); |
| + EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| + EXPECT_FALSE(state.is_idle); |
| EXPECT_FALSE(state.is_suspended); |
| + EXPECT_TRUE(state.is_memory_reporting_enabled); |
| +} |
| +TEST_F(WebMediaPlayerImplTest, AutoplayMuted_StartsAndStops) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, true); |
| SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - |
| - // Paused players should stay suspended. |
| - SetPaused(true); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| - |
| - // Playing players should resume into the playing state. |
| SetPaused(false); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| + client_.set_is_autoplaying_muted(true); |
| - // If seeking, the previously suspended state does not matter; the player |
| - // should always be resumed. |
| - SetSeeking(true); |
| + EXPECT_CALL(delegate_, DidPlay(_, false, true, _)); |
| + SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| - SetPaused(true); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| + client_.set_is_autoplaying_muted(false); |
| + EXPECT_CALL(delegate_, DidPlay(_, true, true, _)); |
| + SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| +} |
| +TEST_F(WebMediaPlayerImplTest, AutoplayMuted_SetVolume) { |
| + InitializeWebMediaPlayerImpl(); |
| + SetMetadata(true, true); |
| + SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| SetPaused(false); |
| - state = ComputePlayStateSuspended(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| + client_.set_is_autoplaying_muted(true); |
| + |
| + EXPECT_CALL(delegate_, DidPlay(_, false, true, _)); |
| + SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| + |
| + client_.set_is_autoplaying_muted(false); |
| + EXPECT_CALL(delegate_, DidPlay(_, true, true, _)); |
| + wmpi_->setVolume(1.0); |
| } |
| TEST_F(WebMediaPlayerImplTest, NaturalSizeChange) { |
| @@ -686,73 +656,4 @@ TEST_F(WebMediaPlayerImplTest, NaturalSizeChange_Rotated) { |
| ASSERT_EQ(blink::WebSize(1080, 1920), wmpi_->naturalSize()); |
| } |
| -// Audible backgrounded videos are not suspended if delegate_ allows it. |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_BackgroundedVideoPlaying) { |
| - InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| - SetMetadata(true, true); |
| - SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - |
| - SetupForResumingBackgroundVideo(); |
| - |
| - EXPECT_CALL(delegate_, IsPlayingBackgroundVideo()) |
| - .WillRepeatedly(Return(true)); |
| - EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true)); |
| - |
| - SetPaused(false); |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| - EXPECT_TRUE(state.is_memory_reporting_enabled); |
| - EXPECT_FALSE(state.is_suspended); |
| -} |
| - |
| -// Backgrounding audible videos should suspend them and report as paused, not |
| -// gone. |
| -TEST_F(WebMediaPlayerImplTest, ComputePlayState_BackgroundedVideoPaused) { |
| - InitializeWebMediaPlayerImpl(); |
| - WebMediaPlayerImpl::PlayState state; |
| - SetMetadata(true, true); |
| - SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - |
| - SetupForResumingBackgroundVideo(); |
| - |
| - EXPECT_CALL(delegate_, IsPlayingBackgroundVideo()).WillOnce(Return(false)); |
| - EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true)); |
| - |
| - state = ComputeBackgroundedPlayState(); |
| - EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| - EXPECT_FALSE(state.is_memory_reporting_enabled); |
| - EXPECT_TRUE(state.is_suspended); |
| -} |
| - |
| -TEST_F(WebMediaPlayerImplTest, AutoplayMuted_StartsAndStops) { |
| - InitializeWebMediaPlayerImpl(); |
| - SetMetadata(true, true); |
| - SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - SetPaused(false); |
| - |
| - EXPECT_CALL(delegate_, DidPlay(_, true, false, false, _)); |
| - client_.set_is_autoplaying_muted(true); |
| - SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| - |
| - EXPECT_CALL(delegate_, DidPlay(_, true, true, false, _)); |
| - client_.set_is_autoplaying_muted(false); |
| - SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| -} |
| - |
| -TEST_F(WebMediaPlayerImplTest, AutoplayMuted_SetVolume) { |
| - InitializeWebMediaPlayerImpl(); |
| - SetMetadata(true, true); |
| - SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| - SetPaused(false); |
| - |
| - EXPECT_CALL(delegate_, DidPlay(_, true, false, false, _)); |
| - client_.set_is_autoplaying_muted(true); |
| - SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); |
| - |
| - EXPECT_CALL(delegate_, DidPlay(_, true, true, false, _)); |
| - client_.set_is_autoplaying_muted(false); |
| - wmpi_->setVolume(1.0); |
| -} |
| - |
| } // namespace media |