1 // Copyright 2015 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_impl.h"
6
7 #include <stddef.h>
8
9 #include <list>
10 #include <vector>
11
12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/metrics/histogram_samples.h"
15 #include "base/strings/strcat.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "base/test/metrics/histogram_tester.h"
18 #include "base/test/simple_test_tick_clock.h"
19 #include "build/build_config.h"
20 #include "content/browser/media/session/audio_focus_delegate.h"
21 #include "content/browser/media/session/mock_media_session_player_observer.h"
22 #include "content/browser/media/session/mock_media_session_service_impl.h"
23 #include "content/browser/renderer_host/render_frame_host_impl.h"
24 #include "content/browser/web_contents/web_contents_impl.h"
25 #include "content/public/browser/media_session.h"
26 #include "content/public/browser/web_contents.h"
27 #include "content/public/test/browser_test.h"
28 #include "content/public/test/content_browser_test.h"
29 #include "content/public/test/content_browser_test_utils.h"
30 #include "content/shell/browser/shell.h"
31 #include "media/base/media_content_type.h"
32 #include "net/base/filename_util.h"
33 #include "net/dns/mock_host_resolver.h"
34 #include "services/media_session/public/cpp/test/mock_media_session.h"
35 #include "services/media_session/public/mojom/audio_focus.mojom.h"
36 #include "testing/gmock/include/gmock/gmock.h"
37 #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
38
39 using media_session::mojom::AudioFocusType;
40 using media_session::mojom::MediaPlaybackState;
41 using media_session::mojom::MediaSessionInfo;
42
43 using ::testing::_;
44 using ::testing::Eq;
45 using ::testing::Expectation;
46 using ::testing::NiceMock;
47
48 namespace {
49
50 const double kDefaultVolumeMultiplier = 1.0;
51 const double kDuckingVolumeMultiplier = 0.2;
52 const double kDifferentDuckingVolumeMultiplier = 0.018;
53
54 const base::string16 kExpectedSourceTitlePrefix =
55 base::ASCIIToUTF16("http://example.com:");
56
57 constexpr gfx::Size kDefaultFaviconSize = gfx::Size(16, 16);
58
59 const std::string kExampleSinkId = "example_device_id";
60
61 class MockAudioFocusDelegate : public content::AudioFocusDelegate {
62 public:
MockAudioFocusDelegate(content::MediaSessionImpl * media_session,bool async_mode)63 MockAudioFocusDelegate(content::MediaSessionImpl* media_session,
64 bool async_mode)
65 : media_session_(media_session), async_mode_(async_mode) {}
66
67 MOCK_METHOD0(AbandonAudioFocus, void());
68
RequestAudioFocus(AudioFocusType audio_focus_type)69 AudioFocusDelegate::AudioFocusResult RequestAudioFocus(
70 AudioFocusType audio_focus_type) {
71 if (async_mode_) {
72 requests_.push_back(audio_focus_type);
73 return AudioFocusDelegate::AudioFocusResult::kDelayed;
74 } else {
75 audio_focus_type_ = audio_focus_type;
76 return sync_result_;
77 }
78 }
79
GetCurrentFocusType() const80 base::Optional<AudioFocusType> GetCurrentFocusType() const {
81 return audio_focus_type_;
82 }
83
MediaSessionInfoChanged(media_session::mojom::MediaSessionInfoPtr session_info)84 void MediaSessionInfoChanged(
85 media_session::mojom::MediaSessionInfoPtr session_info) override {}
86
87 MOCK_CONST_METHOD0(request_id, const base::UnguessableToken&());
88
ResolveRequest(bool result)89 void ResolveRequest(bool result) {
90 if (!async_mode_)
91 return;
92
93 audio_focus_type_ = requests_.front();
94 requests_.pop_front();
95
96 media_session_->FinishSystemAudioFocusRequest(audio_focus_type_.value(),
97 result);
98 }
99
HasRequests() const100 bool HasRequests() const { return !requests_.empty(); }
101
SetSyncResult(AudioFocusDelegate::AudioFocusResult result)102 void SetSyncResult(AudioFocusDelegate::AudioFocusResult result) {
103 sync_result_ = result;
104 }
105
106 private:
107 AudioFocusDelegate::AudioFocusResult sync_result_ =
108 AudioFocusDelegate::AudioFocusResult::kSuccess;
109
110 content::MediaSessionImpl* media_session_;
111 const bool async_mode_ = false;
112
113 std::list<AudioFocusType> requests_;
114 base::Optional<AudioFocusType> audio_focus_type_;
115 };
116
117 } // namespace
118
119 namespace content {
120
121 class MediaSessionImplBrowserTest : public ContentBrowserTest {
122 protected:
123 MediaSessionImplBrowserTest() = default;
124
SetUpOnMainThread()125 void SetUpOnMainThread() override {
126 ContentBrowserTest::SetUpOnMainThread();
127
128 // Navigate to a test page with a a real origin.
129 ASSERT_TRUE(embedded_test_server()->Start());
130 host_resolver()->AddRule("*", "127.0.0.1");
131 EXPECT_TRUE(NavigateToURL(shell(), embedded_test_server()->GetURL(
132 "example.com", "/title1.html")));
133
134 media_session_ = MediaSessionImpl::Get(shell()->web_contents());
135 mock_audio_focus_delegate_ = new NiceMock<MockAudioFocusDelegate>(
136 media_session_, true /* async_mode */);
137 media_session_->SetDelegateForTests(
138 base::WrapUnique(mock_audio_focus_delegate_));
139 ASSERT_TRUE(media_session_);
140 }
141
TearDownOnMainThread()142 void TearDownOnMainThread() override {
143 media_session_->RemoveAllPlayersForTest();
144 mock_media_session_service_.reset();
145
146 media_session_ = nullptr;
147
148 ContentBrowserTest::TearDownOnMainThread();
149 }
150
StartNewPlayer(MockMediaSessionPlayerObserver * player_observer,media::MediaContentType media_content_type)151 void StartNewPlayer(MockMediaSessionPlayerObserver* player_observer,
152 media::MediaContentType media_content_type) {
153 int player_id = player_observer->StartNewPlayer();
154
155 bool result = AddPlayer(player_observer, player_id, media_content_type);
156
157 EXPECT_TRUE(result);
158 }
159
AddPlayer(MockMediaSessionPlayerObserver * player_observer,int player_id,media::MediaContentType type)160 bool AddPlayer(MockMediaSessionPlayerObserver* player_observer,
161 int player_id,
162 media::MediaContentType type) {
163 return media_session_->AddPlayer(player_observer, player_id, type);
164 }
165
RemovePlayer(MockMediaSessionPlayerObserver * player_observer,int player_id)166 void RemovePlayer(MockMediaSessionPlayerObserver* player_observer,
167 int player_id) {
168 media_session_->RemovePlayer(player_observer, player_id);
169 }
170
RemovePlayers(MockMediaSessionPlayerObserver * player_observer)171 void RemovePlayers(MockMediaSessionPlayerObserver* player_observer) {
172 media_session_->RemovePlayers(player_observer);
173 }
174
OnPlayerPaused(MockMediaSessionPlayerObserver * player_observer,int player_id)175 void OnPlayerPaused(MockMediaSessionPlayerObserver* player_observer,
176 int player_id) {
177 media_session_->OnPlayerPaused(player_observer, player_id);
178 }
179
SetPosition(MockMediaSessionPlayerObserver * player_observer,int player_id,media_session::MediaPosition & position)180 void SetPosition(MockMediaSessionPlayerObserver* player_observer,
181 int player_id,
182 media_session::MediaPosition& position) {
183 player_observer->SetPosition(player_id, position);
184 media_session_->RebuildAndNotifyMediaPositionChanged();
185 }
186
IsActive()187 bool IsActive() { return media_session_->IsActive(); }
188
GetSessionAudioFocusType()189 base::Optional<AudioFocusType> GetSessionAudioFocusType() {
190 return mock_audio_focus_delegate_->GetCurrentFocusType();
191 }
192
IsControllable()193 bool IsControllable() { return media_session_->IsControllable(); }
194
UIResume()195 void UIResume() { media_session_->Resume(MediaSession::SuspendType::kUI); }
196
SystemResume()197 void SystemResume() {
198 media_session_->OnResumeInternal(MediaSession::SuspendType::kSystem);
199 }
200
UISuspend()201 void UISuspend() { media_session_->Suspend(MediaSession::SuspendType::kUI); }
202
SystemSuspend(bool temporary)203 void SystemSuspend(bool temporary) {
204 media_session_->OnSuspendInternal(MediaSession::SuspendType::kSystem,
205 temporary
206 ? MediaSessionImpl::State::SUSPENDED
207 : MediaSessionImpl::State::INACTIVE);
208 }
209
UISeekForward()210 void UISeekForward() {
211 media_session_->Seek(base::TimeDelta::FromSeconds(1));
212 }
213
UISeekBackward()214 void UISeekBackward() {
215 media_session_->Seek(base::TimeDelta::FromSeconds(-1));
216 }
217
UISetAudioSink(const std::string & sink_id)218 void UISetAudioSink(const std::string& sink_id) {
219 media_session_->SetAudioSinkId(sink_id);
220 }
221
SystemStartDucking()222 void SystemStartDucking() { media_session_->StartDucking(); }
223
SystemStopDucking()224 void SystemStopDucking() { media_session_->StopDucking(); }
225
EnsureMediaSessionService()226 void EnsureMediaSessionService() {
227 mock_media_session_service_.reset(new NiceMock<MockMediaSessionServiceImpl>(
228 shell()->web_contents()->GetMainFrame()));
229 }
230
SetPlaybackState(blink::mojom::MediaSessionPlaybackState state)231 void SetPlaybackState(blink::mojom::MediaSessionPlaybackState state) {
232 mock_media_session_service_->SetPlaybackState(state);
233 }
234
ResolveAudioFocusSuccess()235 void ResolveAudioFocusSuccess() {
236 mock_audio_focus_delegate()->ResolveRequest(true /* result */);
237 }
238
ResolveAudioFocusFailure()239 void ResolveAudioFocusFailure() {
240 mock_audio_focus_delegate()->ResolveRequest(false /* result */);
241 }
242
SetSyncAudioFocusResult(AudioFocusDelegate::AudioFocusResult result)243 void SetSyncAudioFocusResult(AudioFocusDelegate::AudioFocusResult result) {
244 mock_audio_focus_delegate()->SetSyncResult(result);
245 }
246
HasUnresolvedAudioFocusRequest()247 bool HasUnresolvedAudioFocusRequest() {
248 return mock_audio_focus_delegate()->HasRequests();
249 }
250
mock_audio_focus_delegate()251 MockAudioFocusDelegate* mock_audio_focus_delegate() {
252 return mock_audio_focus_delegate_;
253 }
254
CreateDummyMediaSession()255 std::unique_ptr<MediaSessionImpl> CreateDummyMediaSession() {
256 return base::WrapUnique<MediaSessionImpl>(
257 new MediaSessionImpl(CreateBrowser()->web_contents()));
258 }
259
GetMediaSessionUMAHelper()260 MediaSessionUmaHelper* GetMediaSessionUMAHelper() {
261 return media_session_->uma_helper_for_test();
262 }
263
SetAudioFocusDelegateForTests(MockAudioFocusDelegate * delegate)264 void SetAudioFocusDelegateForTests(MockAudioFocusDelegate* delegate) {
265 mock_audio_focus_delegate_ = delegate;
266 media_session_->SetDelegateForTests(
267 base::WrapUnique(mock_audio_focus_delegate_));
268 }
269
IsDucking() const270 bool IsDucking() const { return media_session_->is_ducking_; }
271
GetExpectedSourceTitle()272 base::string16 GetExpectedSourceTitle() {
273 base::string16 expected_title =
274 base::StrCat({kExpectedSourceTitlePrefix,
275 base::NumberToString16(embedded_test_server()->port())});
276
277 return expected_title.substr(strlen("http://"));
278 }
279
280 protected:
281 MediaSessionImpl* media_session_;
282 MockAudioFocusDelegate* mock_audio_focus_delegate_;
283 std::unique_ptr<MockMediaSessionServiceImpl> mock_media_session_service_;
284
285 DISALLOW_COPY_AND_ASSIGN(MediaSessionImplBrowserTest);
286 };
287
288 class MediaSessionImplParamBrowserTest
289 : public MediaSessionImplBrowserTest,
290 public testing::WithParamInterface<bool> {
291 protected:
292 MediaSessionImplParamBrowserTest() = default;
293
SetUpOnMainThread()294 void SetUpOnMainThread() override {
295 MediaSessionImplBrowserTest::SetUpOnMainThread();
296
297 SetAudioFocusDelegateForTests(
298 new NiceMock<MockAudioFocusDelegate>(media_session_, GetParam()));
299 }
300 };
301
302 class MediaSessionImplSyncBrowserTest : public MediaSessionImplBrowserTest {
303 protected:
304 MediaSessionImplSyncBrowserTest() = default;
305
SetUpOnMainThread()306 void SetUpOnMainThread() override {
307 MediaSessionImplBrowserTest::SetUpOnMainThread();
308
309 SetAudioFocusDelegateForTests(new NiceMock<MockAudioFocusDelegate>(
310 media_session_, false /* async_mode */));
311 }
312 };
313
314 INSTANTIATE_TEST_SUITE_P(All,
315 MediaSessionImplParamBrowserTest,
316 testing::Bool());
317
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,PlayersFromSameObserverDoNotStopEachOtherInSameSession)318 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
319 PlayersFromSameObserverDoNotStopEachOtherInSameSession) {
320 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
321
322 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
323 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
324 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
325 ResolveAudioFocusSuccess();
326
327 EXPECT_TRUE(player_observer->IsPlaying(0));
328 EXPECT_TRUE(player_observer->IsPlaying(1));
329 EXPECT_TRUE(player_observer->IsPlaying(2));
330 }
331
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,PlayersFromManyObserverDoNotStopEachOtherInSameSession)332 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
333 PlayersFromManyObserverDoNotStopEachOtherInSameSession) {
334 auto player_observer_1 = std::make_unique<MockMediaSessionPlayerObserver>();
335 auto player_observer_2 = std::make_unique<MockMediaSessionPlayerObserver>();
336 auto player_observer_3 = std::make_unique<MockMediaSessionPlayerObserver>();
337
338 StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
339 StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
340 StartNewPlayer(player_observer_3.get(), media::MediaContentType::Persistent);
341 ResolveAudioFocusSuccess();
342
343 EXPECT_TRUE(player_observer_1->IsPlaying(0));
344 EXPECT_TRUE(player_observer_2->IsPlaying(0));
345 EXPECT_TRUE(player_observer_3->IsPlaying(0));
346 }
347
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,SuspendedMediaSessionStopsPlayers)348 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
349 SuspendedMediaSessionStopsPlayers) {
350 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
351
352 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
353 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
354 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
355 ResolveAudioFocusSuccess();
356
357 SystemSuspend(true);
358
359 EXPECT_FALSE(player_observer->IsPlaying(0));
360 EXPECT_FALSE(player_observer->IsPlaying(1));
361 EXPECT_FALSE(player_observer->IsPlaying(2));
362 }
363
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumedMediaSessionRestartsPlayers)364 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
365 ResumedMediaSessionRestartsPlayers) {
366 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
367
368 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
369 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
370 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
371 ResolveAudioFocusSuccess();
372
373 SystemSuspend(true);
374 SystemResume();
375
376 EXPECT_TRUE(player_observer->IsPlaying(0));
377 EXPECT_TRUE(player_observer->IsPlaying(1));
378 EXPECT_TRUE(player_observer->IsPlaying(2));
379 }
380
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,StartedPlayerOnSuspendedSessionPlaysAlone)381 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
382 StartedPlayerOnSuspendedSessionPlaysAlone) {
383 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
384
385 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
386 ResolveAudioFocusSuccess();
387
388 EXPECT_TRUE(player_observer->IsPlaying(0));
389
390 SystemSuspend(true);
391
392 EXPECT_FALSE(player_observer->IsPlaying(0));
393
394 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
395 ResolveAudioFocusSuccess();
396
397 EXPECT_FALSE(player_observer->IsPlaying(0));
398 EXPECT_TRUE(player_observer->IsPlaying(1));
399
400 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
401
402 EXPECT_FALSE(player_observer->IsPlaying(0));
403 EXPECT_TRUE(player_observer->IsPlaying(1));
404 EXPECT_TRUE(player_observer->IsPlaying(2));
405 }
406
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,InitialVolumeMultiplier)407 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
408 InitialVolumeMultiplier) {
409 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
410
411 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
412 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
413
414 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
415 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
416
417 ResolveAudioFocusSuccess();
418
419 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
420 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
421 }
422
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,StartDuckingReducesVolumeMultiplier)423 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
424 StartDuckingReducesVolumeMultiplier) {
425 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
426
427 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
428 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
429 SystemStartDucking();
430
431 EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
432 EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
433
434 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
435
436 EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(2));
437 }
438
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,StopDuckingRecoversVolumeMultiplier)439 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
440 StopDuckingRecoversVolumeMultiplier) {
441 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
442
443 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
444 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
445 SystemStartDucking();
446 SystemStopDucking();
447
448 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
449 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
450
451 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
452
453 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(2));
454 }
455
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,DuckingUsesConfiguredMultiplier)456 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
457 DuckingUsesConfiguredMultiplier) {
458 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
459
460 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
461 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
462 media_session_->SetDuckingVolumeMultiplier(kDifferentDuckingVolumeMultiplier);
463 SystemStartDucking();
464 EXPECT_EQ(kDifferentDuckingVolumeMultiplier,
465 player_observer->GetVolumeMultiplier(0));
466 EXPECT_EQ(kDifferentDuckingVolumeMultiplier,
467 player_observer->GetVolumeMultiplier(1));
468 SystemStopDucking();
469 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
470 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
471 }
472
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AudioFocusInitialState)473 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
474 AudioFocusInitialState) {
475 EXPECT_FALSE(IsActive());
476 }
477
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AddPlayerOnSuspendedFocusUnducks)478 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
479 AddPlayerOnSuspendedFocusUnducks) {
480 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
481 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
482 ResolveAudioFocusSuccess();
483
484 UISuspend();
485 EXPECT_FALSE(IsActive());
486
487 SystemStartDucking();
488 EXPECT_EQ(kDuckingVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
489
490 EXPECT_TRUE(
491 AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent));
492 ResolveAudioFocusSuccess();
493 EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
494 }
495
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,CanRequestFocusBeforePlayerCreation)496 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
497 CanRequestFocusBeforePlayerCreation) {
498 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
499
500 media_session_->RequestSystemAudioFocus(AudioFocusType::kGain);
501 EXPECT_TRUE(IsActive());
502
503 ResolveAudioFocusSuccess();
504 EXPECT_TRUE(IsActive());
505
506 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
507 EXPECT_TRUE(IsActive());
508 }
509
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,StartPlayerGivesFocus)510 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
511 StartPlayerGivesFocus) {
512 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
513
514 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
515 EXPECT_TRUE(IsActive());
516
517 ResolveAudioFocusSuccess();
518 EXPECT_TRUE(IsActive());
519 }
520
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,SuspendGivesAwayAudioFocus)521 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
522 SuspendGivesAwayAudioFocus) {
523 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
524
525 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
526 ResolveAudioFocusSuccess();
527
528 SystemSuspend(true);
529
530 EXPECT_FALSE(IsActive());
531 }
532
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,StopGivesAwayAudioFocus)533 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
534 StopGivesAwayAudioFocus) {
535 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
536
537 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
538 ResolveAudioFocusSuccess();
539
540 media_session_->Stop(MediaSession::SuspendType::kUI);
541
542 EXPECT_FALSE(IsActive());
543 }
544
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,SystemResumeGivesBackAudioFocus)545 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
546 SystemResumeGivesBackAudioFocus) {
547 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
548
549 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
550 ResolveAudioFocusSuccess();
551
552 SystemSuspend(true);
553 SystemResume();
554
555 EXPECT_TRUE(IsActive());
556 }
557
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UIResumeGivesBackAudioFocus)558 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
559 UIResumeGivesBackAudioFocus) {
560 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
561
562 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
563 ResolveAudioFocusSuccess();
564
565 UISuspend();
566
567 UIResume();
568 EXPECT_TRUE(IsActive());
569
570 ResolveAudioFocusSuccess();
571 EXPECT_TRUE(IsActive());
572 }
573
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingLastPlayerDropsAudioFocus)574 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
575 RemovingLastPlayerDropsAudioFocus) {
576 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
577
578 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
579 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
580 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
581 ResolveAudioFocusSuccess();
582
583 RemovePlayer(player_observer.get(), 0);
584 EXPECT_TRUE(IsActive());
585 RemovePlayer(player_observer.get(), 1);
586 EXPECT_TRUE(IsActive());
587 RemovePlayer(player_observer.get(), 2);
588 EXPECT_FALSE(IsActive());
589 }
590
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingLastPlayerFromManyObserversDropsAudioFocus)591 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
592 RemovingLastPlayerFromManyObserversDropsAudioFocus) {
593 auto player_observer_1 = std::make_unique<MockMediaSessionPlayerObserver>();
594 auto player_observer_2 = std::make_unique<MockMediaSessionPlayerObserver>();
595 auto player_observer_3 = std::make_unique<MockMediaSessionPlayerObserver>();
596
597 StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
598 StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
599 StartNewPlayer(player_observer_3.get(), media::MediaContentType::Persistent);
600 ResolveAudioFocusSuccess();
601
602 RemovePlayer(player_observer_1.get(), 0);
603 EXPECT_TRUE(IsActive());
604 RemovePlayer(player_observer_2.get(), 0);
605 EXPECT_TRUE(IsActive());
606 RemovePlayer(player_observer_3.get(), 0);
607 EXPECT_FALSE(IsActive());
608 }
609
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingAllPlayersFromObserversDropsAudioFocus)610 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
611 RemovingAllPlayersFromObserversDropsAudioFocus) {
612 auto player_observer_1 = std::make_unique<MockMediaSessionPlayerObserver>();
613 auto player_observer_2 = std::make_unique<MockMediaSessionPlayerObserver>();
614
615 StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
616 StartNewPlayer(player_observer_1.get(), media::MediaContentType::Persistent);
617 StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
618 StartNewPlayer(player_observer_2.get(), media::MediaContentType::Persistent);
619 ResolveAudioFocusSuccess();
620
621 RemovePlayers(player_observer_1.get());
622 EXPECT_TRUE(IsActive());
623 RemovePlayers(player_observer_2.get());
624 EXPECT_FALSE(IsActive());
625 }
626
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumePlayGivesAudioFocus)627 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
628 ResumePlayGivesAudioFocus) {
629 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
630
631 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
632 ResolveAudioFocusSuccess();
633
634 RemovePlayer(player_observer.get(), 0);
635 EXPECT_FALSE(IsActive());
636
637 EXPECT_TRUE(
638 AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent));
639 ResolveAudioFocusSuccess();
640 EXPECT_TRUE(IsActive());
641 }
642
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumeSuspendSeekAreSentOnlyOncePerPlayers)643 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
644 ResumeSuspendSeekAreSentOnlyOncePerPlayers) {
645 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
646
647 EXPECT_EQ(0, player_observer->received_suspend_calls());
648 EXPECT_EQ(0, player_observer->received_resume_calls());
649
650 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
651 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
652 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
653
654 EXPECT_EQ(0, player_observer->received_suspend_calls());
655 EXPECT_EQ(0, player_observer->received_resume_calls());
656
657 ResolveAudioFocusSuccess();
658
659 EXPECT_EQ(0, player_observer->received_suspend_calls());
660 EXPECT_EQ(0, player_observer->received_resume_calls());
661 EXPECT_EQ(0, player_observer->received_seek_forward_calls());
662 EXPECT_EQ(0, player_observer->received_seek_backward_calls());
663
664 SystemSuspend(true);
665 EXPECT_EQ(3, player_observer->received_suspend_calls());
666
667 SystemResume();
668 EXPECT_EQ(3, player_observer->received_resume_calls());
669
670 UISeekForward();
671 EXPECT_EQ(3, player_observer->received_seek_forward_calls());
672
673 UISeekBackward();
674 EXPECT_EQ(3, player_observer->received_seek_backward_calls());
675 }
676
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumeSuspendSeekAreSentOnlyOncePerPlayersAddedTwice)677 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
678 ResumeSuspendSeekAreSentOnlyOncePerPlayersAddedTwice) {
679 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
680
681 EXPECT_EQ(0, player_observer->received_suspend_calls());
682 EXPECT_EQ(0, player_observer->received_resume_calls());
683
684 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
685 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
686 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
687
688 EXPECT_EQ(0, player_observer->received_suspend_calls());
689 EXPECT_EQ(0, player_observer->received_resume_calls());
690
691 ResolveAudioFocusSuccess();
692
693 // Adding the three players above again.
694 EXPECT_TRUE(
695 AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent));
696 EXPECT_TRUE(
697 AddPlayer(player_observer.get(), 1, media::MediaContentType::Persistent));
698 EXPECT_TRUE(
699 AddPlayer(player_observer.get(), 2, media::MediaContentType::Persistent));
700
701 EXPECT_EQ(0, player_observer->received_suspend_calls());
702 EXPECT_EQ(0, player_observer->received_resume_calls());
703 EXPECT_EQ(0, player_observer->received_seek_forward_calls());
704 EXPECT_EQ(0, player_observer->received_seek_backward_calls());
705
706 SystemSuspend(true);
707 EXPECT_EQ(3, player_observer->received_suspend_calls());
708
709 SystemResume();
710 EXPECT_EQ(3, player_observer->received_resume_calls());
711
712 UISeekForward();
713 EXPECT_EQ(3, player_observer->received_seek_forward_calls());
714
715 UISeekBackward();
716 EXPECT_EQ(3, player_observer->received_seek_backward_calls());
717 }
718
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingTheSamePlayerTwiceIsANoop)719 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
720 RemovingTheSamePlayerTwiceIsANoop) {
721 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
722
723 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
724 ResolveAudioFocusSuccess();
725
726 RemovePlayer(player_observer.get(), 0);
727 RemovePlayer(player_observer.get(), 0);
728 }
729
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AudioFocusType)730 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest, AudioFocusType) {
731 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
732
733 // Starting a player with a given type should set the session to that type.
734 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
735 ResolveAudioFocusSuccess();
736 EXPECT_EQ(AudioFocusType::kGainTransientMayDuck, GetSessionAudioFocusType());
737
738 // Adding a player of the same type should have no effect on the type.
739 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
740 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
741 EXPECT_EQ(AudioFocusType::kGainTransientMayDuck, GetSessionAudioFocusType());
742
743 // Adding a player of Content type should override the current type.
744 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
745 ResolveAudioFocusSuccess();
746 EXPECT_EQ(AudioFocusType::kGain, GetSessionAudioFocusType());
747
748 // Adding a player of the Transient type should have no effect on the type.
749 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
750 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
751 EXPECT_EQ(AudioFocusType::kGain, GetSessionAudioFocusType());
752
753 EXPECT_TRUE(player_observer->IsPlaying(0));
754 EXPECT_TRUE(player_observer->IsPlaying(1));
755 EXPECT_TRUE(player_observer->IsPlaying(2));
756 EXPECT_TRUE(player_observer->IsPlaying(3));
757
758 SystemSuspend(true);
759
760 EXPECT_FALSE(player_observer->IsPlaying(0));
761 EXPECT_FALSE(player_observer->IsPlaying(1));
762 EXPECT_FALSE(player_observer->IsPlaying(2));
763 EXPECT_FALSE(player_observer->IsPlaying(3));
764
765 EXPECT_EQ(AudioFocusType::kGain, GetSessionAudioFocusType());
766
767 SystemResume();
768
769 EXPECT_TRUE(player_observer->IsPlaying(0));
770 EXPECT_TRUE(player_observer->IsPlaying(1));
771 EXPECT_TRUE(player_observer->IsPlaying(2));
772 EXPECT_TRUE(player_observer->IsPlaying(3));
773
774 EXPECT_EQ(AudioFocusType::kGain, GetSessionAudioFocusType());
775 }
776
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShowForContent)777 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
778 ControlsShowForContent) {
779 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
780
781 {
782 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
783
784 // Starting a player with a persistent type should show the media controls.
785 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
786 ResolveAudioFocusSuccess();
787
788 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
789 observer.WaitForControllable(true);
790 }
791
792 EXPECT_TRUE(IsControllable());
793 EXPECT_TRUE(IsActive());
794 }
795
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsNoShowForTransient)796 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
797 ControlsNoShowForTransient) {
798 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
799
800 {
801 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
802
803 // Starting a player with a transient type should not show the media
804 // controls.
805 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
806 ResolveAudioFocusSuccess();
807
808 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
809 observer.WaitForControllable(false);
810 }
811
812 EXPECT_FALSE(IsControllable());
813 EXPECT_TRUE(IsActive());
814 }
815
816 // This behaviour is specific to desktop.
817 #if !defined(OS_ANDROID)
818
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsNoShowForTransientAndRoutedService)819 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
820 ControlsNoShowForTransientAndRoutedService) {
821 EnsureMediaSessionService();
822 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
823 shell()->web_contents()->GetMainFrame());
824
825 {
826 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
827
828 // Starting a player with a transient type should show the media controls.
829 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
830 ResolveAudioFocusSuccess();
831
832 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
833 observer.WaitForControllable(false);
834 }
835
836 EXPECT_FALSE(IsControllable());
837 EXPECT_TRUE(IsActive());
838 }
839
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsNoShowForTransientAndPlaybackStateNone)840 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
841 ControlsNoShowForTransientAndPlaybackStateNone) {
842 EnsureMediaSessionService();
843 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
844 shell()->web_contents()->GetMainFrame());
845
846 {
847 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
848
849 // Starting a player with a transient type should not show the media
850 // controls.
851 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
852 ResolveAudioFocusSuccess();
853
854 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
855
856 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
857 observer.WaitForControllable(false);
858 }
859
860 EXPECT_FALSE(IsControllable());
861 EXPECT_TRUE(IsActive());
862 }
863
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShowForTransientAndPlaybackStatePaused)864 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
865 ControlsShowForTransientAndPlaybackStatePaused) {
866 EnsureMediaSessionService();
867 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
868 shell()->web_contents()->GetMainFrame());
869
870 {
871 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
872
873 // Starting a player with a transient type should show the media controls if
874 // we have a playback state from the service.
875 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
876 ResolveAudioFocusSuccess();
877
878 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
879
880 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
881 observer.WaitForControllable(true);
882 }
883
884 EXPECT_TRUE(IsControllable());
885 EXPECT_TRUE(IsActive());
886 }
887
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShowForTransientAndPlaybackStatePlaying)888 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
889 ControlsShowForTransientAndPlaybackStatePlaying) {
890 EnsureMediaSessionService();
891 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
892 shell()->web_contents()->GetMainFrame());
893
894 {
895 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
896
897 // Starting a player with a transient type should show the media controls if
898 // we have a playback state from the service.
899 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
900 ResolveAudioFocusSuccess();
901
902 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
903
904 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
905 observer.WaitForControllable(true);
906 }
907
908 EXPECT_TRUE(IsControllable());
909 EXPECT_TRUE(IsActive());
910 }
911
912 #endif // !defined(OS_ANDROID)
913
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenStopped)914 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
915 ControlsHideWhenStopped) {
916 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
917
918 {
919 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
920
921 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
922 ResolveAudioFocusSuccess();
923
924 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
925 observer.WaitForControllable(true);
926
927 EXPECT_EQ(MediaPlaybackState::kPlaying,
928 observer.session_info()->playback_state);
929 }
930
931 RemovePlayers(player_observer.get());
932
933 {
934 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
935
936 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
937 observer.WaitForControllable(false);
938
939 EXPECT_EQ(MediaPlaybackState::kPaused,
940 observer.session_info()->playback_state);
941 }
942
943 EXPECT_FALSE(IsControllable());
944 EXPECT_FALSE(IsActive());
945 }
946
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShownAcceptTransient)947 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
948 ControlsShownAcceptTransient) {
949 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
950
951 {
952 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
953
954 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
955 ResolveAudioFocusSuccess();
956
957 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
958 observer.WaitForControllable(true);
959
960 EXPECT_EQ(MediaPlaybackState::kPlaying,
961 observer.session_info()->playback_state);
962 }
963
964 // Transient player join the session without affecting the controls.
965 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
966
967 {
968 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
969
970 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
971 observer.WaitForControllable(true);
972
973 EXPECT_EQ(MediaPlaybackState::kPlaying,
974 observer.session_info()->playback_state);
975 }
976
977 EXPECT_TRUE(IsControllable());
978 EXPECT_TRUE(IsActive());
979 }
980
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShownAfterContentAdded)981 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
982 ControlsShownAfterContentAdded) {
983 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
984
985 {
986 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
987
988 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
989 ResolveAudioFocusSuccess();
990
991 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
992 observer.WaitForControllable(false);
993
994 EXPECT_EQ(MediaPlaybackState::kPlaying,
995 observer.session_info()->playback_state);
996 }
997
998 // The controls are shown when the content player is added.
999 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1000 ResolveAudioFocusSuccess();
1001
1002 {
1003 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1004
1005 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1006 observer.WaitForControllable(true);
1007
1008 EXPECT_EQ(MediaPlaybackState::kPlaying,
1009 observer.session_info()->playback_state);
1010 }
1011
1012 EXPECT_TRUE(IsControllable());
1013 EXPECT_TRUE(IsActive());
1014 }
1015
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsStayIfOnlyOnePlayerHasBeenPaused)1016 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1017 ControlsStayIfOnlyOnePlayerHasBeenPaused) {
1018 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1019
1020 {
1021 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1022
1023 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1024 ResolveAudioFocusSuccess();
1025
1026 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1027 observer.WaitForControllable(true);
1028
1029 EXPECT_EQ(MediaPlaybackState::kPlaying,
1030 observer.session_info()->playback_state);
1031 }
1032
1033 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1034
1035 {
1036 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1037
1038 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1039 observer.WaitForControllable(true);
1040
1041 EXPECT_EQ(MediaPlaybackState::kPlaying,
1042 observer.session_info()->playback_state);
1043 }
1044
1045 // Removing only content player doesn't hide the controls since the session
1046 // is still active.
1047 RemovePlayer(player_observer.get(), 0);
1048
1049 {
1050 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1051
1052 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1053 observer.WaitForControllable(true);
1054
1055 EXPECT_EQ(MediaPlaybackState::kPlaying,
1056 observer.session_info()->playback_state);
1057 }
1058
1059 EXPECT_TRUE(IsControllable());
1060 EXPECT_TRUE(IsActive());
1061 }
1062
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenTheLastPlayerIsRemoved)1063 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1064 ControlsHideWhenTheLastPlayerIsRemoved) {
1065 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1066
1067 {
1068 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1069
1070 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1071 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1072 ResolveAudioFocusSuccess();
1073
1074 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1075 observer.WaitForControllable(true);
1076 }
1077
1078 RemovePlayer(player_observer.get(), 0);
1079
1080 {
1081 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1082 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1083 observer.WaitForControllable(true);
1084 }
1085
1086 EXPECT_TRUE(IsControllable());
1087 EXPECT_TRUE(IsActive());
1088
1089 RemovePlayer(player_observer.get(), 1);
1090
1091 {
1092 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1093 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1094 observer.WaitForControllable(false);
1095 }
1096
1097 EXPECT_FALSE(IsControllable());
1098 EXPECT_FALSE(IsActive());
1099 }
1100
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenAllThePlayersAreRemoved)1101 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1102 ControlsHideWhenAllThePlayersAreRemoved) {
1103 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1104
1105 {
1106 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1107
1108 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1109 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1110 ResolveAudioFocusSuccess();
1111
1112 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1113 observer.WaitForControllable(true);
1114 }
1115
1116 RemovePlayers(player_observer.get());
1117
1118 {
1119 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1120 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1121 observer.WaitForControllable(false);
1122 }
1123
1124 EXPECT_FALSE(IsControllable());
1125 EXPECT_FALSE(IsActive());
1126 }
1127
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsNotHideWhenTheLastPlayerIsPaused)1128 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1129 ControlsNotHideWhenTheLastPlayerIsPaused) {
1130 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1131
1132 {
1133 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1134
1135 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1136 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1137 ResolveAudioFocusSuccess();
1138
1139 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1140 observer.WaitForControllable(true);
1141
1142 EXPECT_EQ(MediaPlaybackState::kPlaying,
1143 observer.session_info()->playback_state);
1144 }
1145
1146 OnPlayerPaused(player_observer.get(), 0);
1147
1148 {
1149 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1150 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1151 observer.WaitForControllable(true);
1152
1153 EXPECT_EQ(MediaPlaybackState::kPlaying,
1154 observer.session_info()->playback_state);
1155 }
1156
1157 EXPECT_TRUE(IsControllable());
1158 EXPECT_TRUE(IsActive());
1159
1160 OnPlayerPaused(player_observer.get(), 1);
1161
1162 {
1163 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1164 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1165 observer.WaitForControllable(true);
1166
1167 EXPECT_EQ(MediaPlaybackState::kPaused,
1168 observer.session_info()->playback_state);
1169 }
1170
1171 EXPECT_TRUE(IsControllable());
1172 EXPECT_FALSE(IsActive());
1173 }
1174
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,SuspendTemporaryUpdatesControls)1175 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1176 SuspendTemporaryUpdatesControls) {
1177 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1178
1179 {
1180 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1181
1182 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1183 ResolveAudioFocusSuccess();
1184
1185 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1186 observer.WaitForControllable(true);
1187
1188 EXPECT_EQ(MediaPlaybackState::kPlaying,
1189 observer.session_info()->playback_state);
1190 }
1191
1192 SystemSuspend(true);
1193
1194 {
1195 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1196 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1197 observer.WaitForControllable(true);
1198
1199 EXPECT_EQ(MediaPlaybackState::kPaused,
1200 observer.session_info()->playback_state);
1201 }
1202
1203 EXPECT_TRUE(IsControllable());
1204 EXPECT_FALSE(IsActive());
1205 }
1206
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsUpdatedWhenResumed)1207 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1208 ControlsUpdatedWhenResumed) {
1209 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1210
1211 {
1212 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1213
1214 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1215 ResolveAudioFocusSuccess();
1216
1217 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1218 observer.WaitForControllable(true);
1219
1220 EXPECT_EQ(MediaPlaybackState::kPlaying,
1221 observer.session_info()->playback_state);
1222 }
1223
1224 SystemSuspend(true);
1225 SystemResume();
1226
1227 {
1228 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1229
1230 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1231 observer.WaitForControllable(true);
1232
1233 EXPECT_EQ(MediaPlaybackState::kPlaying,
1234 observer.session_info()->playback_state);
1235 }
1236
1237 EXPECT_TRUE(IsControllable());
1238 EXPECT_TRUE(IsActive());
1239 }
1240
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenSessionSuspendedPermanently)1241 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1242 ControlsHideWhenSessionSuspendedPermanently) {
1243 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1244
1245 {
1246 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1247
1248 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1249 ResolveAudioFocusSuccess();
1250
1251 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1252 observer.WaitForControllable(true);
1253
1254 EXPECT_EQ(MediaPlaybackState::kPlaying,
1255 observer.session_info()->playback_state);
1256 }
1257
1258 SystemSuspend(false);
1259
1260 {
1261 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1262 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1263 observer.WaitForControllable(false);
1264
1265 EXPECT_EQ(MediaPlaybackState::kPaused,
1266 observer.session_info()->playback_state);
1267 }
1268
1269 EXPECT_FALSE(IsControllable());
1270 EXPECT_FALSE(IsActive());
1271 }
1272
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenSessionStops)1273 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1274 ControlsHideWhenSessionStops) {
1275 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1276
1277 {
1278 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1279
1280 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1281 ResolveAudioFocusSuccess();
1282
1283 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1284 observer.WaitForControllable(true);
1285
1286 EXPECT_EQ(MediaPlaybackState::kPlaying,
1287 observer.session_info()->playback_state);
1288 }
1289
1290 media_session_->Stop(MediaSession::SuspendType::kUI);
1291
1292 {
1293 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1294
1295 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1296 observer.WaitForControllable(false);
1297
1298 EXPECT_EQ(MediaPlaybackState::kPaused,
1299 observer.session_info()->playback_state);
1300 }
1301
1302 EXPECT_FALSE(IsControllable());
1303 EXPECT_FALSE(IsActive());
1304 }
1305
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHideWhenSessionChangesFromContentToTransient)1306 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1307 ControlsHideWhenSessionChangesFromContentToTransient) {
1308 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1309
1310 {
1311 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1312
1313 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1314 ResolveAudioFocusSuccess();
1315
1316 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1317 observer.WaitForControllable(true);
1318
1319 EXPECT_EQ(MediaPlaybackState::kPlaying,
1320 observer.session_info()->playback_state);
1321 }
1322
1323 SystemSuspend(true);
1324
1325 {
1326 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1327 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1328 observer.WaitForControllable(true);
1329
1330 EXPECT_EQ(MediaPlaybackState::kPaused,
1331 observer.session_info()->playback_state);
1332 }
1333
1334 {
1335 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1336
1337 // This should reset the session and change it to a transient, so
1338 // hide the controls.
1339 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1340 ResolveAudioFocusSuccess();
1341
1342 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1343 observer.WaitForControllable(false);
1344
1345 EXPECT_EQ(MediaPlaybackState::kPlaying,
1346 observer.session_info()->playback_state);
1347 }
1348
1349 EXPECT_FALSE(IsControllable());
1350 EXPECT_TRUE(IsActive());
1351 }
1352
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsUpdatedWhenNewPlayerResetsSession)1353 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1354 ControlsUpdatedWhenNewPlayerResetsSession) {
1355 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1356
1357 {
1358 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1359
1360 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1361 ResolveAudioFocusSuccess();
1362
1363 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1364 observer.WaitForControllable(true);
1365
1366 EXPECT_EQ(MediaPlaybackState::kPlaying,
1367 observer.session_info()->playback_state);
1368 }
1369
1370 SystemSuspend(true);
1371
1372 {
1373 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1374 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1375 observer.WaitForControllable(true);
1376
1377 EXPECT_EQ(MediaPlaybackState::kPaused,
1378 observer.session_info()->playback_state);
1379 }
1380
1381 {
1382 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1383
1384 // This should reset the session and update the controls.
1385 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1386 ResolveAudioFocusSuccess();
1387
1388 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1389 observer.WaitForControllable(true);
1390
1391 EXPECT_EQ(MediaPlaybackState::kPlaying,
1392 observer.session_info()->playback_state);
1393 }
1394
1395 EXPECT_TRUE(IsControllable());
1396 EXPECT_TRUE(IsActive());
1397 }
1398
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsResumedWhenPlayerIsResumed)1399 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1400 ControlsResumedWhenPlayerIsResumed) {
1401 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1402
1403 {
1404 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1405
1406 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1407 ResolveAudioFocusSuccess();
1408
1409 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1410 observer.WaitForControllable(true);
1411
1412 EXPECT_EQ(MediaPlaybackState::kPlaying,
1413 observer.session_info()->playback_state);
1414 }
1415
1416 SystemSuspend(true);
1417
1418 {
1419 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1420 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1421 observer.WaitForControllable(true);
1422
1423 EXPECT_EQ(MediaPlaybackState::kPaused,
1424 observer.session_info()->playback_state);
1425 }
1426
1427 {
1428 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1429
1430 // This should resume the session and update the controls.
1431 AddPlayer(player_observer.get(), 0, media::MediaContentType::Persistent);
1432 ResolveAudioFocusSuccess();
1433
1434 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1435 observer.WaitForControllable(true);
1436
1437 EXPECT_EQ(MediaPlaybackState::kPlaying,
1438 observer.session_info()->playback_state);
1439 }
1440
1441 EXPECT_TRUE(IsControllable());
1442 EXPECT_TRUE(IsActive());
1443 }
1444
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsUpdatedDueToResumeSessionAction)1445 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1446 ControlsUpdatedDueToResumeSessionAction) {
1447 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1448
1449 {
1450 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1451
1452 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1453 ResolveAudioFocusSuccess();
1454
1455 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1456 observer.WaitForControllable(true);
1457
1458 EXPECT_EQ(MediaPlaybackState::kPlaying,
1459 observer.session_info()->playback_state);
1460 }
1461
1462 UISuspend();
1463
1464 {
1465 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1466 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1467 observer.WaitForControllable(true);
1468
1469 EXPECT_EQ(MediaPlaybackState::kPaused,
1470 observer.session_info()->playback_state);
1471 }
1472
1473 EXPECT_TRUE(IsControllable());
1474 EXPECT_FALSE(IsActive());
1475 }
1476
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsUpdatedDueToSuspendSessionAction)1477 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1478 ControlsUpdatedDueToSuspendSessionAction) {
1479 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1480
1481 {
1482 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1483
1484 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1485 ResolveAudioFocusSuccess();
1486
1487 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1488 observer.WaitForControllable(true);
1489
1490 EXPECT_EQ(MediaPlaybackState::kPlaying,
1491 observer.session_info()->playback_state);
1492 }
1493
1494 UISuspend();
1495
1496 {
1497 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1498 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1499 observer.WaitForControllable(true);
1500
1501 EXPECT_EQ(MediaPlaybackState::kPaused,
1502 observer.session_info()->playback_state);
1503 }
1504
1505 UIResume();
1506
1507 {
1508 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1509 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1510 observer.WaitForControllable(true);
1511
1512 EXPECT_EQ(MediaPlaybackState::kPlaying,
1513 observer.session_info()->playback_state);
1514 }
1515
1516 EXPECT_TRUE(IsControllable());
1517 EXPECT_TRUE(IsActive());
1518
1519 ResolveAudioFocusSuccess();
1520
1521 {
1522 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1523 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1524 observer.WaitForControllable(true);
1525
1526 EXPECT_EQ(MediaPlaybackState::kPlaying,
1527 observer.session_info()->playback_state);
1528 }
1529
1530 EXPECT_TRUE(IsControllable());
1531 EXPECT_TRUE(IsActive());
1532 }
1533
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsDontShowWhenOneShotIsPresent)1534 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1535 ControlsDontShowWhenOneShotIsPresent) {
1536 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1537
1538 {
1539 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1540
1541 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1542 ResolveAudioFocusSuccess();
1543
1544 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1545 observer.WaitForControllable(false);
1546
1547 EXPECT_FALSE(IsControllable());
1548 EXPECT_TRUE(IsActive());
1549 }
1550
1551 {
1552 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1553
1554 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1555
1556 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1557 observer.WaitForControllable(false);
1558
1559 EXPECT_FALSE(IsControllable());
1560 EXPECT_TRUE(IsActive());
1561 }
1562
1563 {
1564 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1565
1566 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1567
1568 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1569 observer.WaitForControllable(false);
1570
1571 EXPECT_FALSE(IsControllable());
1572 EXPECT_TRUE(IsActive());
1573 }
1574 }
1575
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsHiddenAfterRemoveOneShotWithoutOtherPlayers)1576 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1577 ControlsHiddenAfterRemoveOneShotWithoutOtherPlayers) {
1578 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1579
1580 {
1581 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1582
1583 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1584 ResolveAudioFocusSuccess();
1585
1586 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1587 observer.WaitForControllable(false);
1588 }
1589
1590 RemovePlayer(player_observer.get(), 0);
1591
1592 {
1593 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1594 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1595 observer.WaitForControllable(false);
1596 }
1597
1598 EXPECT_FALSE(IsControllable());
1599 EXPECT_FALSE(IsActive());
1600 }
1601
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ControlsShowAfterRemoveOneShotWithPersistentPresent)1602 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1603 ControlsShowAfterRemoveOneShotWithPersistentPresent) {
1604 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1605
1606 {
1607 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1608
1609 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1610 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1611 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1612 ResolveAudioFocusSuccess();
1613
1614 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1615 observer.WaitForControllable(false);
1616 }
1617
1618 RemovePlayer(player_observer.get(), 0);
1619
1620 {
1621 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1622 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1623 observer.WaitForControllable(true);
1624 }
1625
1626 EXPECT_TRUE(IsControllable());
1627 EXPECT_TRUE(IsActive());
1628 }
1629
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,DontSuspendWhenOneShotIsPresent)1630 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1631 DontSuspendWhenOneShotIsPresent) {
1632 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1633
1634 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1635 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1636 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1637 ResolveAudioFocusSuccess();
1638
1639 SystemSuspend(false);
1640
1641 EXPECT_FALSE(IsControllable());
1642 EXPECT_TRUE(IsActive());
1643
1644 EXPECT_EQ(0, player_observer->received_suspend_calls());
1645 }
1646
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,DontResumeBySystemUISuspendedSessions)1647 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1648 DontResumeBySystemUISuspendedSessions) {
1649 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1650
1651 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1652 ResolveAudioFocusSuccess();
1653
1654 UISuspend();
1655 EXPECT_TRUE(IsControllable());
1656 EXPECT_FALSE(IsActive());
1657
1658 SystemResume();
1659 EXPECT_TRUE(IsControllable());
1660 EXPECT_FALSE(IsActive());
1661 }
1662
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AllowUIResumeForSystemSuspend)1663 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1664 AllowUIResumeForSystemSuspend) {
1665 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1666
1667 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1668 ResolveAudioFocusSuccess();
1669
1670 SystemSuspend(true);
1671 EXPECT_TRUE(IsControllable());
1672 EXPECT_FALSE(IsActive());
1673
1674 UIResume();
1675 ResolveAudioFocusSuccess();
1676
1677 EXPECT_TRUE(IsControllable());
1678 EXPECT_TRUE(IsActive());
1679 }
1680
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumeSuspendFromUI)1681 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest, ResumeSuspendFromUI) {
1682 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1683
1684 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1685 ResolveAudioFocusSuccess();
1686
1687 UISuspend();
1688 EXPECT_TRUE(IsControllable());
1689 EXPECT_FALSE(IsActive());
1690
1691 UIResume();
1692 EXPECT_TRUE(IsActive());
1693
1694 ResolveAudioFocusSuccess();
1695 EXPECT_TRUE(IsControllable());
1696 EXPECT_TRUE(IsActive());
1697 }
1698
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ResumeSuspendFromSystem)1699 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1700 ResumeSuspendFromSystem) {
1701 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1702
1703 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1704 ResolveAudioFocusSuccess();
1705
1706 SystemSuspend(true);
1707 EXPECT_TRUE(IsControllable());
1708 EXPECT_FALSE(IsActive());
1709
1710 SystemResume();
1711 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
1712 EXPECT_TRUE(IsControllable());
1713 EXPECT_TRUE(IsActive());
1714 }
1715
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,OneShotTakesGainFocus)1716 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1717 OneShotTakesGainFocus) {
1718 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1719
1720 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1721 ResolveAudioFocusSuccess();
1722
1723 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
1724 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
1725
1726 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1727 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
1728
1729 EXPECT_EQ(AudioFocusType::kGain,
1730 mock_audio_focus_delegate()->GetCurrentFocusType());
1731 }
1732
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingOneShotDropsFocus)1733 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1734 RemovingOneShotDropsFocus) {
1735 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1736
1737 EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus());
1738 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1739 ResolveAudioFocusSuccess();
1740
1741 RemovePlayer(player_observer.get(), 0);
1742 }
1743
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,RemovingOneShotWhileStillHavingOtherPlayersKeepsFocus)1744 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1745 RemovingOneShotWhileStillHavingOtherPlayersKeepsFocus) {
1746 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1747
1748 EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus())
1749 .Times(1); // Called in TearDown
1750 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1751 ResolveAudioFocusSuccess();
1752
1753 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1754 EXPECT_FALSE(HasUnresolvedAudioFocusRequest());
1755
1756 RemovePlayer(player_observer.get(), 0);
1757 }
1758
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ActualPlaybackStateWhilePlayerPaused)1759 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1760 ActualPlaybackStateWhilePlayerPaused) {
1761 EnsureMediaSessionService();
1762 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
1763 shell()->web_contents()->GetMainFrame());
1764
1765 {
1766 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1767
1768 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1769 ResolveAudioFocusSuccess();
1770
1771 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1772 EXPECT_EQ(MediaPlaybackState::kPlaying,
1773 observer.session_info()->playback_state);
1774 }
1775
1776 OnPlayerPaused(player_observer.get(), 0);
1777
1778 {
1779 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1780 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1781 EXPECT_EQ(MediaPlaybackState::kPaused,
1782 observer.session_info()->playback_state);
1783 }
1784
1785 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1786
1787 {
1788 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1789 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1790 EXPECT_EQ(MediaPlaybackState::kPlaying,
1791 observer.session_info()->playback_state);
1792 }
1793
1794 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1795
1796 {
1797 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1798 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1799 EXPECT_EQ(MediaPlaybackState::kPaused,
1800 observer.session_info()->playback_state);
1801 }
1802
1803 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1804
1805 {
1806 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1807 observer.WaitForState(MediaSessionInfo::SessionState::kSuspended);
1808 EXPECT_EQ(MediaPlaybackState::kPaused,
1809 observer.session_info()->playback_state);
1810 }
1811 }
1812
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ActualPlaybackStateWhilePlayerPlaying)1813 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1814 ActualPlaybackStateWhilePlayerPlaying) {
1815 EnsureMediaSessionService();
1816 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
1817 shell()->web_contents()->GetMainFrame());
1818
1819 {
1820 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1821
1822 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1823 ResolveAudioFocusSuccess();
1824
1825 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1826 EXPECT_EQ(MediaPlaybackState::kPlaying,
1827 observer.session_info()->playback_state);
1828 }
1829
1830 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1831
1832 {
1833 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1834 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1835 EXPECT_EQ(MediaPlaybackState::kPlaying,
1836 observer.session_info()->playback_state);
1837 }
1838
1839 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1840
1841 {
1842 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1843 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1844 EXPECT_EQ(MediaPlaybackState::kPlaying,
1845 observer.session_info()->playback_state);
1846 }
1847
1848 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1849
1850 {
1851 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1852 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1853 EXPECT_EQ(MediaPlaybackState::kPlaying,
1854 observer.session_info()->playback_state);
1855 }
1856 }
1857
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,ActualPlaybackStateWhilePlayerRemoved)1858 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1859 ActualPlaybackStateWhilePlayerRemoved) {
1860 EnsureMediaSessionService();
1861 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
1862 shell()->web_contents()->GetMainFrame());
1863
1864 {
1865 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1866
1867 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1868 ResolveAudioFocusSuccess();
1869
1870 observer.WaitForState(MediaSessionInfo::SessionState::kActive);
1871 EXPECT_EQ(MediaPlaybackState::kPlaying,
1872 observer.session_info()->playback_state);
1873 }
1874
1875 RemovePlayer(player_observer.get(), 0);
1876
1877 {
1878 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1879 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1880 EXPECT_EQ(MediaPlaybackState::kPaused,
1881 observer.session_info()->playback_state);
1882 }
1883
1884 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1885
1886 {
1887 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1888 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1889 EXPECT_EQ(MediaPlaybackState::kPaused,
1890 observer.session_info()->playback_state);
1891 }
1892
1893 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1894
1895 {
1896 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1897 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1898 EXPECT_EQ(MediaPlaybackState::kPaused,
1899 observer.session_info()->playback_state);
1900 }
1901
1902 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1903
1904 {
1905 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
1906 observer.WaitForState(MediaSessionInfo::SessionState::kInactive);
1907 EXPECT_EQ(MediaPlaybackState::kPaused,
1908 observer.session_info()->playback_state);
1909 }
1910 }
1911
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_SystemTransient)1912 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1913 UMA_Suspended_SystemTransient) {
1914 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1915 base::HistogramTester tester;
1916
1917 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1918 ResolveAudioFocusSuccess();
1919 SystemSuspend(true);
1920
1921 std::unique_ptr<base::HistogramSamples> samples(
1922 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
1923 EXPECT_EQ(1, samples->TotalCount());
1924 EXPECT_EQ(1, samples->GetCount(0)); // System Transient
1925 EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
1926 EXPECT_EQ(0, samples->GetCount(2)); // UI
1927 }
1928
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_SystemPermantent)1929 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1930 UMA_Suspended_SystemPermantent) {
1931 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1932 base::HistogramTester tester;
1933
1934 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1935 ResolveAudioFocusSuccess();
1936 SystemSuspend(false);
1937
1938 std::unique_ptr<base::HistogramSamples> samples(
1939 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
1940 EXPECT_EQ(1, samples->TotalCount());
1941 EXPECT_EQ(0, samples->GetCount(0)); // System Transient
1942 EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
1943 EXPECT_EQ(0, samples->GetCount(2)); // UI
1944 }
1945
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_UI)1946 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest, UMA_Suspended_UI) {
1947 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1948
1949 base::HistogramTester tester;
1950
1951 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1952 ResolveAudioFocusSuccess();
1953 UISuspend();
1954
1955 std::unique_ptr<base::HistogramSamples> samples(
1956 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
1957 EXPECT_EQ(1, samples->TotalCount());
1958 EXPECT_EQ(0, samples->GetCount(0)); // System Transient
1959 EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
1960 EXPECT_EQ(1, samples->GetCount(2)); // UI
1961 }
1962
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_Multiple)1963 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1964 UMA_Suspended_Multiple) {
1965 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1966 base::HistogramTester tester;
1967
1968 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1969 ResolveAudioFocusSuccess();
1970
1971 UISuspend();
1972 UIResume();
1973 ResolveAudioFocusSuccess();
1974
1975 SystemSuspend(true);
1976 SystemResume();
1977
1978 UISuspend();
1979 UIResume();
1980 ResolveAudioFocusSuccess();
1981
1982 SystemSuspend(false);
1983
1984 std::unique_ptr<base::HistogramSamples> samples(
1985 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
1986 EXPECT_EQ(4, samples->TotalCount());
1987 EXPECT_EQ(1, samples->GetCount(0)); // System Transient
1988 EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
1989 EXPECT_EQ(2, samples->GetCount(2)); // UI
1990 }
1991
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_Crossing)1992 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
1993 UMA_Suspended_Crossing) {
1994 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
1995 base::HistogramTester tester;
1996
1997 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1998 ResolveAudioFocusSuccess();
1999
2000 UISuspend();
2001 SystemSuspend(true);
2002 SystemSuspend(false);
2003 UIResume();
2004 ResolveAudioFocusSuccess();
2005
2006 SystemSuspend(true);
2007 SystemSuspend(true);
2008 SystemSuspend(false);
2009 SystemResume();
2010
2011 std::unique_ptr<base::HistogramSamples> samples(
2012 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
2013 EXPECT_EQ(2, samples->TotalCount());
2014 EXPECT_EQ(1, samples->GetCount(0)); // System Transient
2015 EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
2016 EXPECT_EQ(1, samples->GetCount(2)); // UI
2017 }
2018
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_Suspended_Stop)2019 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest, UMA_Suspended_Stop) {
2020 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2021 base::HistogramTester tester;
2022
2023 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2024 ResolveAudioFocusSuccess();
2025 media_session_->Stop(MediaSession::SuspendType::kUI);
2026
2027 std::unique_ptr<base::HistogramSamples> samples(
2028 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
2029 EXPECT_EQ(1, samples->TotalCount());
2030 EXPECT_EQ(0, samples->GetCount(0)); // System Transient
2031 EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
2032 EXPECT_EQ(1, samples->GetCount(2)); // UI
2033 }
2034
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_NoActivation)2035 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2036 UMA_ActiveTime_NoActivation) {
2037 base::HistogramTester tester;
2038
2039 std::unique_ptr<MediaSessionImpl> media_session = CreateDummyMediaSession();
2040 media_session.reset();
2041
2042 // A MediaSession that wasn't active doesn't register an active time.
2043 std::unique_ptr<base::HistogramSamples> samples(
2044 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2045 EXPECT_EQ(0, samples->TotalCount());
2046 }
2047
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_SimpleActivation)2048 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2049 UMA_ActiveTime_SimpleActivation) {
2050 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2051 base::HistogramTester tester;
2052
2053 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2054 base::SimpleTestTickClock clock;
2055 clock.SetNowTicks(base::TimeTicks::Now());
2056 media_session_uma_helper->SetClockForTest(&clock);
2057
2058 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2059 ResolveAudioFocusSuccess();
2060
2061 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2062 media_session_->Stop(MediaSession::SuspendType::kUI);
2063
2064 std::unique_ptr<base::HistogramSamples> samples(
2065 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2066 EXPECT_EQ(1, samples->TotalCount());
2067 EXPECT_EQ(1, samples->GetCount(1000));
2068 }
2069
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_ActivationWithUISuspension)2070 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2071 UMA_ActiveTime_ActivationWithUISuspension) {
2072 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2073 base::HistogramTester tester;
2074
2075 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2076 base::SimpleTestTickClock clock;
2077 clock.SetNowTicks(base::TimeTicks::Now());
2078 media_session_uma_helper->SetClockForTest(&clock);
2079
2080 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2081 ResolveAudioFocusSuccess();
2082
2083 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2084 UISuspend();
2085
2086 clock.Advance(base::TimeDelta::FromMilliseconds(2000));
2087 UIResume();
2088 ResolveAudioFocusSuccess();
2089
2090 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2091 media_session_->Stop(MediaSession::SuspendType::kUI);
2092
2093 std::unique_ptr<base::HistogramSamples> samples(
2094 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2095 EXPECT_EQ(1, samples->TotalCount());
2096 EXPECT_EQ(1, samples->GetCount(2000));
2097 }
2098
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_ActivationWithSystemSuspension)2099 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2100 UMA_ActiveTime_ActivationWithSystemSuspension) {
2101 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2102 base::HistogramTester tester;
2103
2104 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2105 base::SimpleTestTickClock clock;
2106 clock.SetNowTicks(base::TimeTicks::Now());
2107 media_session_uma_helper->SetClockForTest(&clock);
2108
2109 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2110 ResolveAudioFocusSuccess();
2111
2112 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2113 SystemSuspend(true);
2114
2115 clock.Advance(base::TimeDelta::FromMilliseconds(2000));
2116 SystemResume();
2117
2118 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2119 media_session_->Stop(MediaSession::SuspendType::kUI);
2120
2121 std::unique_ptr<base::HistogramSamples> samples(
2122 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2123 EXPECT_EQ(1, samples->TotalCount());
2124 EXPECT_EQ(1, samples->GetCount(2000));
2125 }
2126
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_ActivateSuspendedButNotStopped)2127 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2128 UMA_ActiveTime_ActivateSuspendedButNotStopped) {
2129 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2130 base::HistogramTester tester;
2131
2132 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2133 base::SimpleTestTickClock clock;
2134 clock.SetNowTicks(base::TimeTicks::Now());
2135 media_session_uma_helper->SetClockForTest(&clock);
2136
2137 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2138 ResolveAudioFocusSuccess();
2139 clock.Advance(base::TimeDelta::FromMilliseconds(500));
2140 SystemSuspend(true);
2141
2142 {
2143 std::unique_ptr<base::HistogramSamples> samples(
2144 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2145 EXPECT_EQ(0, samples->TotalCount());
2146 }
2147
2148 SystemResume();
2149 clock.Advance(base::TimeDelta::FromMilliseconds(5000));
2150 UISuspend();
2151
2152 {
2153 std::unique_ptr<base::HistogramSamples> samples(
2154 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2155 EXPECT_EQ(0, samples->TotalCount());
2156 }
2157 }
2158
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_ActivateSuspendStopTwice)2159 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2160 UMA_ActiveTime_ActivateSuspendStopTwice) {
2161 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2162 base::HistogramTester tester;
2163
2164 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2165 base::SimpleTestTickClock clock;
2166 clock.SetNowTicks(base::TimeTicks::Now());
2167 media_session_uma_helper->SetClockForTest(&clock);
2168
2169 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2170 ResolveAudioFocusSuccess();
2171 clock.Advance(base::TimeDelta::FromMilliseconds(500));
2172 SystemSuspend(true);
2173 media_session_->Stop(MediaSession::SuspendType::kUI);
2174
2175 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2176 ResolveAudioFocusSuccess();
2177 clock.Advance(base::TimeDelta::FromMilliseconds(5000));
2178 SystemResume();
2179 media_session_->Stop(MediaSession::SuspendType::kUI);
2180
2181 std::unique_ptr<base::HistogramSamples> samples(
2182 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2183 EXPECT_EQ(2, samples->TotalCount());
2184 EXPECT_EQ(1, samples->GetCount(500));
2185 EXPECT_EQ(1, samples->GetCount(5000));
2186 }
2187
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,UMA_ActiveTime_MultipleActivations)2188 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2189 UMA_ActiveTime_MultipleActivations) {
2190 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2191 base::HistogramTester tester;
2192
2193 MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
2194 base::SimpleTestTickClock clock;
2195 clock.SetNowTicks(base::TimeTicks::Now());
2196 media_session_uma_helper->SetClockForTest(&clock);
2197
2198 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2199 ResolveAudioFocusSuccess();
2200 clock.Advance(base::TimeDelta::FromMilliseconds(10000));
2201 RemovePlayer(player_observer.get(), 0);
2202
2203 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2204 ResolveAudioFocusSuccess();
2205 clock.Advance(base::TimeDelta::FromMilliseconds(1000));
2206 media_session_->Stop(MediaSession::SuspendType::kUI);
2207
2208 std::unique_ptr<base::HistogramSamples> samples(
2209 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
2210 EXPECT_EQ(2, samples->TotalCount());
2211 EXPECT_EQ(1, samples->GetCount(1000));
2212 EXPECT_EQ(1, samples->GetCount(10000));
2213 }
2214
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AddingObserverNotifiesCurrentInformation_EmptyInfo)2215 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2216 AddingObserverNotifiesCurrentInformation_EmptyInfo) {
2217 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2218
2219 media_session::MediaMetadata expected_metadata;
2220 expected_metadata.title = shell()->web_contents()->GetTitle();
2221 expected_metadata.source_title = GetExpectedSourceTitle();
2222 observer.WaitForExpectedMetadata(expected_metadata);
2223 }
2224
IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,AddingMojoObserverNotifiesCurrentInformation_WithInfo)2225 IN_PROC_BROWSER_TEST_P(MediaSessionImplParamBrowserTest,
2226 AddingMojoObserverNotifiesCurrentInformation_WithInfo) {
2227 // Set up the service and information.
2228 EnsureMediaSessionService();
2229
2230 media_session::MediaMetadata expected_metadata;
2231 expected_metadata.title = base::ASCIIToUTF16("title");
2232 expected_metadata.artist = base::ASCIIToUTF16("artist");
2233 expected_metadata.album = base::ASCIIToUTF16("album");
2234 expected_metadata.source_title = GetExpectedSourceTitle();
2235
2236 blink::mojom::SpecMediaMetadataPtr spec_metadata(
2237 blink::mojom::SpecMediaMetadata::New());
2238 spec_metadata->title = base::ASCIIToUTF16("title");
2239 spec_metadata->artist = base::ASCIIToUTF16("artist");
2240 spec_metadata->album = base::ASCIIToUTF16("album");
2241 mock_media_session_service_->SetMetadata(std::move(spec_metadata));
2242
2243 // Make sure the service is routed,
2244 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>(
2245 shell()->web_contents()->GetMainFrame());
2246
2247 {
2248 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2249 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2250 ResolveAudioFocusSuccess();
2251
2252 observer.WaitForExpectedMetadata(expected_metadata);
2253 }
2254 }
2255
IN_PROC_BROWSER_TEST_F(MediaSessionImplSyncBrowserTest,PepperPlayerNotAddedIfFocusFailed)2256 IN_PROC_BROWSER_TEST_F(MediaSessionImplSyncBrowserTest,
2257 PepperPlayerNotAddedIfFocusFailed) {
2258 SetSyncAudioFocusResult(AudioFocusDelegate::AudioFocusResult::kFailed);
2259
2260 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2261 int player_id = player_observer->StartNewPlayer();
2262
2263 EXPECT_FALSE(AddPlayer(player_observer.get(), player_id,
2264 media::MediaContentType::Pepper));
2265
2266 EXPECT_FALSE(media_session_->HasPepper());
2267 }
2268
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_RequestFailure_Gain)2269 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_RequestFailure_Gain) {
2270 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2271
2272 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2273 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
2274
2275 EXPECT_TRUE(player_observer->IsPlaying(0));
2276 EXPECT_TRUE(player_observer->IsPlaying(1));
2277 EXPECT_TRUE(IsActive());
2278
2279 // The gain request failed so we should suspend the whole session.
2280 ResolveAudioFocusFailure();
2281 EXPECT_FALSE(player_observer->IsPlaying(0));
2282 EXPECT_FALSE(player_observer->IsPlaying(1));
2283 EXPECT_FALSE(IsActive());
2284
2285 ResolveAudioFocusSuccess();
2286 EXPECT_FALSE(player_observer->IsPlaying(0));
2287 EXPECT_FALSE(player_observer->IsPlaying(1));
2288 EXPECT_FALSE(IsActive());
2289 }
2290
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_RequestFailure_GainTransient)2291 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2292 Async_RequestFailure_GainTransient) {
2293 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2294
2295 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2296 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
2297
2298 EXPECT_TRUE(player_observer->IsPlaying(0));
2299 EXPECT_TRUE(player_observer->IsPlaying(1));
2300 EXPECT_TRUE(IsActive());
2301
2302 ResolveAudioFocusSuccess();
2303 EXPECT_TRUE(player_observer->IsPlaying(0));
2304 EXPECT_TRUE(player_observer->IsPlaying(1));
2305 EXPECT_TRUE(IsActive());
2306
2307 // A transient audio focus failure should only affect transient players.
2308 ResolveAudioFocusFailure();
2309 EXPECT_TRUE(player_observer->IsPlaying(0));
2310 EXPECT_FALSE(player_observer->IsPlaying(1));
2311 EXPECT_TRUE(IsActive());
2312 }
2313
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_GainThenTransient)2314 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_GainThenTransient) {
2315 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2316
2317 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2318 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
2319
2320 EXPECT_TRUE(player_observer->IsPlaying(0));
2321 EXPECT_TRUE(player_observer->IsPlaying(1));
2322
2323 ResolveAudioFocusSuccess();
2324 EXPECT_TRUE(player_observer->IsPlaying(0));
2325 EXPECT_TRUE(player_observer->IsPlaying(1));
2326
2327 ResolveAudioFocusSuccess();
2328 EXPECT_TRUE(player_observer->IsPlaying(0));
2329 EXPECT_TRUE(player_observer->IsPlaying(1));
2330 }
2331
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_TransientThenGain)2332 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_TransientThenGain) {
2333 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2334
2335 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
2336 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2337
2338 EXPECT_TRUE(player_observer->IsPlaying(0));
2339 EXPECT_TRUE(player_observer->IsPlaying(1));
2340
2341 ResolveAudioFocusSuccess();
2342 EXPECT_TRUE(player_observer->IsPlaying(0));
2343 EXPECT_TRUE(player_observer->IsPlaying(1));
2344
2345 ResolveAudioFocusSuccess();
2346 EXPECT_TRUE(player_observer->IsPlaying(0));
2347 EXPECT_TRUE(player_observer->IsPlaying(1));
2348 }
2349
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_SuspendBeforeResolve)2350 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2351 Async_SuspendBeforeResolve) {
2352 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2353
2354 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2355 EXPECT_TRUE(player_observer->IsPlaying(0));
2356
2357 SystemSuspend(true);
2358 EXPECT_FALSE(player_observer->IsPlaying(0));
2359 EXPECT_FALSE(IsActive());
2360
2361 ResolveAudioFocusSuccess();
2362 EXPECT_FALSE(player_observer->IsPlaying(0));
2363 EXPECT_FALSE(IsActive());
2364
2365 SystemResume();
2366 EXPECT_TRUE(IsActive());
2367 EXPECT_TRUE(player_observer->IsPlaying(0));
2368 }
2369
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_ResumeBeforeResolve)2370 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_ResumeBeforeResolve) {
2371 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2372
2373 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2374 EXPECT_TRUE(IsActive());
2375 EXPECT_TRUE(player_observer->IsPlaying(0));
2376
2377 UISuspend();
2378 EXPECT_FALSE(IsActive());
2379 EXPECT_FALSE(player_observer->IsPlaying(0));
2380
2381 UIResume();
2382 EXPECT_TRUE(IsActive());
2383 EXPECT_TRUE(player_observer->IsPlaying(0));
2384
2385 ResolveAudioFocusSuccess();
2386 EXPECT_TRUE(IsActive());
2387 EXPECT_TRUE(player_observer->IsPlaying(0));
2388
2389 ResolveAudioFocusFailure();
2390 EXPECT_FALSE(IsActive());
2391 EXPECT_FALSE(player_observer->IsPlaying(0));
2392 }
2393
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_RemoveBeforeResolve)2394 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_RemoveBeforeResolve) {
2395 {
2396 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2397
2398 EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus());
2399 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2400 EXPECT_TRUE(player_observer->IsPlaying(0));
2401
2402 RemovePlayer(player_observer.get(), 0);
2403 }
2404
2405 ResolveAudioFocusSuccess();
2406 }
2407
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_StopBeforeResolve)2408 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_StopBeforeResolve) {
2409 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2410
2411 StartNewPlayer(player_observer.get(), media::MediaContentType::Transient);
2412 ResolveAudioFocusSuccess();
2413 EXPECT_TRUE(player_observer->IsPlaying(0));
2414
2415 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2416 EXPECT_TRUE(player_observer->IsPlaying(1));
2417
2418 media_session_->Stop(MediaSession::SuspendType::kUI);
2419 ResolveAudioFocusSuccess();
2420
2421 EXPECT_FALSE(player_observer->IsPlaying(0));
2422 EXPECT_FALSE(player_observer->IsPlaying(1));
2423 }
2424
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_Unducking_Failure)2425 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_Unducking_Failure) {
2426 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2427
2428 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2429 EXPECT_TRUE(IsActive());
2430 EXPECT_TRUE(player_observer->IsPlaying(0));
2431
2432 SystemStartDucking();
2433 EXPECT_TRUE(IsDucking());
2434
2435 ResolveAudioFocusFailure();
2436 EXPECT_TRUE(IsDucking());
2437 }
2438
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_Unducking_Inactive)2439 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_Unducking_Inactive) {
2440 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2441
2442 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2443 EXPECT_TRUE(IsActive());
2444 EXPECT_TRUE(player_observer->IsPlaying(0));
2445
2446 media_session_->Stop(MediaSession::SuspendType::kUI);
2447 SystemStartDucking();
2448 EXPECT_TRUE(IsDucking());
2449
2450 ResolveAudioFocusSuccess();
2451 EXPECT_TRUE(IsDucking());
2452 }
2453
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_Unducking_Success)2454 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_Unducking_Success) {
2455 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2456
2457 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2458 EXPECT_TRUE(IsActive());
2459 EXPECT_TRUE(player_observer->IsPlaying(0));
2460
2461 SystemStartDucking();
2462 EXPECT_TRUE(IsDucking());
2463
2464 ResolveAudioFocusSuccess();
2465 EXPECT_FALSE(IsDucking());
2466 }
2467
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,Async_Unducking_Suspended)2468 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, Async_Unducking_Suspended) {
2469 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2470
2471 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2472 EXPECT_TRUE(IsActive());
2473 EXPECT_TRUE(player_observer->IsPlaying(0));
2474
2475 UISuspend();
2476 SystemStartDucking();
2477 EXPECT_TRUE(IsDucking());
2478
2479 ResolveAudioFocusSuccess();
2480 EXPECT_TRUE(IsDucking());
2481 }
2482
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,MetadataWhenFileUrlScheme)2483 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, MetadataWhenFileUrlScheme) {
2484 base::FilePath path = GetTestFilePath(nullptr, "title1.html");
2485 GURL file_url = net::FilePathToFileURL(path);
2486 EXPECT_TRUE(NavigateToURL(shell(), file_url));
2487
2488 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2489
2490 media_session::MediaMetadata expected_metadata;
2491 expected_metadata.title = shell()->web_contents()->GetTitle();
2492 expected_metadata.source_title = base::ASCIIToUTF16("Local File");
2493 observer.WaitForExpectedMetadata(expected_metadata);
2494 }
2495
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,UpdateFaviconURL)2496 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UpdateFaviconURL) {
2497 std::vector<gfx::Size> valid_sizes;
2498 valid_sizes.push_back(gfx::Size(100, 100));
2499 valid_sizes.push_back(gfx::Size(200, 200));
2500
2501 std::vector<blink::mojom::FaviconURLPtr> favicons;
2502 favicons.push_back(blink::mojom::FaviconURL::New(
2503 GURL("https://www.example.org/favicon1.png"),
2504 blink::mojom::FaviconIconType::kInvalid, valid_sizes));
2505 favicons.push_back(blink::mojom::FaviconURL::New(
2506 GURL(), blink::mojom::FaviconIconType::kFavicon, valid_sizes));
2507 favicons.push_back(blink::mojom::FaviconURL::New(
2508 GURL("https://www.example.org/favicon2.png"),
2509 blink::mojom::FaviconIconType::kFavicon, std::vector<gfx::Size>()));
2510 favicons.push_back(blink::mojom::FaviconURL::New(
2511 GURL("https://www.example.org/favicon3.png"),
2512 blink::mojom::FaviconIconType::kFavicon, valid_sizes));
2513 favicons.push_back(blink::mojom::FaviconURL::New(
2514 GURL("https://www.example.org/favicon4.png"),
2515 blink::mojom::FaviconIconType::kTouchIcon, valid_sizes));
2516 favicons.push_back(blink::mojom::FaviconURL::New(
2517 GURL("https://www.example.org/favicon5.png"),
2518 blink::mojom::FaviconIconType::kTouchPrecomposedIcon, valid_sizes));
2519 favicons.push_back(blink::mojom::FaviconURL::New(
2520 GURL("https://www.example.org/favicon6.png"),
2521 blink::mojom::FaviconIconType::kTouchIcon, std::vector<gfx::Size>()));
2522
2523 media_session_->DidUpdateFaviconURL(shell()->web_contents()->GetMainFrame(),
2524 favicons);
2525
2526 {
2527 std::vector<media_session::MediaImage> expected_images;
2528 media_session::MediaImage test_image_1;
2529 test_image_1.src = GURL("https://www.example.org/favicon2.png");
2530 test_image_1.sizes.push_back(kDefaultFaviconSize);
2531 expected_images.push_back(test_image_1);
2532
2533 media_session::MediaImage test_image_2;
2534 test_image_2.src = GURL("https://www.example.org/favicon3.png");
2535 test_image_2.sizes = valid_sizes;
2536 expected_images.push_back(test_image_2);
2537
2538 media_session::MediaImage test_image_3;
2539 test_image_3.src = GURL("https://www.example.org/favicon4.png");
2540 test_image_3.sizes = valid_sizes;
2541 expected_images.push_back(test_image_3);
2542
2543 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2544 observer.WaitForExpectedImagesOfType(
2545 media_session::mojom::MediaSessionImageType::kSourceIcon,
2546 expected_images);
2547 }
2548
2549 {
2550 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2551 media_session_->DidUpdateFaviconURL(
2552 shell()->web_contents()->GetMainFrame(),
2553 std::vector<blink::mojom::FaviconURLPtr>());
2554 observer.WaitForExpectedImagesOfType(
2555 media_session::mojom::MediaSessionImageType::kSourceIcon,
2556 std::vector<media_session::MediaImage>());
2557 }
2558 }
2559
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,UpdateFaviconURL_ClearOnNavigate)2560 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2561 UpdateFaviconURL_ClearOnNavigate) {
2562 std::vector<blink::mojom::FaviconURLPtr> favicons;
2563 favicons.push_back(blink::mojom::FaviconURL::New(
2564 GURL("https://www.example.org/favicon1.png"),
2565 blink::mojom::FaviconIconType::kFavicon, std::vector<gfx::Size>()));
2566
2567 media_session_->DidUpdateFaviconURL(shell()->web_contents()->GetMainFrame(),
2568 favicons);
2569
2570 {
2571 std::vector<media_session::MediaImage> expected_images;
2572 media_session::MediaImage test_image_1;
2573 test_image_1.src = GURL("https://www.example.org/favicon1.png");
2574 test_image_1.sizes.push_back(kDefaultFaviconSize);
2575 expected_images.push_back(test_image_1);
2576
2577 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2578 observer.WaitForExpectedImagesOfType(
2579 media_session::mojom::MediaSessionImageType::kSourceIcon,
2580 expected_images);
2581 }
2582
2583 {
2584 std::vector<media_session::MediaImage> expected_images;
2585 media_session::MediaImage test_image_1;
2586 test_image_1.src =
2587 embedded_test_server()->GetURL("example.com", "/favicon.ico");
2588 test_image_1.sizes.push_back(kDefaultFaviconSize);
2589 expected_images.push_back(test_image_1);
2590
2591 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2592 EXPECT_TRUE(NavigateToURL(shell(), embedded_test_server()->GetURL(
2593 "example.com", "/title1.html")));
2594
2595 observer.WaitForExpectedImagesOfType(
2596 media_session::mojom::MediaSessionImageType::kSourceIcon,
2597 expected_images);
2598 }
2599 }
2600
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,SinkIdChangeNotifiesObservers)2601 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2602 SinkIdChangeNotifiesObservers) {
2603 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2604
2605 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
2606
2607 UISetAudioSink(kExampleSinkId);
2608 EXPECT_EQ(player_observer->received_set_audio_sink_id_calls(), 1);
2609 EXPECT_EQ(player_observer->GetAudioOutputSinkId(0), kExampleSinkId);
2610 }
2611
2612 class MediaSessionFaviconBrowserTest : public ContentBrowserTest {
2613 protected:
2614 MediaSessionFaviconBrowserTest() = default;
2615
SetUpOnMainThread()2616 void SetUpOnMainThread() override {
2617 ContentBrowserTest::SetUpOnMainThread();
2618
2619 host_resolver()->AddRule("*", "127.0.0.1");
2620 }
2621 };
2622
2623 // Helper class that waits to receive a favicon from the renderer process.
2624 class FaviconWaiter : public WebContentsObserver {
2625 public:
FaviconWaiter(WebContents * web_contents)2626 explicit FaviconWaiter(WebContents* web_contents)
2627 : WebContentsObserver(web_contents) {}
2628
DidUpdateFaviconURL(RenderFrameHost * render_frame_host,const std::vector<blink::mojom::FaviconURLPtr> & candidates)2629 void DidUpdateFaviconURL(
2630 RenderFrameHost* render_frame_host,
2631 const std::vector<blink::mojom::FaviconURLPtr>& candidates) override {
2632 received_favicon_ = true;
2633 run_loop_.Quit();
2634 }
2635
Wait()2636 void Wait() {
2637 if (received_favicon_)
2638 return;
2639 run_loop_.Run();
2640 }
2641
2642 private:
2643 bool received_favicon_ = false;
2644 base::RunLoop run_loop_;
2645 };
2646
IN_PROC_BROWSER_TEST_F(MediaSessionFaviconBrowserTest,StartupInitalization)2647 IN_PROC_BROWSER_TEST_F(MediaSessionFaviconBrowserTest, StartupInitalization) {
2648 ASSERT_TRUE(embedded_test_server()->Start());
2649 EXPECT_TRUE(NavigateToURL(
2650 shell(), embedded_test_server()->GetURL("example.com", "/title1.html")));
2651
2652 std::unique_ptr<FaviconWaiter> favicon_waiter(
2653 new FaviconWaiter(shell()->web_contents()));
2654
2655 // Insert the favicon dynamically.
2656 ASSERT_TRUE(content::ExecuteScript(
2657 shell()->web_contents(),
2658 "let l = document.createElement('link'); "
2659 "l.rel='icon'; l.type='image/png'; l.href='single_face.jpg'; "
2660 "document.head.appendChild(l)"));
2661
2662 // Wait until it's received by the browser process.
2663 favicon_waiter->Wait();
2664
2665 // The MediaSession should be created with the favicon already available.
2666 MediaSession* media_session = MediaSessionImpl::Get(shell()->web_contents());
2667
2668 media_session::MediaImage icon;
2669 icon.src = embedded_test_server()->GetURL("example.com", "/single_face.jpg");
2670 icon.sizes.push_back({16, 16});
2671
2672 media_session::test::MockMediaSessionMojoObserver observer(*media_session);
2673 observer.WaitForExpectedImagesOfType(
2674 media_session::mojom::MediaSessionImageType::kSourceIcon, {icon});
2675 }
2676
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,PositionStateRouteWithTwoPlayers)2677 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2678 PositionStateRouteWithTwoPlayers) {
2679 media_session::MediaPosition expected_position(
2680 0.0, base::TimeDelta::FromSeconds(10), base::TimeDelta());
2681
2682 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2683 int player_id = player_observer->StartNewPlayer();
2684 SetPosition(player_observer.get(), player_id, expected_position);
2685
2686 {
2687 // With one normal player we should use the position that one provides.
2688 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2689 AddPlayer(player_observer.get(), player_id,
2690 media::MediaContentType::Persistent);
2691 observer.WaitForExpectedPosition(expected_position);
2692 }
2693
2694 int player_id_2 = player_observer->StartNewPlayer();
2695
2696 {
2697 // If we add another player then we should become empty again.
2698 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2699 AddPlayer(player_observer.get(), player_id_2,
2700 media::MediaContentType::Persistent);
2701 observer.WaitForEmptyPosition();
2702 }
2703
2704 {
2705 // If we remove the player then we should use the first player position.
2706 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2707 RemovePlayer(player_observer.get(), player_id_2);
2708 observer.WaitForExpectedPosition(expected_position);
2709 }
2710 }
2711
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,PositionStateWithOneShotPlayer)2712 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2713 PositionStateWithOneShotPlayer) {
2714 media_session::MediaPosition expected_position(
2715 0.0, base::TimeDelta::FromSeconds(10), base::TimeDelta());
2716
2717 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2718 int player_id = player_observer->StartNewPlayer();
2719 SetPosition(player_observer.get(), player_id, expected_position);
2720 AddPlayer(player_observer.get(), player_id, media::MediaContentType::OneShot);
2721
2722 // OneShot players should be ignored for position data.
2723 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2724 observer.WaitForEmptyPosition();
2725 }
2726
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,PositionStateWithPepperPlayer)2727 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2728 PositionStateWithPepperPlayer) {
2729 media_session::MediaPosition expected_position(
2730 0.0, base::TimeDelta::FromSeconds(10), base::TimeDelta());
2731
2732 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2733 int player_id = player_observer->StartNewPlayer();
2734 SetPosition(player_observer.get(), player_id, expected_position);
2735 AddPlayer(player_observer.get(), player_id, media::MediaContentType::Pepper);
2736
2737 // Pepper players should be ignored for position data.
2738 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2739 observer.WaitForEmptyPosition();
2740 }
2741
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,PositionStateRouteWithTwoPlayers_OneShot)2742 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2743 PositionStateRouteWithTwoPlayers_OneShot) {
2744 media_session::MediaPosition expected_position(
2745 0.0, base::TimeDelta::FromSeconds(10), base::TimeDelta());
2746
2747 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2748 int player_id = player_observer->StartNewPlayer();
2749 SetPosition(player_observer.get(), player_id, expected_position);
2750
2751 {
2752 // With one normal player we should use the position that one provides.
2753 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2754 AddPlayer(player_observer.get(), player_id,
2755 media::MediaContentType::Persistent);
2756 observer.WaitForExpectedPosition(expected_position);
2757 }
2758
2759 {
2760 // If we add an OneShot player then we should become empty again.
2761 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2762 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
2763 observer.WaitForEmptyPosition();
2764 }
2765 }
2766
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,PositionStateRouteWithTwoPlayers_Pepper)2767 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2768 PositionStateRouteWithTwoPlayers_Pepper) {
2769 media_session::MediaPosition expected_position(
2770 0.0, base::TimeDelta::FromSeconds(10), base::TimeDelta());
2771
2772 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2773 int player_id = player_observer->StartNewPlayer();
2774 SetPosition(player_observer.get(), player_id, expected_position);
2775
2776 {
2777 // With one normal player we should use the position that one provides.
2778 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2779 AddPlayer(player_observer.get(), player_id,
2780 media::MediaContentType::Persistent);
2781 observer.WaitForExpectedPosition(expected_position);
2782 }
2783
2784 {
2785 // If we add a Papper player then we should become empty again.
2786 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2787 StartNewPlayer(player_observer.get(), media::MediaContentType::Pepper);
2788 observer.WaitForEmptyPosition();
2789 }
2790 }
2791
2792 #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
2793 // TODO(https://crbug.com/1000400): Re-enable this test.
2794 #define MAYBE_PositionStateRouteWithOnePlayer \
2795 DISABLED_PositionStateRouteWithOnePlayer
2796 #else
2797 #define MAYBE_PositionStateRouteWithOnePlayer PositionStateRouteWithOnePlayer
2798 #endif
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,MAYBE_PositionStateRouteWithOnePlayer)2799 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2800 MAYBE_PositionStateRouteWithOnePlayer) {
2801 EXPECT_TRUE(NavigateToURL(
2802 shell(), embedded_test_server()->GetURL("example.com",
2803 "/media/session/position.html")));
2804
2805 auto* main_frame = shell()->web_contents()->GetMainFrame();
2806 const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(6060);
2807
2808 {
2809 // By default we should have an empty position.
2810 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2811 observer.WaitForEmptyPosition();
2812 }
2813
2814 {
2815 // With one normal player we should use the position that one provides.
2816 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2817
2818 ASSERT_TRUE(
2819 ExecuteScript(main_frame, "document.getElementById('video').play()"));
2820
2821 observer.WaitForExpectedPosition(
2822 media_session::MediaPosition(1.0, duration, base::TimeDelta()));
2823 }
2824
2825 {
2826 // If we seek the player then the position should be updated.
2827 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2828
2829 ASSERT_TRUE(ExecuteScript(
2830 main_frame, "document.getElementById('video').currentTime = 1"));
2831
2832 // We might only learn about the rate going back to 1.0 when the media time
2833 // has already progressed a bit.
2834 observer.WaitForExpectedPositionAtLeast(media_session::MediaPosition(
2835 1.0, duration, base::TimeDelta::FromSeconds(1)));
2836 }
2837
2838 base::TimeDelta paused_position;
2839 {
2840 // If we pause the player then the rate should be updated.
2841 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2842
2843 ASSERT_TRUE(
2844 ExecuteScript(main_frame, "document.getElementById('video').pause()"));
2845
2846 // Media time may have progressed since the time we seeked to 1s.
2847 paused_position =
2848 observer.WaitForExpectedPositionAtLeast(media_session::MediaPosition(
2849 0.0, duration, base::TimeDelta::FromSeconds(1)));
2850 }
2851
2852 base::TimeDelta resumed_position;
2853 {
2854 // If we resume the player then the rate should be updated.
2855 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2856
2857 ASSERT_TRUE(
2858 ExecuteScript(main_frame, "document.getElementById('video').play()"));
2859
2860 // We might only learn about the rate going back to 1.0 when the media time
2861 // has already progressed a bit.
2862 resumed_position = observer.WaitForExpectedPositionAtLeast(
2863 media_session::MediaPosition(1.0, duration, paused_position));
2864 }
2865
2866 {
2867 // If we change the playback rate then the MediaPosition should be updated.
2868 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2869
2870 ASSERT_TRUE(ExecuteScript(
2871 main_frame, "document.getElementById('video').playbackRate = 2"));
2872
2873 // Media time may have progressed since the time we resumed playback.
2874 observer.WaitForExpectedPositionAtLeast(
2875 media_session::MediaPosition(2.0, duration, resumed_position));
2876 }
2877
2878 {
2879 // If we remove the player then we should become empty again.
2880 media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
2881
2882 ASSERT_TRUE(
2883 ExecuteScript(main_frame, "document.getElementById('video').src = ''"));
2884
2885 observer.WaitForEmptyPosition();
2886 }
2887 }
2888
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,AudioDeviceSettingPersists)2889 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
2890 AudioDeviceSettingPersists) {
2891 // When an audio output device has been set: in addition to players switching
2892 // to that audio device, players created later on the same origin in the same
2893 // session should also use that device.
2894 EXPECT_TRUE(NavigateToURL(
2895 shell(), embedded_test_server()->GetURL("a.com", "/title1.html")));
2896
2897 auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2898 int player_1 = player_observer->StartNewPlayer();
2899 AddPlayer(player_observer.get(), player_1,
2900 media::MediaContentType::Persistent);
2901 UISetAudioSink("speaker1");
2902 EXPECT_EQ(player_observer->GetAudioOutputSinkId(player_1), "speaker1");
2903
2904 // When a second player has been added on the same page, it should use the
2905 // audio device previously set.
2906 int player_2 = player_observer->StartNewPlayer();
2907 AddPlayer(player_observer.get(), player_2,
2908 media::MediaContentType::Persistent);
2909 EXPECT_EQ(player_observer->GetAudioOutputSinkId(player_2), "speaker1");
2910
2911 // Clear the players and navigate to a new page on the same origin.
2912 RemovePlayers(player_observer.get());
2913 EXPECT_TRUE(NavigateToURL(
2914 shell(), embedded_test_server()->GetURL("a.com", "/title2.html")));
2915 player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2916
2917 // After navigating to another page on the same origin, newly created players
2918 // should use the previously set device.
2919 player_1 = player_observer->StartNewPlayer();
2920 AddPlayer(player_observer.get(), player_1,
2921 media::MediaContentType::Persistent);
2922 EXPECT_EQ(player_observer->GetAudioOutputSinkId(player_1), "speaker1");
2923
2924 // Clear the players and navigate to a new page on a different origin
2925 RemovePlayers(player_observer.get());
2926 EXPECT_TRUE(NavigateToURL(
2927 shell(), embedded_test_server()->GetURL("b.com", "/title1.html")));
2928 player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
2929
2930 // After navigating to another page on a different origin, newly created
2931 // players should not use the previously set device.
2932 player_1 = player_observer->StartNewPlayer();
2933 AddPlayer(player_observer.get(), player_1,
2934 media::MediaContentType::Persistent);
2935 EXPECT_NE(player_observer->GetAudioOutputSinkId(player_1), "speaker1");
2936 }
2937 } // namespace content
2938