Chromium Code Reviews| Index: content/browser/media/session/media_session_visibility_browsertest_base.cc |
| diff --git a/content/browser/media/session/media_session_visibility_browsertest_base.cc b/content/browser/media/session/media_session_visibility_browsertest_base.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..439b129243ed84e3a969669364daff94316eb9c8 |
| --- /dev/null |
| +++ b/content/browser/media/session/media_session_visibility_browsertest_base.cc |
| @@ -0,0 +1,167 @@ |
| +// Copyright 2016 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_visibility_browsertest_base.h" |
| + |
| +#include "base/command_line.h" |
| +#include "content/public/browser/web_contents.h" |
| +#include "content/public/common/content_switches.h" |
| +#include "content/public/test/browser_test_utils.h" |
| +#include "content/public/test/content_browser_test_utils.h" |
| +#include "content/public/test/test_navigation_observer.h" |
| +#include "content/shell/browser/shell.h" |
| +#include "media/base/media_switches.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace content { |
| +namespace { |
| +static const char kStartPlayerScript[] = |
| + "document.getElementById('long-video').play()"; |
| +static const char kPausePlayerScript[] = |
| + "document.getElementById('long-video').pause()"; |
| +} |
| + |
| +MediaSessionVisibilityBrowserTestBase:: |
| + MediaSessionVisibilityBrowserTestBase() { |
|
DaleCurtis
2016/03/31 16:50:26
Is this the style that git cl format applied? It s
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
Done.
|
| +} |
| + |
| +MediaSessionVisibilityBrowserTestBase:: |
| + ~MediaSessionVisibilityBrowserTestBase() { |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::SetUpOnMainThread() { |
| + ContentBrowserTest::SetUpOnMainThread(); |
| + web_contents_ = shell()->web_contents(); |
| + media_session_ = MediaSession::Get(web_contents_); |
| + |
| + media_session_state_loop_runners_[MediaSession::State::ACTIVE] = |
| + new MessageLoopRunner; |
|
DaleCurtis
2016/03/31 16:50:26
() after class name. ditto for all "new XXX" below
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
Done.
|
| + media_session_state_loop_runners_[MediaSession::State::SUSPENDED] = |
| + new MessageLoopRunner; |
| + media_session_state_loop_runners_[MediaSession::State::INACTIVE] = |
| + new MessageLoopRunner; |
| + media_session_state_callback_subscription_ = |
| + media_session_->RegisterMediaSessionStateChangedCallbackForTest( |
| + base::Bind(&MediaSessionVisibilityBrowserTestBase:: |
| + OnMediaSessionStateChanged, |
| + base::Unretained(this))); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::TearDownOnMainThread() { |
| + // Unsubscribe the callback subscription before tearing down, so that the |
| + // CallbackList in MediaSession will be empty when it is destroyed. |
| + media_session_state_callback_subscription_.reset(); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::SetUpCommandLine( |
| + base::CommandLine* command_line) { |
| + command_line->AppendSwitch( |
| + switches::kDisableGestureRequirementForMediaPlayback); |
| +#if !defined(OS_ANDROID) |
| + command_line->AppendSwitch( |
| + switches::kEnableDefaultMediaSession); |
| +#endif // !defined(OS_ANDROID) |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::LoadTestPage() { |
| + TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
| + shell()->LoadURL(GetTestUrl("android/media", "media-session.html")); |
| + navigation_observer.Wait(); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::RunScript(std::string script) { |
|
DaleCurtis
2016/03/31 16:50:26
const& for strings.
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
Done.
|
| + ASSERT_TRUE(ExecuteScript(web_contents_->GetMainFrame(), script)); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase:: |
| +ClearMediaSessionStateLoopRunners() { |
| + for (auto& state_loop_runner : media_session_state_loop_runners_) |
| + state_loop_runner.second = new MessageLoopRunner; |
|
DaleCurtis
2016/03/31 16:50:26
()
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
Done.
|
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::OnMediaSessionStateChanged( |
| + MediaSession::State state) { |
| + ASSERT_TRUE(media_session_state_loop_runners_.count(state)); |
| + media_session_state_loop_runners_[state]->Quit(); |
| +} |
| + |
| + |
|
DaleCurtis
2016/03/31 16:50:26
Extra line.
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
Done.
|
| +void MediaSessionVisibilityBrowserTestBase::Wait(base::TimeDelta timeout) { |
|
DaleCurtis
2016/03/31 16:50:26
You don't really need this, but up to you. THe bro
Zhiqiang Zhang (Slow)
2016/03/31 19:58:39
I think we still need this since this is for verif
|
| + base::RunLoop run_loop; |
| + base::MessageLoop::current()->PostDelayedTask( |
| + FROM_HERE, run_loop.QuitClosure(), timeout); |
| + run_loop.Run(); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase::WaitForMediaSessionState( |
| + MediaSession::State state) { |
| + ASSERT_TRUE(media_session_state_loop_runners_.count(state)); |
| + media_session_state_loop_runners_[state]->Run(); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase:: |
| + TestSessionInactiveWhenHiddenAfterContentPause() { |
| + LoadTestPage(); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kStartPlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::ACTIVE); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kPausePlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::SUSPENDED); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + web_contents_->WasHidden(); |
| + WaitForMediaSessionState(MediaSession::State::INACTIVE); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase:: |
| + TestSessionInactiveWhenHiddenWhilePlaying() { |
| + LoadTestPage(); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kStartPlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::ACTIVE); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + web_contents_->WasHidden(); |
| + WaitForMediaSessionState(MediaSession::State::INACTIVE); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase:: |
| + TestSessionSuspendedWhenHiddenAfterContentPause() { |
| + LoadTestPage(); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kStartPlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::ACTIVE); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kPausePlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::SUSPENDED); |
| + |
| + // Wait for 1 second and check the MediaSession state. |
| + // No better solution till now. |
| + web_contents_->WasHidden(); |
| + Wait(base::TimeDelta::FromSeconds(1)); |
| + ASSERT_EQ(media_session_->audio_focus_state_, MediaSession::State::SUSPENDED); |
| +} |
| + |
| +void MediaSessionVisibilityBrowserTestBase:: |
| + TestSessionActiveWhenHiddenWhilePlaying() { |
| + LoadTestPage(); |
| + |
| + ClearMediaSessionStateLoopRunners(); |
| + RunScript(kStartPlayerScript); |
| + WaitForMediaSessionState(MediaSession::State::ACTIVE); |
| + |
| + // Wait for 1 second and check the MediaSession state. |
| + // No better solution till now. |
| + web_contents_->WasHidden(); |
| + Wait(base::TimeDelta::FromSeconds(1)); |
| + ASSERT_EQ(media_session_->audio_focus_state_, MediaSession::State::ACTIVE); |
| +} |
| + |
| +} // namespace content |