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