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

Side by Side Diff: content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc

Issue 2490783002: Refactor WebMediaPlayerDelegate interface. (Closed)
Patch Set: Clarify comments and names. 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <tuple> 5 #include <tuple>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 12 matching lines...) Expand all
23 using testing::NiceMock; 23 using testing::NiceMock;
24 using testing::Return; 24 using testing::Return;
25 using testing::StrictMock; 25 using testing::StrictMock;
26 26
27 namespace media { 27 namespace media {
28 28
29 namespace { 29 namespace {
30 constexpr base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(1); 30 constexpr base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(1);
31 } 31 }
32 32
33 ACTION_P(RunClosure, closure) {
34 closure.Run();
35 return true;
36 }
37
38 class MockWebMediaPlayerDelegateObserver 33 class MockWebMediaPlayerDelegateObserver
39 : public WebMediaPlayerDelegate::Observer { 34 : public WebMediaPlayerDelegate::Observer {
40 public: 35 public:
41 MockWebMediaPlayerDelegateObserver() {} 36 MockWebMediaPlayerDelegateObserver() {}
42 ~MockWebMediaPlayerDelegateObserver() {} 37 ~MockWebMediaPlayerDelegateObserver() {}
43 38
44 // WebMediaPlayerDelegate::Observer implementation. 39 // WebMediaPlayerDelegate::Observer implementation.
45 MOCK_METHOD0(OnHidden, void()); 40 MOCK_METHOD0(OnFrameHidden, void());
46 MOCK_METHOD0(OnShown, void()); 41 MOCK_METHOD0(OnFrameClosed, void());
47 MOCK_METHOD1(OnSuspendRequested, bool(bool)); 42 MOCK_METHOD0(OnFrameShown, void());
43 MOCK_METHOD0(OnIdleTimeout, bool());
48 MOCK_METHOD0(OnPlay, void()); 44 MOCK_METHOD0(OnPlay, void());
49 MOCK_METHOD0(OnPause, void()); 45 MOCK_METHOD0(OnPause, void());
50 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double)); 46 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double));
51 }; 47 };
52 48
53 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest { 49 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest {
54 public: 50 public:
55 RendererWebMediaPlayerDelegateTest() {} 51 RendererWebMediaPlayerDelegateTest() {}
56 ~RendererWebMediaPlayerDelegateTest() override {} 52 ~RendererWebMediaPlayerDelegateTest() override {}
57 53
(...skipping 12 matching lines...) Expand all
70 RenderViewTest::TearDown(); 66 RenderViewTest::TearDown();
71 } 67 }
72 68
73 protected: 69 protected:
74 IPC::TestSink& test_sink() { return render_thread_->sink(); } 70 IPC::TestSink& test_sink() { return render_thread_->sink(); }
75 71
76 bool HasPlayingVideo(int delegate_id) { 72 bool HasPlayingVideo(int delegate_id) {
77 return delegate_manager_->playing_videos_.count(delegate_id); 73 return delegate_manager_->playing_videos_.count(delegate_id);
78 } 74 }
79 75
80 void SetPlayingBackgroundVideo(bool is_playing) {
81 delegate_manager_->is_playing_background_video_ = is_playing;
82 }
83
84 void CallOnMediaDelegatePlay(int delegate_id) {
85 delegate_manager_->OnMediaDelegatePlay(delegate_id);
86 }
87
88 void CallOnMediaDelegatePause(int delegate_id) {
89 delegate_manager_->OnMediaDelegatePause(delegate_id);
90 }
91
92 void SetIsLowEndDeviceForTesting() { 76 void SetIsLowEndDeviceForTesting() {
93 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, 77 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout,
94 &tick_clock_, true); 78 &tick_clock_, true);
95 } 79 }
96 80
81 void RunLoopOnce() {
82 base::RunLoop run_loop;
83 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
84 run_loop.QuitClosure());
85 run_loop.Run();
86 }
87
97 std::unique_ptr<RendererWebMediaPlayerDelegate> delegate_manager_; 88 std::unique_ptr<RendererWebMediaPlayerDelegate> delegate_manager_;
98 StrictMock<MockWebMediaPlayerDelegateObserver> observer_1_, observer_2_, 89 StrictMock<MockWebMediaPlayerDelegateObserver> observer_1_, observer_2_,
99 observer_3_; 90 observer_3_;
100 base::SimpleTestTickClock tick_clock_; 91 base::SimpleTestTickClock tick_clock_;
101 92
102 private: 93 private:
103 DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegateTest); 94 DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegateTest);
104 }; 95 };
105 96
106 TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) { 97 TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) {
107 StrictMock<MockWebMediaPlayerDelegateObserver> observer; 98 StrictMock<MockWebMediaPlayerDelegateObserver> observer;
108 const int delegate_id = delegate_manager_->AddObserver(&observer); 99 const int delegate_id = delegate_manager_->AddObserver(&observer);
109 100
110 // Verify the playing message. 101 // Verify the playing message.
111 { 102 {
112 const bool kHasVideo = true, kHasAudio = false, kIsRemote = false; 103 const bool kHasAudio = false, kHasVideo = true, kIsRemote = false;
113 const media::MediaContentType kMediaContentType = 104 const media::MediaContentType kMediaContentType =
114 media::MediaContentType::Transient; 105 media::MediaContentType::Transient;
115 delegate_manager_->DidPlay(delegate_id, kHasVideo, kHasAudio, kIsRemote, 106 delegate_manager_->DidPlay(delegate_id, kHasAudio, kHasVideo,
116 kMediaContentType); 107 kMediaContentType);
117 108
118 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( 109 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(
119 MediaPlayerDelegateHostMsg_OnMediaPlaying::ID); 110 MediaPlayerDelegateHostMsg_OnMediaPlaying::ID);
120 ASSERT_TRUE(msg); 111 ASSERT_TRUE(msg);
121 112
122 std::tuple<int, bool, bool, bool, media::MediaContentType> result; 113 std::tuple<int, bool, bool, bool, media::MediaContentType> result;
123 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPlaying::Read(msg, &result)); 114 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPlaying::Read(msg, &result));
124 EXPECT_EQ(delegate_id, std::get<0>(result)); 115 EXPECT_EQ(delegate_id, std::get<0>(result));
125 EXPECT_EQ(kHasVideo, std::get<1>(result)); 116 EXPECT_EQ(kHasVideo, std::get<1>(result));
126 EXPECT_EQ(kHasAudio, std::get<2>(result)); 117 EXPECT_EQ(kHasAudio, std::get<2>(result));
127 EXPECT_EQ(kIsRemote, std::get<3>(result)); 118 EXPECT_EQ(kIsRemote, std::get<3>(result));
128 EXPECT_EQ(kMediaContentType, std::get<4>(result)); 119 EXPECT_EQ(kMediaContentType, std::get<4>(result));
129 } 120 }
130 121
131 // Verify the paused message. 122 // Verify the paused message.
132 { 123 {
133 test_sink().ClearMessages(); 124 test_sink().ClearMessages();
134 const bool kReachedEndOfStream = true; 125 const bool kReachedEndOfStream = false;
135 delegate_manager_->DidPause(delegate_id, kReachedEndOfStream); 126 delegate_manager_->DidPause(delegate_id);
136 127
137 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( 128 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(
138 MediaPlayerDelegateHostMsg_OnMediaPaused::ID); 129 MediaPlayerDelegateHostMsg_OnMediaPaused::ID);
139 ASSERT_TRUE(msg); 130 ASSERT_TRUE(msg);
140 131
141 std::tuple<int, bool> result; 132 std::tuple<int, bool> result;
142 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPaused::Read(msg, &result)); 133 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPaused::Read(msg, &result));
143 EXPECT_EQ(delegate_id, std::get<0>(result)); 134 EXPECT_EQ(delegate_id, std::get<0>(result));
144 EXPECT_EQ(kReachedEndOfStream, std::get<1>(result)); 135 EXPECT_EQ(kReachedEndOfStream, std::get<1>(result));
145 } 136 }
146 137
147 // Verify the destruction message. 138 // Verify the destruction message.
148 { 139 {
149 test_sink().ClearMessages(); 140 test_sink().ClearMessages();
150 delegate_manager_->PlayerGone(delegate_id); 141 delegate_manager_->PlayerGone(delegate_id);
151 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( 142 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(
152 MediaPlayerDelegateHostMsg_OnMediaDestroyed::ID); 143 MediaPlayerDelegateHostMsg_OnMediaDestroyed::ID);
153 ASSERT_TRUE(msg); 144 ASSERT_TRUE(msg);
154 145
155 std::tuple<int> result; 146 std::tuple<int> result;
156 ASSERT_TRUE( 147 ASSERT_TRUE(
157 MediaPlayerDelegateHostMsg_OnMediaDestroyed::Read(msg, &result)); 148 MediaPlayerDelegateHostMsg_OnMediaDestroyed::Read(msg, &result));
158 EXPECT_EQ(delegate_id, std::get<0>(result)); 149 EXPECT_EQ(delegate_id, std::get<0>(result));
159 } 150 }
160 } 151 }
161 152
162 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) { 153 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) {
163 const int delegate_id = delegate_manager_->AddObserver(&observer_1_); 154 const int delegate_id = delegate_manager_->AddObserver(&observer_1_);
164 155
165 EXPECT_CALL(observer_1_, OnHidden()); 156 EXPECT_CALL(observer_1_, OnFrameHidden());
166 delegate_manager_->WasHidden(); 157 delegate_manager_->WasHidden();
167 158
168 EXPECT_CALL(observer_1_, OnShown()); 159 EXPECT_CALL(observer_1_, OnFrameShown());
169 delegate_manager_->WasShown(); 160 delegate_manager_->WasShown();
170 161
171 EXPECT_CALL(observer_1_, OnPause()); 162 EXPECT_CALL(observer_1_, OnPause());
172 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id); 163 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id);
173 delegate_manager_->OnMessageReceived(pause_msg); 164 delegate_manager_->OnMessageReceived(pause_msg);
174 165
175 EXPECT_CALL(observer_1_, OnPlay()); 166 EXPECT_CALL(observer_1_, OnPlay());
176 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id); 167 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id);
177 delegate_manager_->OnMessageReceived(play_msg); 168 delegate_manager_->OnMessageReceived(play_msg);
178 169
179 const double kTestMultiplier = 0.5; 170 const double kTestMultiplier = 0.5;
180 EXPECT_CALL(observer_1_, OnVolumeMultiplierUpdate(kTestMultiplier)); 171 EXPECT_CALL(observer_1_, OnVolumeMultiplierUpdate(kTestMultiplier));
181 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id, 172 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id,
182 kTestMultiplier); 173 kTestMultiplier);
183 delegate_manager_->OnMessageReceived(volume_msg); 174 delegate_manager_->OnMessageReceived(volume_msg);
184 175
185 EXPECT_CALL(observer_1_, OnSuspendRequested(true)); 176 EXPECT_CALL(observer_1_, OnFrameClosed());
186 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0); 177 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0);
187 delegate_manager_->OnMessageReceived(suspend_msg); 178 delegate_manager_->OnMessageReceived(suspend_msg);
188 } 179 }
189 180
190 TEST_F(RendererWebMediaPlayerDelegateTest, TheTimerIsInitiallyStopped) { 181 TEST_F(RendererWebMediaPlayerDelegateTest, TheTimerIsInitiallyStopped) {
191 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 182 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
192 } 183 }
193 184
194 TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnObserverStartsTheTimer) { 185 TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnIdleObserverStartsTheTimer) {
195 delegate_manager_->AddObserver(&observer_1_); 186 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
187 delegate_manager_->SetIdle(delegate_id_1, true);
188 RunLoopOnce();
196 ASSERT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 189 ASSERT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
197 } 190 }
198 191
199 TEST_F(RendererWebMediaPlayerDelegateTest, RemovingAllObserversStopsTheTimer) { 192 TEST_F(RendererWebMediaPlayerDelegateTest, RemovingAllObserversStopsTheTimer) {
200 delegate_manager_->RemoveObserver( 193 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
201 delegate_manager_->AddObserver(&observer_1_)); 194 delegate_manager_->SetIdle(delegate_id_1, true);
195 RunLoopOnce();
196 delegate_manager_->RemoveObserver(delegate_id_1);
197 RunLoopOnce();
202 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 198 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
203 } 199 }
204 200
205 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingDelegatesAreNotIdle) {
206 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
207 delegate_manager_->DidPlay(delegate_id_1, true, true, false,
208 media::MediaContentType::Persistent);
209 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
210 }
211
212 TEST_F(RendererWebMediaPlayerDelegateTest, PlaySuspendsLowEndIdleDelegates) { 201 TEST_F(RendererWebMediaPlayerDelegateTest, PlaySuspendsLowEndIdleDelegates) {
213 SetIsLowEndDeviceForTesting(); 202 SetIsLowEndDeviceForTesting();
214 203
215 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); 204 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
216 delegate_manager_->AddObserver(&observer_2_); 205 delegate_manager_->SetIdle(delegate_id_1, true);
206 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
207 delegate_manager_->SetIdle(delegate_id_2, true);
208 RunLoopOnce();
217 209
218 // Calling play on the first player should suspend the other idle player. 210 // Calling play on the first player should suspend the other idle player.
219 EXPECT_CALL(observer_2_, OnSuspendRequested(false)); 211 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true));
212 delegate_manager_->DidPlay(delegate_id_1, true, true,
213 media::MediaContentType::Persistent);
214 delegate_manager_->SetIdle(delegate_id_1, false);
220 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); 215 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1));
221 delegate_manager_->DidPlay(delegate_id_1, true, true, false, 216 RunLoopOnce();
222 media::MediaContentType::Persistent);
223 } 217 }
224 218
225 TEST_F(RendererWebMediaPlayerDelegateTest, MaxLowEndIdleDelegates) { 219 TEST_F(RendererWebMediaPlayerDelegateTest, MaxLowEndIdleDelegates) {
226 SetIsLowEndDeviceForTesting(); 220 SetIsLowEndDeviceForTesting();
227 221
228 delegate_manager_->AddObserver(&observer_1_); 222 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
229 delegate_manager_->AddObserver(&observer_2_); 223 delegate_manager_->SetIdle(delegate_id_1, true);
224 int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
225 delegate_manager_->SetIdle(delegate_id_2, true);
226 RunLoopOnce();
230 227
231 // Just adding a third idle observer should suspend the others. 228 // Just adding a third idle observer should suspend all idle players.
232 EXPECT_CALL(observer_1_, OnSuspendRequested(false)); 229 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true));
233 EXPECT_CALL(observer_2_, OnSuspendRequested(false)); 230 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true));
231 int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_);
232 delegate_manager_->SetIdle(delegate_id_3, true);
233 EXPECT_CALL(observer_3_, OnIdleTimeout()).WillOnce(Return(true));
234 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); 234 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1));
235 delegate_manager_->AddObserver(&observer_3_); 235 RunLoopOnce();
236 }
237
238 // Make sure it's safe to call DidPause(), which modifies the idle delegate
239 // list, from OnSuspendRequested(), which iterates over the idle delegate list.
240 TEST_F(RendererWebMediaPlayerDelegateTest, ReentrantDelegateCallsAreSafe) {
241 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
242 EXPECT_CALL(observer_1_, OnSuspendRequested(false))
243 .WillOnce(RunClosure(base::Bind(&RendererWebMediaPlayerDelegate::DidPause,
244 base::Unretained(delegate_manager_.get()),
245 delegate_id_1, false)));
246 // Run an idle cleanup.
247 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
248 base::RunLoop().RunUntilIdle();
249 } 236 }
250 237
251 TEST_F(RendererWebMediaPlayerDelegateTest, 238 TEST_F(RendererWebMediaPlayerDelegateTest,
252 SuspendRequestsAreOnlySentOnceIfHandled) { 239 SuspendRequestsAreOnlySentOnceIfHandled) {
253 delegate_manager_->AddObserver(&observer_1_); 240 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
254 // Return true from OnSuspendRequested() to indicate that it was handled. So 241 delegate_manager_->SetIdle(delegate_id_1, true);
255 // even though the player did not call PlayerGone() it should be removed from 242 // Return true from OnIdleTimeout() to indicate that it was handled.
256 // future idle cleanup polls. 243 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true));
257 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true));
258 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 244 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
259 base::RunLoop().RunUntilIdle(); 245 base::RunLoop().RunUntilIdle();
260 } 246 }
261 247
262 TEST_F(RendererWebMediaPlayerDelegateTest, 248 TEST_F(RendererWebMediaPlayerDelegateTest,
263 SuspendRequestsAreSentAgainIfNotHandled) { 249 SuspendRequestsAreSentAgainIfNotHandled) {
264 delegate_manager_->AddObserver(&observer_1_); 250 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
265 // Return false from OnSuspendRequested() to indicate that it was not handled. 251 delegate_manager_->SetIdle(delegate_id_1, true);
266 // The observer should get another OnSuspendRequested. 252 // Return false from OnIdleTimeout() to indicate that it was not handled.
267 EXPECT_CALL(observer_1_, OnSuspendRequested(false)) 253 // The observer should get another OnIdleTimeout() call.
254 EXPECT_CALL(observer_1_, OnIdleTimeout())
268 .WillOnce(Return(false)) 255 .WillOnce(Return(false))
269 .WillOnce(Return(true)); 256 .WillOnce(Return(true));
270 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 257 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
271 base::RunLoop().RunUntilIdle(); 258 base::RunLoop().RunUntilIdle();
272 } 259 }
273 260
274 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) { 261 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) {
275 // Add one non-idle observer and one idle observer. 262 // Add one non-idle observer and one idle observer.
276 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); 263 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_);
277 delegate_manager_->DidPlay(delegate_id_1, true, true, false, 264 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_);
278 media::MediaContentType::Persistent); 265 delegate_manager_->SetIdle(delegate_id_2, true);
279 delegate_manager_->AddObserver(&observer_2_);
280 266
281 // The idle cleanup task should suspend the second delegate while the first is 267 // The idle cleanup task should suspend the second delegate while the first is
282 // kept alive. 268 // kept alive.
283 { 269 {
284 EXPECT_CALL(observer_2_, OnSuspendRequested(false)).WillOnce(Return(true)); 270 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true));
285 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 271 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
286 base::RunLoop().RunUntilIdle(); 272 RunLoopOnce();
287 } 273 }
288 274
289 // Pausing should count as idle if playback didn't reach end of stream, but 275 // Once the player is idle, it should be suspended after |kIdleTimeout|.
290 // in this case the player will not remove the MediaSession. 276 delegate_manager_->SetIdle(delegate_id_1, true);
291 delegate_manager_->DidPause(delegate_id_1, false /* reached_end_of_stream */);
292 const int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_);
293 delegate_manager_->DidPlay(delegate_id_3, true, true, false,
294 media::MediaContentType::Persistent);
295
296 // Adding the observer should instantly queue the timeout task. Once run only
297 // the first player should be suspended.
298 { 277 {
299 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true)); 278 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true));
300 base::RunLoop run_loop;
301 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
302 run_loop.QuitClosure());
303 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 279 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
304 run_loop.Run(); 280 RunLoopOnce();
305 }
306
307 delegate_manager_->DidPlay(delegate_id_1, true, true, false,
308 media::MediaContentType::Persistent);
309
310 // Pausing after reaching end of stream should count as idle.
311 delegate_manager_->DidPause(delegate_id_1, true /* reached_end_of_stream */);
312
313 // Once the timeout task runs the first delegate should be suspended while the
314 // third is kept alive.
315 {
316 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true));
317 base::RunLoop run_loop;
318 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
319 run_loop.QuitClosure());
320 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
321 run_loop.Run();
322 } 281 }
323 } 282 }
324 283
325 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) { 284 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) {
326 int delegate_id = delegate_manager_->AddObserver(&observer_1_); 285 int delegate_id = delegate_manager_->AddObserver(&observer_1_);
327 EXPECT_FALSE(HasPlayingVideo(delegate_id)); 286 EXPECT_FALSE(HasPlayingVideo(delegate_id));
328 287
329 // Playing a local video adds it to the set. 288 // Playing a local video adds it to the set.
330 delegate_manager_->DidPlay(delegate_id, true, true, false, 289 delegate_manager_->DidPlay(delegate_id, true, true,
331 MediaContentType::Persistent); 290 MediaContentType::Persistent);
332 EXPECT_TRUE(HasPlayingVideo(delegate_id)); 291 EXPECT_TRUE(HasPlayingVideo(delegate_id));
333 292
334 // Pause doesn't remove the video from the set. 293 // Pause doesn't remove the video from the set.
335 delegate_manager_->DidPause(delegate_id, false); 294 delegate_manager_->DidPause(delegate_id);
336 EXPECT_TRUE(HasPlayingVideo(delegate_id)); 295 EXPECT_TRUE(HasPlayingVideo(delegate_id));
337 296
338 // Reaching the end removes the video from the set. 297 // Reaching the end removes the video from the set.
339 delegate_manager_->DidPause(delegate_id, true);
340 EXPECT_FALSE(HasPlayingVideo(delegate_id));
341
342 // Removing the player removes the video from the set.
343 delegate_manager_->DidPlay(delegate_id, true, true, false,
344 MediaContentType::Persistent);
345 delegate_manager_->PlayerGone(delegate_id); 298 delegate_manager_->PlayerGone(delegate_id);
346 EXPECT_FALSE(HasPlayingVideo(delegate_id)); 299 EXPECT_FALSE(HasPlayingVideo(delegate_id));
347 300
348 // Playing a remote video removes it from the set.
349 delegate_manager_->DidPlay(delegate_id, true, true, false,
350 MediaContentType::Persistent);
351 delegate_manager_->DidPlay(delegate_id, true, true, true,
352 MediaContentType::Persistent);
353 EXPECT_FALSE(HasPlayingVideo(delegate_id));
354
355 // Playing a local video without audio adds it to the set (because of WMPA). 301 // Playing a local video without audio adds it to the set (because of WMPA).
356 delegate_manager_->DidPlay(delegate_id, true, false, false, 302 delegate_manager_->DidPlay(delegate_id, false, true,
357 MediaContentType::Persistent); 303 MediaContentType::Persistent);
358 EXPECT_TRUE(HasPlayingVideo(delegate_id)); 304 EXPECT_TRUE(HasPlayingVideo(delegate_id));
359 305
360 // Playing a local audio removes it from the set. 306 // Playing a local audio removes it from the set.
361 delegate_manager_->DidPlay(delegate_id, false, true, false, 307 delegate_manager_->DidPlay(delegate_id, true, false,
362 MediaContentType::Persistent); 308 MediaContentType::Persistent);
363 EXPECT_FALSE(HasPlayingVideo(delegate_id)); 309 EXPECT_FALSE(HasPlayingVideo(delegate_id));
364 310
365 // Removing the observer also removes the video from the set. 311 // Removing the observer also removes the video from the set.
366 delegate_manager_->DidPlay(delegate_id, true, true, false, 312 delegate_manager_->DidPlay(delegate_id, true, true,
367 MediaContentType::Persistent); 313 MediaContentType::Persistent);
368 delegate_manager_->RemoveObserver(delegate_id); 314 delegate_manager_->RemoveObserver(delegate_id);
369 EXPECT_FALSE(HasPlayingVideo(delegate_id)); 315 EXPECT_FALSE(HasPlayingVideo(delegate_id));
370 } 316 }
371 317
372 TEST_F(RendererWebMediaPlayerDelegateTest, IsPlayingBackgroundVideo) {
373 NiceMock<MockWebMediaPlayerDelegateObserver> observer;
374 int delegate_id = delegate_manager_->AddObserver(&observer);
375 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
376
377 // Showing the frame always clears the flag.
378 SetPlayingBackgroundVideo(true);
379 delegate_manager_->WasShown();
380 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
381
382 // Pausing anything other than a local playing video doesn't affect the flag.
383 SetPlayingBackgroundVideo(true);
384 CallOnMediaDelegatePause(delegate_id);
385 EXPECT_TRUE(delegate_manager_->IsPlayingBackgroundVideo());
386
387 // Pausing a currently playing video clears the flag.
388 delegate_manager_->DidPlay(delegate_id, true, true, false,
389 MediaContentType::Persistent);
390 CallOnMediaDelegatePause(delegate_id);
391 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo());
392
393 // TODO(avayvod): this test can't mock the IsHidden() method.
394 // Just test that the value changes or doesn't depending on whether the video
395 // is currently playing.
396 bool old_value = !delegate_manager_->IsHidden();
397 SetPlayingBackgroundVideo(old_value);
398 delegate_manager_->DidPause(delegate_id, true);
399 CallOnMediaDelegatePlay(delegate_id);
400 EXPECT_EQ(old_value, delegate_manager_->IsPlayingBackgroundVideo());
401
402 delegate_manager_->DidPlay(delegate_id, true, true, false,
403 MediaContentType::Persistent);
404 CallOnMediaDelegatePlay(delegate_id);
405 EXPECT_NE(old_value, delegate_manager_->IsPlayingBackgroundVideo());
406 }
407
408 #if defined(OS_ANDROID) 318 #if defined(OS_ANDROID)
409 319
410 TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) { 320 TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) {
411 NiceMock<MockWebMediaPlayerDelegateObserver> observer; 321 NiceMock<MockWebMediaPlayerDelegateObserver> observer;
412 int delegate_id = delegate_manager_->AddObserver(&observer); 322 int delegate_id = delegate_manager_->AddObserver(&observer);
413 base::HistogramTester histogram_tester; 323 base::HistogramTester histogram_tester;
414 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); 324 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
415 325
416 // Pausing or showing doesn't record anything as background playback 326 // Pausing or showing doesn't record anything as background playback
417 // hasn't started yet. 327 // hasn't started yet.
418 delegate_manager_->DidPlay(delegate_id, true, true, false, 328 delegate_manager_->DidPlay(delegate_id, true, true,
419 MediaContentType::Persistent); 329 MediaContentType::Persistent);
420 CallOnMediaDelegatePause(delegate_id); 330 RunLoopOnce();
331 delegate_manager_->DidPause(delegate_id);
332 RunLoopOnce();
421 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); 333 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
422 334
423 delegate_manager_->DidPlay(delegate_id, true, true, false, 335 // Doing the same while hidden should record the time.
336 delegate_manager_->SetFrameHiddenForTesting(true);
337 delegate_manager_->DidPlay(delegate_id, true, true,
424 MediaContentType::Persistent); 338 MediaContentType::Persistent);
425 delegate_manager_->WasShown(); 339 RunLoopOnce();
426 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0);
427
428 // Doing this things after the background playback has started should record
429 // the time.
430 delegate_manager_->DidPlay(delegate_id, true, true, false,
431 MediaContentType::Persistent);
432 SetPlayingBackgroundVideo(true);
433 CallOnMediaDelegatePause(delegate_id);
434 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1); 340 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1);
435 341
436 delegate_manager_->DidPlay(delegate_id, true, true, false, 342 delegate_manager_->SetFrameHiddenForTesting(false);
437 MediaContentType::Persistent); 343 RunLoopOnce();
438 SetPlayingBackgroundVideo(true);
439 delegate_manager_->WasShown();
440 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2); 344 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2);
441 } 345 }
442 346
443 #endif // OS_ANDROID 347 #endif // OS_ANDROID
444 348
445 } // namespace media 349 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698