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

Side by Side Diff: content/browser/media/session/media_session_visibility_browsertest_base.cc

Issue 1819113002: [MediaSession, Android] Adding visibility tests for MediaSession (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use default timeouts Created 4 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/media/session/media_session_visibility_browsertest_bas e.h"
6
7 #include "base/command_line.h"
8 #include "base/test/test_timeouts.h"
9 #include "base/timer/elapsed_timer.h"
10 #include "content/browser/media/session/media_session.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/common/content_switches.h"
13 #include "content/public/test/content_browser_test_utils.h"
14 #include "content/public/test/test_navigation_observer.h"
15 #include "content/shell/browser/shell.h"
16 #include "media/base/media_switches.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace {
20 static const char kStartPlayerScript[] =
21 "document.getElementById('long-video').play()";
22 static const char kPausePlayerScript[] =
23 "document.getElementById('long-video').pause()";
24 }
25
26 using content::MediaSessionVisibilityBrowserTestBase;
27
28 void MediaSessionVisibilityBrowserTestBase::SetUpOnMainThread() {
29 ContentBrowserTest::SetUpOnMainThread();
30 web_contents_ = shell()->web_contents();
31 media_session_ = MediaSession::Get(web_contents_);
32 }
33
34 void MediaSessionVisibilityBrowserTestBase::SetUpCommandLine(
35 base::CommandLine* command_line) {
36 command_line->AppendSwitch(
37 switches::kDisableGestureRequirementForMediaPlayback);
38 #if !defined(OS_ANDROID)
39 command_line->AppendSwitch(
40 switches::kEnableDefaultMediaSession);
41 #endif // !defined(OS_ANDROID)
42 }
43
44 void MediaSessionVisibilityBrowserTestBase::LoadTestPage() {
45 TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
46 shell()->LoadURL(GetTestUrl("android/media", "media-session.html"));
47 navigation_observer.Wait();
48 }
49
50 void MediaSessionVisibilityBrowserTestBase::RunScript(std::string script) {
51 content::ExecuteScriptAndGetValue(
52 web_contents_->GetMainFrame(), script);
53 }
54
55 // TODO(zqzhang): This method is shared with
56 // MediaVisibilityTests. Move it into a general place.
57 bool MediaSessionVisibilityBrowserTestBase::ConditionalWait(
58 base::TimeDelta timeout,
59 base::TimeDelta interval,
60 const base::Callback<bool(void)>& callback) {
61 base::ElapsedTimer timer;
62 do {
63 if (callback.Run())
64 return true;
65
66 base::RunLoop run_loop;
67 base::MessageLoop::current()->PostDelayedTask(
68 FROM_HERE, run_loop.QuitClosure(), interval);
69 run_loop.Run();
70 } while (timer.Elapsed() < timeout);
71
72 return false;
73 }
74
75 void MediaSessionVisibilityBrowserTestBase::Wait(base::TimeDelta timeout) {
76 base::RunLoop run_loop;
77 base::MessageLoop::current()->PostDelayedTask(
78 FROM_HERE, run_loop.QuitClosure(), timeout);
79 run_loop.Run();
80 }
81
82 bool MediaSessionVisibilityBrowserTestBase::IsMediaSessionActive() {
83 return media_session_->audio_focus_state_ == MediaSession::State::ACTIVE;
84 }
85
86 bool MediaSessionVisibilityBrowserTestBase::IsMediaSessionSuspended() {
87 return media_session_->audio_focus_state_ == MediaSession::State::SUSPENDED;
88 }
89
90 bool MediaSessionVisibilityBrowserTestBase::IsMediaSessionInactive() {
91 return media_session_->audio_focus_state_ == MediaSession::State::INACTIVE;
92 }
93
94 bool MediaSessionVisibilityBrowserTestBase::WaitForMediaSessionActive() {
95 return ConditionalWait(
96 TestTimeouts::action_timeout(),
97 TestTimeouts::tiny_timeout(),
98 base::Bind(
99 &MediaSessionVisibilityBrowserTestBase::IsMediaSessionActive,
100 base::Unretained(this)));
101 }
102
103 bool MediaSessionVisibilityBrowserTestBase::WaitForMediaSessionSuspended() {
104 return ConditionalWait(
105 TestTimeouts::action_timeout(),
106 TestTimeouts::tiny_timeout(),
107 base::Bind(
108 &MediaSessionVisibilityBrowserTestBase::IsMediaSessionSuspended,
109 base::Unretained(this)));
110 }
111
112 bool MediaSessionVisibilityBrowserTestBase::WaitForMediaSessionInactive() {
113 return ConditionalWait(
114 TestTimeouts::action_timeout(),
115 TestTimeouts::tiny_timeout(),
116 base::Bind(
117 &MediaSessionVisibilityBrowserTestBase::IsMediaSessionInactive,
118 base::Unretained(this)));
119 }
120
121 void MediaSessionVisibilityBrowserTestBase
122 ::TestSessionInactiveWhenHiddenAfterContentPause() {
123 LoadTestPage();
124
125 RunScript(kStartPlayerScript);
126 ASSERT_TRUE(WaitForMediaSessionActive());
127
128 RunScript(kPausePlayerScript);
129 ASSERT_TRUE(WaitForMediaSessionSuspended());
130
131 web_contents_->WasHidden();
132 ASSERT_TRUE(WaitForMediaSessionInactive());
133 }
134
135 void MediaSessionVisibilityBrowserTestBase
136 ::TestSessionInactiveWhenHiddenWhilePlaying() {
137 LoadTestPage();
138
139 RunScript(kStartPlayerScript);
140 ASSERT_TRUE(WaitForMediaSessionActive());
141
142 web_contents_->WasHidden();
143 ASSERT_TRUE(WaitForMediaSessionInactive());
144 }
145
146 void MediaSessionVisibilityBrowserTestBase
147 ::TestSessionSuspendedWhenHiddenAfterContentPause() {
148 LoadTestPage();
149
150 RunScript(kStartPlayerScript);
151 ASSERT_TRUE(WaitForMediaSessionActive());
152
153 RunScript(kPausePlayerScript);
154 ASSERT_TRUE(WaitForMediaSessionSuspended());
155
156 // Wait for 1 second and check the MediaSession state.
157 // No better solution till now.
158 web_contents_->WasHidden();
159 Wait(base::TimeDelta::FromSeconds(1));
160 ASSERT_TRUE(IsMediaSessionSuspended());
161 }
162
163 void MediaSessionVisibilityBrowserTestBase
164 ::TestSessionActiveWhenHiddenWhilePlaying() {
165 LoadTestPage();
166
167 RunScript(kStartPlayerScript);
168 ASSERT_TRUE(WaitForMediaSessionActive());
169
170 // Wait for 1 second and check the MediaSession state.
171 // No better solution till now.
172 web_contents_->WasHidden();
173 Wait(base::TimeDelta::FromSeconds(1));
174 ASSERT_TRUE(IsMediaSessionActive());
175 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698