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

Side by Side Diff: media/blink/webmediaplayer_impl_unittest.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 unified diff | Download patch
« no previous file with comments | « media/blink/webmediaplayer_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "media/blink/webmediaplayer_impl.h" 5 #include "media/blink/webmediaplayer_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 }; 104 };
105 105
106 class MockWebMediaPlayerDelegate 106 class MockWebMediaPlayerDelegate
107 : public WebMediaPlayerDelegate, 107 : public WebMediaPlayerDelegate,
108 public base::SupportsWeakPtr<MockWebMediaPlayerDelegate> { 108 public base::SupportsWeakPtr<MockWebMediaPlayerDelegate> {
109 public: 109 public:
110 MockWebMediaPlayerDelegate() = default; 110 MockWebMediaPlayerDelegate() = default;
111 ~MockWebMediaPlayerDelegate() = default; 111 ~MockWebMediaPlayerDelegate() = default;
112 112
113 // WebMediaPlayerDelegate implementation. 113 // WebMediaPlayerDelegate implementation.
114 MOCK_METHOD1(AddObserver, int(Observer*)); 114 int AddObserver(Observer* observer) override {
115 MOCK_METHOD1(RemoveObserver, void(int)); 115 DCHECK_EQ(nullptr, observer_);
116 MOCK_METHOD5(DidPlay, void(int, bool, bool, bool, MediaContentType)); 116 observer_ = observer;
117 MOCK_METHOD2(DidPause, void(int, bool)); 117 return player_id_;
118 }
119
120 void RemoveObserver(int player_id) override {
121 DCHECK_EQ(player_id_, player_id);
122 observer_ = nullptr;
123 }
124
125 MOCK_METHOD4(DidPlay, void(int, bool, bool, MediaContentType));
126 MOCK_METHOD1(DidPause, void(int));
118 MOCK_METHOD1(PlayerGone, void(int)); 127 MOCK_METHOD1(PlayerGone, void(int));
119 MOCK_METHOD0(IsHidden, bool()); 128 MOCK_METHOD0(IsBackgroundVideoPlaybackUnlocked, bool());
120 MOCK_METHOD0(IsPlayingBackgroundVideo, bool()); 129
130 void SetIdle(int player_id, bool is_idle) override {
131 DCHECK_EQ(player_id_, player_id);
132 is_idle_ = is_idle;
133 is_stale_ &= is_idle;
134 }
135
136 bool IsIdle(int player_id) override {
137 DCHECK_EQ(player_id_, player_id);
138 return is_idle_;
139 }
140
141 void ClearStaleFlag(int player_id) override {
142 DCHECK_EQ(player_id_, player_id);
143 is_stale_ = false;
144 }
145
146 bool IsStale(int player_id) override {
147 DCHECK_EQ(player_id_, player_id);
148 return is_stale_;
149 }
150
151 bool IsFrameHidden() override { return is_hidden_; }
152
153 bool IsFrameClosed() override { return is_closed_; }
154
155 void SetIdleForTesting(bool is_idle) { is_idle_ = is_idle; }
156
157 void SetStaleForTesting(bool is_stale) {
158 is_idle_ |= is_stale;
159 is_stale_ = is_stale;
160 }
161
162 // Returns true if the player does in fact expire.
163 bool ExpireForTesting() {
164 if (is_idle_ && !is_stale_) {
165 is_stale_ = true;
166 observer_->OnIdleTimeout();
167 }
168
169 return is_stale_;
170 }
171
172 void SetFrameHiddenForTesting(bool is_hidden) { is_hidden_ = is_hidden; }
173
174 void SetFrameClosedForTesting(bool is_closed) { is_closed_ = is_closed; }
175
176 private:
177 Observer* observer_ = nullptr;
178 int player_id_ = 1234;
179 bool is_idle_ = false;
180 bool is_stale_ = false;
181 bool is_hidden_ = false;
182 bool is_closed_ = false;
121 }; 183 };
122 184
123 class WebMediaPlayerImplTest : public testing::Test { 185 class WebMediaPlayerImplTest : public testing::Test {
124 public: 186 public:
125 WebMediaPlayerImplTest() 187 WebMediaPlayerImplTest()
126 : media_thread_("MediaThreadForTest"), 188 : media_thread_("MediaThreadForTest"),
127 web_view_(blink::WebView::create(nullptr, 189 web_view_(blink::WebView::create(nullptr,
128 blink::WebPageVisibilityStateVisible)), 190 blink::WebPageVisibilityStateVisible)),
129 web_local_frame_( 191 web_local_frame_(
130 blink::WebLocalFrame::create(blink::WebTreeScopeType::Document, 192 blink::WebLocalFrame::create(blink::WebTreeScopeType::Document,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 wmpi_->pipeline_metadata_.has_video = has_video; 244 wmpi_->pipeline_metadata_.has_video = has_video;
183 } 245 }
184 246
185 void OnMetadata(PipelineMetadata metadata) { wmpi_->OnMetadata(metadata); } 247 void OnMetadata(PipelineMetadata metadata) { wmpi_->OnMetadata(metadata); }
186 248
187 void OnVideoNaturalSizeChange(const gfx::Size& size) { 249 void OnVideoNaturalSizeChange(const gfx::Size& size) {
188 wmpi_->OnVideoNaturalSizeChange(size); 250 wmpi_->OnVideoNaturalSizeChange(size);
189 } 251 }
190 252
191 WebMediaPlayerImpl::PlayState ComputePlayState() { 253 WebMediaPlayerImpl::PlayState ComputePlayState() {
192 wmpi_->is_idle_ = false;
193 wmpi_->must_suspend_ = false;
194 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false); 254 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false);
195 } 255 }
196 256
197 WebMediaPlayerImpl::PlayState ComputePlayStateSuspended() { 257 WebMediaPlayerImpl::PlayState ComputePlayState_FrameHidden() {
198 wmpi_->is_idle_ = false; 258 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, true);
199 wmpi_->must_suspend_ = false; 259 }
260
261 WebMediaPlayerImpl::PlayState ComputePlayState_Suspended() {
200 return wmpi_->UpdatePlayState_ComputePlayState(false, false, true, false); 262 return wmpi_->UpdatePlayState_ComputePlayState(false, false, true, false);
201 } 263 }
202 264
203 WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { 265 WebMediaPlayerImpl::PlayState ComputePlayState_Remote() {
204 wmpi_->is_idle_ = false; 266 return wmpi_->UpdatePlayState_ComputePlayState(true, false, false, false);
205 wmpi_->must_suspend_ = false;
206 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, true);
207 } 267 }
208 268
209 WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { 269 WebMediaPlayerImpl::PlayState ComputePlayState_BackgroundedStreaming() {
210 wmpi_->is_idle_ = true;
211 wmpi_->must_suspend_ = false;
212 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false);
213 }
214
215 WebMediaPlayerImpl::PlayState ComputeIdleSuspendedPlayState() {
216 wmpi_->is_idle_ = true;
217 wmpi_->must_suspend_ = false;
218 return wmpi_->UpdatePlayState_ComputePlayState(false, false, true, false);
219 }
220
221 WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() {
222 wmpi_->is_idle_ = false;
223 wmpi_->must_suspend_ = true;
224 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, false);
225 }
226
227 WebMediaPlayerImpl::PlayState ComputeStreamingPlayState(bool must_suspend) {
228 wmpi_->is_idle_ = true;
229 wmpi_->must_suspend_ = must_suspend;
230 return wmpi_->UpdatePlayState_ComputePlayState(false, true, false, true); 270 return wmpi_->UpdatePlayState_ComputePlayState(false, true, false, true);
231 } 271 }
232 272
233 void SetDelegateState(WebMediaPlayerImpl::DelegateState state) {
234 wmpi_->SetDelegateState(state);
235 }
236
237 bool IsSuspended() { return wmpi_->pipeline_controller_.IsSuspended(); } 273 bool IsSuspended() { return wmpi_->pipeline_controller_.IsSuspended(); }
238 274
239 void AddBufferedRanges() { 275 void AddBufferedRanges() {
240 wmpi_->buffered_data_source_host_.AddBufferedByteRange(0, 1); 276 wmpi_->buffered_data_source_host_.AddBufferedByteRange(0, 1);
241 } 277 }
242 278
243 void SetupForResumingBackgroundVideo() { 279 void SetDelegateState(WebMediaPlayerImpl::DelegateState state) {
244 #if !defined(OS_ANDROID) 280 wmpi_->SetDelegateState(state, false);
245 // Need to enable media suspend to test resuming background videos.
246 base::CommandLine::ForCurrentProcess()->AppendSwitch(
247 switches::kEnableMediaSuspend);
248 #endif // !defined(OS_ANDROID)
249 scoped_feature_list_.InitAndEnableFeature(kResumeBackgroundVideo);
250 }
251
252 void SetBackgroundVideoOptimization(bool enable) {
253 if (enable) {
254 scoped_feature_list_.InitAndEnableFeature(
255 kBackgroundVideoTrackOptimization);
256 } else {
257 scoped_feature_list_.InitAndDisableFeature(
258 kBackgroundVideoTrackOptimization);
259 }
260 } 281 }
261 282
262 bool ShouldDisableVideoWhenHidden() const { 283 bool ShouldDisableVideoWhenHidden() const {
263 return wmpi_->ShouldDisableVideoWhenHidden(); 284 return wmpi_->ShouldDisableVideoWhenHidden();
264 } 285 }
265 286
266 void SetVideoKeyframeDistanceAverage(base::TimeDelta value) { 287 void SetVideoKeyframeDistanceAverage(base::TimeDelta value) {
267 PipelineStatistics statistics; 288 PipelineStatistics statistics;
268 statistics.video_keyframe_distance_average = value; 289 statistics.video_keyframe_distance_average = value;
269 wmpi_->SetPipelineStatisticsForTest(statistics); 290 wmpi_->SetPipelineStatisticsForTest(statistics);
(...skipping 19 matching lines...) Expand all
289 310
290 // The client interface used by |wmpi_|. Just a dummy for now, but later we 311 // The client interface used by |wmpi_|. Just a dummy for now, but later we
291 // may want a mock or intelligent fake. 312 // may want a mock or intelligent fake.
292 DummyWebMediaPlayerClient client_; 313 DummyWebMediaPlayerClient client_;
293 314
294 testing::NiceMock<MockWebMediaPlayerDelegate> delegate_; 315 testing::NiceMock<MockWebMediaPlayerDelegate> delegate_;
295 316
296 // The WebMediaPlayerImpl instance under test. 317 // The WebMediaPlayerImpl instance under test.
297 std::unique_ptr<WebMediaPlayerImpl> wmpi_; 318 std::unique_ptr<WebMediaPlayerImpl> wmpi_;
298 319
299 private:
300 base::test::ScopedFeatureList scoped_feature_list_;
301
302 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImplTest); 320 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImplTest);
303 }; 321 };
304 322
305 TEST_F(WebMediaPlayerImplTest, ConstructAndDestroy) { 323 TEST_F(WebMediaPlayerImplTest, ConstructAndDestroy) {
306 InitializeWebMediaPlayerImpl(); 324 InitializeWebMediaPlayerImpl();
325 EXPECT_FALSE(IsSuspended());
307 } 326 }
308 327
309 TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledBeforeLoadingBegins) { 328 TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledBeforeLoadingBegins) {
310 InitializeWebMediaPlayerImpl(); 329 InitializeWebMediaPlayerImpl();
311 wmpi_->OnSuspendRequested(false); 330 EXPECT_TRUE(delegate_.ExpireForTesting());
312 base::RunLoop().RunUntilIdle(); 331 base::RunLoop().RunUntilIdle();
313 EXPECT_TRUE(IsSuspended()); 332 EXPECT_TRUE(IsSuspended());
314 } 333 }
315 334
316 TEST_F(WebMediaPlayerImplTest, 335 TEST_F(WebMediaPlayerImplTest,
317 IdleSuspendIsDisabledIfLoadingProgressedRecently) { 336 IdleSuspendIsDisabledIfLoadingProgressedRecently) {
318 InitializeWebMediaPlayerImpl(); 337 InitializeWebMediaPlayerImpl();
319 base::SimpleTestTickClock* clock = new base::SimpleTestTickClock(); 338 base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
320 clock->Advance(base::TimeDelta::FromSeconds(1)); 339 clock->Advance(base::TimeDelta::FromSeconds(1));
321 SetTickClock(clock); 340 SetTickClock(clock);
322 AddBufferedRanges(); 341 AddBufferedRanges();
323 wmpi_->didLoadingProgress(); 342 wmpi_->didLoadingProgress();
324 // Advance less than the loading timeout. 343 // Advance less than the loading timeout.
325 clock->Advance(base::TimeDelta::FromSeconds(1)); 344 clock->Advance(base::TimeDelta::FromSeconds(1));
326 wmpi_->OnSuspendRequested(false); 345 EXPECT_FALSE(delegate_.ExpireForTesting());
327 base::RunLoop().RunUntilIdle(); 346 base::RunLoop().RunUntilIdle();
328 EXPECT_FALSE(IsSuspended()); 347 EXPECT_FALSE(IsSuspended());
329 } 348 }
330 349
331 TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledIfLoadingHasStalled) { 350 TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledIfLoadingHasStalled) {
332 InitializeWebMediaPlayerImpl(); 351 InitializeWebMediaPlayerImpl();
333 base::SimpleTestTickClock* clock = new base::SimpleTestTickClock(); 352 base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
334 clock->Advance(base::TimeDelta::FromSeconds(1)); 353 clock->Advance(base::TimeDelta::FromSeconds(1));
335 SetTickClock(clock); 354 SetTickClock(clock);
336 AddBufferedRanges(); 355 AddBufferedRanges();
337 wmpi_->didLoadingProgress(); 356 wmpi_->didLoadingProgress();
338 // Advance more than the loading timeout. 357 // Advance more than the loading timeout.
339 clock->Advance(base::TimeDelta::FromSeconds(4)); 358 clock->Advance(base::TimeDelta::FromSeconds(4));
340 wmpi_->OnSuspendRequested(false); 359 EXPECT_TRUE(delegate_.ExpireForTesting());
341 base::RunLoop().RunUntilIdle(); 360 base::RunLoop().RunUntilIdle();
342 EXPECT_TRUE(IsSuspended()); 361 EXPECT_TRUE(IsSuspended());
343 } 362 }
344 363
345 TEST_F(WebMediaPlayerImplTest, DidLoadingProgressTriggersResume) { 364 TEST_F(WebMediaPlayerImplTest, DidLoadingProgressTriggersResume) {
346 InitializeWebMediaPlayerImpl(); 365 // Same setup as IdleSuspendIsEnabledBeforeLoadingBegins.
347 EXPECT_FALSE(IsSuspended()); 366 InitializeWebMediaPlayerImpl();
348 wmpi_->OnSuspendRequested(false); 367 EXPECT_TRUE(delegate_.ExpireForTesting());
349 base::RunLoop().RunUntilIdle(); 368 base::RunLoop().RunUntilIdle();
350 EXPECT_TRUE(IsSuspended()); 369 EXPECT_TRUE(IsSuspended());
370
371 // Like IdleSuspendIsDisabledIfLoadingProgressedRecently, the idle timeout
372 // should be rejected if it hasn't been long enough.
351 AddBufferedRanges(); 373 AddBufferedRanges();
352 wmpi_->didLoadingProgress(); 374 wmpi_->didLoadingProgress();
375 EXPECT_FALSE(delegate_.ExpireForTesting());
353 base::RunLoop().RunUntilIdle(); 376 base::RunLoop().RunUntilIdle();
354 EXPECT_FALSE(IsSuspended()); 377 EXPECT_FALSE(IsSuspended());
355 } 378 }
356 379
357 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterConstruction) { 380 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Constructed) {
358 InitializeWebMediaPlayerImpl(); 381 InitializeWebMediaPlayerImpl();
382 WebMediaPlayerImpl::PlayState state = ComputePlayState();
383 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
384 EXPECT_TRUE(state.is_idle);
385 EXPECT_FALSE(state.is_suspended);
386 EXPECT_FALSE(state.is_memory_reporting_enabled);
387 }
388
389 TEST_F(WebMediaPlayerImplTest, ComputePlayState_HaveMetadata) {
390 InitializeWebMediaPlayerImpl();
391 SetMetadata(true, true);
392 WebMediaPlayerImpl::PlayState state = ComputePlayState();
393 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
394 EXPECT_TRUE(state.is_idle);
395 EXPECT_FALSE(state.is_suspended);
396 EXPECT_FALSE(state.is_memory_reporting_enabled);
397 }
398
399 TEST_F(WebMediaPlayerImplTest, ComputePlayState_HaveFutureData) {
400 InitializeWebMediaPlayerImpl();
401 SetMetadata(true, true);
402 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
403 WebMediaPlayerImpl::PlayState state = ComputePlayState();
404 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
405 EXPECT_TRUE(state.is_idle);
406 EXPECT_FALSE(state.is_suspended);
407 EXPECT_FALSE(state.is_memory_reporting_enabled);
408 }
409
410 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Playing) {
411 InitializeWebMediaPlayerImpl();
412 SetMetadata(true, true);
413 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
414 SetPaused(false);
415 WebMediaPlayerImpl::PlayState state = ComputePlayState();
416 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
417 EXPECT_FALSE(state.is_idle);
418 EXPECT_FALSE(state.is_suspended);
419 EXPECT_TRUE(state.is_memory_reporting_enabled);
420 }
421
422 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Underflow) {
423 InitializeWebMediaPlayerImpl();
424 SetMetadata(true, true);
425 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
426 SetPaused(false);
427 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveCurrentData);
428 WebMediaPlayerImpl::PlayState state = ComputePlayState();
429 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
430 EXPECT_FALSE(state.is_idle);
431 EXPECT_FALSE(state.is_suspended);
432 EXPECT_TRUE(state.is_memory_reporting_enabled);
433 }
434
435 TEST_F(WebMediaPlayerImplTest, ComputePlayState_FrameHidden) {
436 InitializeWebMediaPlayerImpl();
437 SetMetadata(true, true);
438 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
439 SetPaused(false);
440
441 {
442 base::test::ScopedFeatureList scoped_feature_list;
443 scoped_feature_list.InitAndEnableFeature(kResumeBackgroundVideo);
444
445 WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden();
446 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
447 EXPECT_TRUE(state.is_idle);
448 EXPECT_TRUE(state.is_suspended);
449 EXPECT_FALSE(state.is_memory_reporting_enabled);
450 }
451
452 {
453 base::test::ScopedFeatureList scoped_feature_list;
454 scoped_feature_list.InitAndDisableFeature(kResumeBackgroundVideo);
455
456 WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden();
457 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
458 EXPECT_TRUE(state.is_idle);
459 EXPECT_TRUE(state.is_suspended);
460 EXPECT_FALSE(state.is_memory_reporting_enabled);
461 }
462 }
463
464 TEST_F(WebMediaPlayerImplTest, ComputePlayState_FrameClosed) {
465 InitializeWebMediaPlayerImpl();
466 SetMetadata(true, true);
467 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
468 SetPaused(false);
469 delegate_.SetFrameClosedForTesting(true);
470 WebMediaPlayerImpl::PlayState state = ComputePlayState();
471 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
472 EXPECT_TRUE(state.is_idle);
473 EXPECT_TRUE(state.is_suspended);
474 EXPECT_FALSE(state.is_memory_reporting_enabled);
475 }
476
477 TEST_F(WebMediaPlayerImplTest, ComputePlayState_PausedSeek) {
478 InitializeWebMediaPlayerImpl();
479 SetMetadata(true, true);
480 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
481 SetSeeking(true);
482 WebMediaPlayerImpl::PlayState state = ComputePlayState();
483 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
484 EXPECT_FALSE(state.is_idle);
485 EXPECT_FALSE(state.is_suspended);
486 EXPECT_TRUE(state.is_memory_reporting_enabled);
487 }
488
489 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Ended) {
490 InitializeWebMediaPlayerImpl();
491 SetMetadata(true, true);
492 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
493 SetPaused(false);
494 SetEnded(true);
495
496 // Before Blink pauses us (or seeks for looping content), the media session
497 // should be preserved.
359 WebMediaPlayerImpl::PlayState state; 498 WebMediaPlayerImpl::PlayState state;
360
361 state = ComputePlayState(); 499 state = ComputePlayState();
362 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 500 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
363 EXPECT_FALSE(state.is_memory_reporting_enabled); 501 EXPECT_FALSE(state.is_idle);
364 EXPECT_FALSE(state.is_suspended); 502 EXPECT_FALSE(state.is_suspended);
365 503 EXPECT_TRUE(state.is_memory_reporting_enabled);
366 state = ComputeIdlePlayState(); 504
367 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 505 SetPaused(true);
368 EXPECT_FALSE(state.is_memory_reporting_enabled); 506 state = ComputePlayState();
369 EXPECT_TRUE(state.is_suspended); 507 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
370 508 EXPECT_TRUE(state.is_idle);
371 state = ComputeBackgroundedPlayState(); 509 EXPECT_FALSE(state.is_suspended);
372 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 510 EXPECT_FALSE(state.is_memory_reporting_enabled);
373 EXPECT_FALSE(state.is_memory_reporting_enabled); 511 }
374 EXPECT_FALSE(state.is_suspended); 512
375 513 TEST_F(WebMediaPlayerImplTest, ComputePlayState_StaysSuspended) {
376 state = ComputeMustSuspendPlayState(); 514 InitializeWebMediaPlayerImpl();
377 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 515 SetMetadata(true, true);
378 EXPECT_FALSE(state.is_memory_reporting_enabled); 516 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
379 EXPECT_TRUE(state.is_suspended); 517
380 } 518 // Should stay suspended even though not stale or backgrounded.
381 519 WebMediaPlayerImpl::PlayState state = ComputePlayState_Suspended();
382 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata) { 520 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
383 InitializeWebMediaPlayerImpl(); 521 EXPECT_TRUE(state.is_idle);
522 EXPECT_TRUE(state.is_suspended);
523 EXPECT_FALSE(state.is_memory_reporting_enabled);
524 }
525
526 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Remote) {
527 InitializeWebMediaPlayerImpl();
528 SetMetadata(true, true);
529 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
530
531 // Remote media is always suspended.
532 // TODO(sandersd): Decide whether this should count as idle or not.
533 WebMediaPlayerImpl::PlayState state = ComputePlayState_Remote();
534 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
535 EXPECT_TRUE(state.is_suspended);
536 EXPECT_FALSE(state.is_memory_reporting_enabled);
537 }
538
539 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Fullscreen) {
540 InitializeWebMediaPlayerImpl();
541 SetMetadata(true, true);
542 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
543 SetFullscreen(true);
544 SetPaused(true);
545 delegate_.SetStaleForTesting(true);
546
547 // Fullscreen media is never suspended (Android only behavior).
548 WebMediaPlayerImpl::PlayState state = ComputePlayState();
549 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
550 EXPECT_TRUE(state.is_idle);
551 EXPECT_FALSE(state.is_suspended);
552 EXPECT_FALSE(state.is_memory_reporting_enabled);
553 }
554
555 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Streaming) {
556 InitializeWebMediaPlayerImpl();
557 SetMetadata(true, true);
558 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
559 SetPaused(true);
560 delegate_.SetStaleForTesting(true);
561
562 // Streaming media should not suspend, even if paused, stale, and
563 // backgrounded.
384 WebMediaPlayerImpl::PlayState state; 564 WebMediaPlayerImpl::PlayState state;
385 SetMetadata(true, true); 565 state = ComputePlayState_BackgroundedStreaming();
386 566 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
387 state = ComputePlayState(); 567 EXPECT_TRUE(state.is_idle);
388 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 568 EXPECT_FALSE(state.is_suspended);
389 EXPECT_FALSE(state.is_memory_reporting_enabled); 569 EXPECT_FALSE(state.is_memory_reporting_enabled);
390 EXPECT_FALSE(state.is_suspended); 570
391 571 // Streaming media should suspend when the tab is closed, regardless.
392 state = ComputeIdlePlayState(); 572 delegate_.SetFrameClosedForTesting(true);
393 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 573 state = ComputePlayState_BackgroundedStreaming();
394 EXPECT_FALSE(state.is_memory_reporting_enabled); 574 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
395 EXPECT_TRUE(state.is_suspended); 575 EXPECT_TRUE(state.is_idle);
396 576 EXPECT_TRUE(state.is_suspended);
397 state = ComputeBackgroundedPlayState(); 577 EXPECT_FALSE(state.is_memory_reporting_enabled);
398 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 578 }
399 EXPECT_FALSE(state.is_memory_reporting_enabled); 579
400 EXPECT_TRUE(state.is_suspended); 580 TEST_F(WebMediaPlayerImplTest, ComputePlayState_PlayingBackgroundedVideo) {
401 581 base::test::ScopedFeatureList scoped_feature_list;
402 state = ComputeMustSuspendPlayState(); 582 scoped_feature_list.InitAndEnableFeature(kResumeBackgroundVideo);
403 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 583
404 EXPECT_FALSE(state.is_memory_reporting_enabled); 584 InitializeWebMediaPlayerImpl();
405 EXPECT_TRUE(state.is_suspended); 585 SetMetadata(true, true);
406 } 586 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
407 587 SetPaused(false);
408 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { 588 EXPECT_CALL(delegate_, IsBackgroundVideoPlaybackUnlocked())
409 InitializeWebMediaPlayerImpl(); 589 .WillRepeatedly(Return(true));
410 WebMediaPlayerImpl::PlayState state; 590
591 WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden();
592 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
593 EXPECT_FALSE(state.is_idle);
594 EXPECT_FALSE(state.is_suspended);
595 EXPECT_TRUE(state.is_memory_reporting_enabled);
596 }
597
598 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AudioOnly) {
599 InitializeWebMediaPlayerImpl();
411 SetMetadata(true, false); 600 SetMetadata(true, false);
412 601 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
413 state = ComputePlayState(); 602 SetPaused(false);
414 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 603
415 EXPECT_FALSE(state.is_memory_reporting_enabled); 604 // Backgrounded audio-only playback stays playing.
416 EXPECT_FALSE(state.is_suspended); 605 WebMediaPlayerImpl::PlayState state = ComputePlayState_FrameHidden();
417 606 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
418 state = ComputeIdlePlayState(); 607 EXPECT_FALSE(state.is_idle);
419 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 608 EXPECT_FALSE(state.is_suspended);
420 EXPECT_FALSE(state.is_memory_reporting_enabled); 609 EXPECT_TRUE(state.is_memory_reporting_enabled);
421 EXPECT_TRUE(state.is_suspended); 610 }
422 611
423 SetPaused(false); 612 TEST_F(WebMediaPlayerImplTest, AutoplayMuted_StartsAndStops) {
424 state = ComputeBackgroundedPlayState(); 613 InitializeWebMediaPlayerImpl();
425 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 614 SetMetadata(true, true);
426 EXPECT_FALSE(state.is_memory_reporting_enabled); 615 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
427 EXPECT_FALSE(state.is_suspended); 616 SetPaused(false);
428 617 client_.set_is_autoplaying_muted(true);
429 state = ComputeMustSuspendPlayState(); 618
430 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); 619 EXPECT_CALL(delegate_, DidPlay(_, true, false, _));
431 EXPECT_FALSE(state.is_memory_reporting_enabled); 620 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
432 EXPECT_TRUE(state.is_suspended); 621
433 } 622 client_.set_is_autoplaying_muted(false);
434 623 EXPECT_CALL(delegate_, DidPlay(_, true, true, _));
435 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterFutureData) { 624 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
436 InitializeWebMediaPlayerImpl(); 625 }
437 WebMediaPlayerImpl::PlayState state; 626
438 SetMetadata(true, true); 627 TEST_F(WebMediaPlayerImplTest, AutoplayMuted_SetVolume) {
439 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); 628 InitializeWebMediaPlayerImpl();
440 629 SetMetadata(true, true);
441 state = ComputePlayState(); 630 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
442 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); 631 SetPaused(false);
443 EXPECT_FALSE(state.is_memory_reporting_enabled); 632 client_.set_is_autoplaying_muted(true);
444 EXPECT_FALSE(state.is_suspended); 633
445 634 EXPECT_CALL(delegate_, DidPlay(_, true, false, _));
446 state = ComputeBackgroundedPlayState(); 635 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
447 636
448 if (base::FeatureList::IsEnabled(kResumeBackgroundVideo)) 637 client_.set_is_autoplaying_muted(false);
449 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); 638 EXPECT_CALL(delegate_, DidPlay(_, true, true, _));
450 else 639 wmpi_->setVolume(1.0);
451 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
452 EXPECT_FALSE(state.is_memory_reporting_enabled);
453 EXPECT_TRUE(state.is_suspended);
454
455 // Idle suspension is possible after HaveFutureData.
456 state = ComputeIdlePlayState();
457 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
458 EXPECT_FALSE(state.is_memory_reporting_enabled);
459 EXPECT_TRUE(state.is_suspended);
460
461 state = ComputeMustSuspendPlayState();
462 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
463 EXPECT_FALSE(state.is_memory_reporting_enabled);
464 EXPECT_TRUE(state.is_suspended);
465 }
466
467 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Playing) {
468 InitializeWebMediaPlayerImpl();
469 WebMediaPlayerImpl::PlayState state;
470 SetMetadata(true, true);
471 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
472 SetPaused(false);
473
474 state = ComputePlayState();
475 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
476 EXPECT_TRUE(state.is_memory_reporting_enabled);
477 EXPECT_FALSE(state.is_suspended);
478
479 state = ComputeBackgroundedPlayState();
480 if (base::FeatureList::IsEnabled(kResumeBackgroundVideo))
481 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
482 else
483 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
484 EXPECT_FALSE(state.is_memory_reporting_enabled);
485 EXPECT_TRUE(state.is_suspended);
486
487 state = ComputeMustSuspendPlayState();
488 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
489 EXPECT_FALSE(state.is_memory_reporting_enabled);
490 EXPECT_TRUE(state.is_suspended);
491 }
492
493 TEST_F(WebMediaPlayerImplTest, ComputePlayState_PlayingThenUnderflow) {
494 InitializeWebMediaPlayerImpl();
495 WebMediaPlayerImpl::PlayState state;
496 SetMetadata(true, true);
497 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
498 SetPaused(false);
499 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveCurrentData);
500
501 // Underflow should not trigger idle suspend. The user is still playing the
502 // the video, just waiting on the network.
503 state = ComputePlayState();
504 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
505 EXPECT_TRUE(state.is_memory_reporting_enabled);
506 EXPECT_FALSE(state.is_suspended);
507
508 // Background suspend should still be possible during underflow.
509 state = ComputeBackgroundedPlayState();
510 if (base::FeatureList::IsEnabled(kResumeBackgroundVideo))
511 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
512 else
513 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
514 EXPECT_FALSE(state.is_memory_reporting_enabled);
515 EXPECT_TRUE(state.is_suspended);
516
517 // Forced suspend should still be possible during underflow.
518 state = ComputeMustSuspendPlayState();
519 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
520 EXPECT_FALSE(state.is_memory_reporting_enabled);
521 EXPECT_TRUE(state.is_suspended);
522 }
523
524 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Playing_AudioOnly) {
525 InitializeWebMediaPlayerImpl();
526 WebMediaPlayerImpl::PlayState state;
527 SetMetadata(true, false);
528 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
529 SetPaused(false);
530
531 state = ComputePlayState();
532 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
533 EXPECT_TRUE(state.is_memory_reporting_enabled);
534 EXPECT_FALSE(state.is_suspended);
535
536 // Audio-only stays playing in the background.
537 state = ComputeBackgroundedPlayState();
538 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
539 EXPECT_TRUE(state.is_memory_reporting_enabled);
540 EXPECT_FALSE(state.is_suspended);
541
542 // Backgrounding a paused audio only player should suspend, but keep the
543 // session alive for user interactions.
544 SetPaused(true);
545 state = ComputeBackgroundedPlayState();
546 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
547 EXPECT_FALSE(state.is_memory_reporting_enabled);
548 EXPECT_TRUE(state.is_suspended);
549
550 state = ComputeMustSuspendPlayState();
551 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
552 EXPECT_FALSE(state.is_memory_reporting_enabled);
553 EXPECT_TRUE(state.is_suspended);
554 }
555
556 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) {
557 InitializeWebMediaPlayerImpl();
558 WebMediaPlayerImpl::PlayState state;
559 SetMetadata(true, true);
560 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
561 SetSeeking(true);
562
563 state = ComputePlayState();
564 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
565 EXPECT_FALSE(state.is_memory_reporting_enabled);
566 EXPECT_FALSE(state.is_suspended);
567 }
568
569 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Fullscreen) {
570 InitializeWebMediaPlayerImpl();
571 WebMediaPlayerImpl::PlayState state;
572 SetMetadata(true, true);
573 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
574 SetFullscreen(true);
575
576 state = ComputePlayState();
577 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
578 EXPECT_FALSE(state.is_memory_reporting_enabled);
579 EXPECT_FALSE(state.is_suspended);
580 }
581
582 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Ended) {
583 InitializeWebMediaPlayerImpl();
584 WebMediaPlayerImpl::PlayState state;
585 SetMetadata(true, true);
586 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
587 SetEnded(true);
588
589 // The pipeline is not suspended immediately on ended.
590 state = ComputePlayState();
591 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state);
592 EXPECT_FALSE(state.is_memory_reporting_enabled);
593 EXPECT_FALSE(state.is_suspended);
594
595 state = ComputeIdlePlayState();
596 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state);
597 EXPECT_FALSE(state.is_memory_reporting_enabled);
598 EXPECT_TRUE(state.is_suspended);
599 }
600
601 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Streaming) {
602 InitializeWebMediaPlayerImpl();
603 WebMediaPlayerImpl::PlayState state;
604 SetMetadata(true, true);
605
606 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
607 SetPaused(true);
608
609 // Streaming media should not suspend, even if paused, idle, and backgrounded.
610 state = ComputeStreamingPlayState(false);
611 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
612 EXPECT_FALSE(state.is_memory_reporting_enabled);
613 EXPECT_FALSE(state.is_suspended);
614
615 // Streaming media should suspend when the tab is closed, regardless.
616 state = ComputeStreamingPlayState(true);
617 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
618 EXPECT_FALSE(state.is_memory_reporting_enabled);
619 EXPECT_TRUE(state.is_suspended);
620 }
621
622 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Suspended) {
623 InitializeWebMediaPlayerImpl();
624 WebMediaPlayerImpl::PlayState state;
625 SetMetadata(true, true);
626
627 // Suspended players should be resumed unless we have reached the appropriate
628 // ready state and are not seeking.
629 SetPaused(true);
630 state = ComputePlayStateSuspended();
631 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
632 EXPECT_FALSE(state.is_memory_reporting_enabled);
633 EXPECT_FALSE(state.is_suspended);
634
635 // Paused players in the idle state are allowed to remain suspended.
636 state = ComputeIdleSuspendedPlayState();
637 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
638 EXPECT_FALSE(state.is_memory_reporting_enabled);
639 EXPECT_TRUE(state.is_suspended);
640
641 SetPaused(false);
642 state = ComputePlayStateSuspended();
643 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
644 EXPECT_FALSE(state.is_memory_reporting_enabled);
645 EXPECT_FALSE(state.is_suspended);
646
647 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
648
649 // Paused players should stay suspended.
650 SetPaused(true);
651 state = ComputePlayStateSuspended();
652 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
653 EXPECT_FALSE(state.is_memory_reporting_enabled);
654 EXPECT_TRUE(state.is_suspended);
655
656 // Playing players should resume into the playing state.
657 SetPaused(false);
658 state = ComputePlayStateSuspended();
659 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
660 EXPECT_TRUE(state.is_memory_reporting_enabled);
661 EXPECT_FALSE(state.is_suspended);
662
663 // If seeking, the previously suspended state does not matter; the player
664 // should always be resumed.
665 SetSeeking(true);
666
667 SetPaused(true);
668 state = ComputePlayStateSuspended();
669 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
670 EXPECT_FALSE(state.is_memory_reporting_enabled);
671 EXPECT_FALSE(state.is_suspended);
672
673 SetPaused(false);
674 state = ComputePlayStateSuspended();
675 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
676 EXPECT_TRUE(state.is_memory_reporting_enabled);
677 EXPECT_FALSE(state.is_suspended);
678 } 640 }
679 641
680 TEST_F(WebMediaPlayerImplTest, NaturalSizeChange) { 642 TEST_F(WebMediaPlayerImplTest, NaturalSizeChange) {
681 InitializeWebMediaPlayerImpl(); 643 InitializeWebMediaPlayerImpl();
682 PipelineMetadata metadata; 644 PipelineMetadata metadata;
683 metadata.has_video = true; 645 metadata.has_video = true;
684 metadata.natural_size = gfx::Size(320, 240); 646 metadata.natural_size = gfx::Size(320, 240);
685 647
686 OnMetadata(metadata); 648 OnMetadata(metadata);
687 ASSERT_EQ(blink::WebSize(320, 240), wmpi_->naturalSize()); 649 ASSERT_EQ(blink::WebSize(320, 240), wmpi_->naturalSize());
(...skipping 11 matching lines...) Expand all
699 metadata.video_rotation = VIDEO_ROTATION_90; 661 metadata.video_rotation = VIDEO_ROTATION_90;
700 662
701 OnMetadata(metadata); 663 OnMetadata(metadata);
702 ASSERT_EQ(blink::WebSize(320, 240), wmpi_->naturalSize()); 664 ASSERT_EQ(blink::WebSize(320, 240), wmpi_->naturalSize());
703 665
704 // For 90/270deg rotations, the natural size should be transposed. 666 // For 90/270deg rotations, the natural size should be transposed.
705 OnVideoNaturalSizeChange(gfx::Size(1920, 1080)); 667 OnVideoNaturalSizeChange(gfx::Size(1920, 1080));
706 ASSERT_EQ(blink::WebSize(1080, 1920), wmpi_->naturalSize()); 668 ASSERT_EQ(blink::WebSize(1080, 1920), wmpi_->naturalSize());
707 } 669 }
708 670
709 // Audible backgrounded videos are not suspended if delegate_ allows it. 671 TEST_F(WebMediaPlayerImplTest, ShouldDisableVideoWhenHidden) {
710 TEST_F(WebMediaPlayerImplTest, ComputePlayState_BackgroundedVideoPlaying) { 672 base::test::ScopedFeatureList scoped_feature_list;
673 scoped_feature_list.InitAndEnableFeature(kBackgroundVideoTrackOptimization);
674
711 InitializeWebMediaPlayerImpl(); 675 InitializeWebMediaPlayerImpl();
712 WebMediaPlayerImpl::PlayState state; 676 delegate_.SetFrameHiddenForTesting(true);
713 SetMetadata(true, true);
714 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
715
716 SetupForResumingBackgroundVideo();
717
718 EXPECT_CALL(delegate_, IsPlayingBackgroundVideo())
719 .WillRepeatedly(Return(true));
720 EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true));
721
722 SetPaused(false);
723 state = ComputeBackgroundedPlayState();
724 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state);
725 EXPECT_TRUE(state.is_memory_reporting_enabled);
726 EXPECT_FALSE(state.is_suspended);
727 }
728
729 // Backgrounding audible videos should suspend them and report as paused, not
730 // gone.
731 TEST_F(WebMediaPlayerImplTest, ComputePlayState_BackgroundedVideoPaused) {
732 InitializeWebMediaPlayerImpl();
733 WebMediaPlayerImpl::PlayState state;
734 SetMetadata(true, true);
735 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
736
737 SetupForResumingBackgroundVideo();
738
739 EXPECT_CALL(delegate_, IsPlayingBackgroundVideo()).WillOnce(Return(false));
740 EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true));
741
742 state = ComputeBackgroundedPlayState();
743 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state);
744 EXPECT_FALSE(state.is_memory_reporting_enabled);
745 EXPECT_TRUE(state.is_suspended);
746 }
747
748 TEST_F(WebMediaPlayerImplTest, AutoplayMuted_StartsAndStops) {
749 InitializeWebMediaPlayerImpl();
750 SetMetadata(true, true);
751 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
752 SetPaused(false);
753
754 EXPECT_CALL(delegate_, DidPlay(_, true, false, false, _));
755 client_.set_is_autoplaying_muted(true);
756 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
757
758 EXPECT_CALL(delegate_, DidPlay(_, true, true, false, _));
759 client_.set_is_autoplaying_muted(false);
760 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
761 }
762
763 TEST_F(WebMediaPlayerImplTest, AutoplayMuted_SetVolume) {
764 InitializeWebMediaPlayerImpl();
765 SetMetadata(true, true);
766 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData);
767 SetPaused(false);
768
769 EXPECT_CALL(delegate_, DidPlay(_, true, false, false, _));
770 client_.set_is_autoplaying_muted(true);
771 SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING);
772
773 EXPECT_CALL(delegate_, DidPlay(_, true, true, false, _));
774 client_.set_is_autoplaying_muted(false);
775 wmpi_->setVolume(1.0);
776 }
777
778 TEST_F(WebMediaPlayerImplTest, ShouldDisableVideoWhenHidden) {
779 InitializeWebMediaPlayerImpl();
780 EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true));
781 SetBackgroundVideoOptimization(true);
782 677
783 SetMetadata(true, true); 678 SetMetadata(true, true);
784 SetVideoKeyframeDistanceAverage(base::TimeDelta::FromSeconds(5)); 679 SetVideoKeyframeDistanceAverage(base::TimeDelta::FromSeconds(5));
785 EXPECT_TRUE(ShouldDisableVideoWhenHidden()); 680 EXPECT_TRUE(ShouldDisableVideoWhenHidden());
786 681
787 SetMetadata(false, true); 682 SetMetadata(false, true);
788 EXPECT_FALSE(ShouldDisableVideoWhenHidden()); 683 EXPECT_FALSE(ShouldDisableVideoWhenHidden());
789 684
790 SetMetadata(true, false); 685 SetMetadata(true, false);
791 EXPECT_FALSE(ShouldDisableVideoWhenHidden()); 686 EXPECT_FALSE(ShouldDisableVideoWhenHidden());
792 687
793 SetVideoKeyframeDistanceAverage(base::TimeDelta::FromSeconds(100)); 688 SetVideoKeyframeDistanceAverage(base::TimeDelta::FromSeconds(100));
794 SetMetadata(true, true); 689 SetMetadata(true, true);
795 EXPECT_FALSE(ShouldDisableVideoWhenHidden()); 690 EXPECT_FALSE(ShouldDisableVideoWhenHidden());
796 } 691 }
797 692
798 TEST_F(WebMediaPlayerImplTest, ShouldDisableVideoWhenHiddenFeatureDisabled) { 693 TEST_F(WebMediaPlayerImplTest, ShouldDisableVideoWhenHiddenFeatureDisabled) {
694 base::test::ScopedFeatureList scoped_feature_list;
695 scoped_feature_list.InitAndDisableFeature(kBackgroundVideoTrackOptimization);
696
799 InitializeWebMediaPlayerImpl(); 697 InitializeWebMediaPlayerImpl();
800 EXPECT_CALL(delegate_, IsHidden()).WillRepeatedly(Return(true)); 698 delegate_.SetFrameHiddenForTesting(true);
801 SetBackgroundVideoOptimization(false);
802 699
803 SetMetadata(true, true); 700 SetMetadata(true, true);
804 EXPECT_FALSE(ShouldDisableVideoWhenHidden()); 701 EXPECT_FALSE(ShouldDisableVideoWhenHidden());
805 } 702 }
806 703
807 } // namespace media 704 } // namespace media
OLDNEW
« no previous file with comments | « media/blink/webmediaplayer_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698