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

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

Issue 2583463002: [MediaSession] Add playbackState attribute to Blink MediaSession and use it to determine playback s… (Closed)
Patch Set: rebased Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/media/session/media_session_impl.h" 5 #include "content/browser/media/session/media_session_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <list> 9 #include <list>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/metrics/histogram_samples.h" 14 #include "base/metrics/histogram_samples.h"
15 #include "base/test/histogram_tester.h" 15 #include "base/test/histogram_tester.h"
16 #include "base/test/simple_test_tick_clock.h" 16 #include "base/test/simple_test_tick_clock.h"
17 #include "content/browser/media/session/audio_focus_delegate.h" 17 #include "content/browser/media/session/audio_focus_delegate.h"
18 #include "content/browser/media/session/media_session_service_impl.h"
18 #include "content/browser/media/session/mock_media_session_player_observer.h" 19 #include "content/browser/media/session/mock_media_session_player_observer.h"
19 #include "content/public/browser/media_session.h" 20 #include "content/public/browser/media_session.h"
20 #include "content/public/browser/media_session_observer.h" 21 #include "content/public/browser/media_session_observer.h"
21 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
22 #include "content/public/test/content_browser_test.h" 23 #include "content/public/test/content_browser_test.h"
23 #include "content/shell/browser/shell.h" 24 #include "content/shell/browser/shell.h"
24 #include "media/base/media_content_type.h" 25 #include "media/base/media_content_type.h"
25 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
26 27
27 using content::WebContents; 28 using content::WebContents;
(...skipping 27 matching lines...) Expand all
55 class MockMediaSessionObserver : public MediaSessionObserver { 56 class MockMediaSessionObserver : public MediaSessionObserver {
56 public: 57 public:
57 MockMediaSessionObserver(MediaSession* media_session) 58 MockMediaSessionObserver(MediaSession* media_session)
58 : MediaSessionObserver(media_session) {} 59 : MediaSessionObserver(media_session) {}
59 60
60 MOCK_METHOD2(MediaSessionStateChanged, 61 MOCK_METHOD2(MediaSessionStateChanged,
61 void(bool is_controllable, bool is_suspended)); 62 void(bool is_controllable, bool is_suspended));
62 MOCK_METHOD0(MediaSessionDestroyed, void()); 63 MOCK_METHOD0(MediaSessionDestroyed, void());
63 }; 64 };
64 65
66 class MockMediaSessionServiceImpl : public content::MediaSessionServiceImpl {
67 public:
68 explicit MockMediaSessionServiceImpl(content::RenderFrameHost* rfh)
69 : MediaSessionServiceImpl(rfh) {}
70 ~MockMediaSessionServiceImpl() override = default;
71 };
72
65 } // namespace 73 } // namespace
66 74
67 class MediaSessionImplBrowserTest : public content::ContentBrowserTest { 75 class MediaSessionImplBrowserTest : public content::ContentBrowserTest {
68 protected: 76 protected:
69 MediaSessionImplBrowserTest() = default; 77 MediaSessionImplBrowserTest() = default;
70 78
71 void SetUpOnMainThread() override { 79 void SetUpOnMainThread() override {
72 ContentBrowserTest::SetUpOnMainThread(); 80 ContentBrowserTest::SetUpOnMainThread();
73 81
74 media_session_ = MediaSessionImpl::Get(shell()->web_contents()); 82 media_session_ = MediaSessionImpl::Get(shell()->web_contents());
75 mock_media_session_observer_.reset( 83 mock_media_session_observer_.reset(
76 new MockMediaSessionObserver(media_session_)); 84 new MockMediaSessionObserver(media_session_));
77 mock_audio_focus_delegate_ = new MockAudioFocusDelegate; 85 mock_audio_focus_delegate_ = new MockAudioFocusDelegate;
78 media_session_->SetDelegateForTests( 86 media_session_->SetDelegateForTests(
79 base::WrapUnique(mock_audio_focus_delegate_)); 87 base::WrapUnique(mock_audio_focus_delegate_));
80 ASSERT_TRUE(media_session_); 88 ASSERT_TRUE(media_session_);
81 } 89 }
82 90
83 void TearDownOnMainThread() override { 91 void TearDownOnMainThread() override {
84 mock_media_session_observer_.reset(); 92 mock_media_session_observer_.reset();
93 media_session_->RemoveAllPlayersForTest();
94 mock_media_session_service_.reset();
85 95
86 media_session_->RemoveAllPlayersForTest();
87 media_session_ = nullptr; 96 media_session_ = nullptr;
88 97
89 ContentBrowserTest::TearDownOnMainThread(); 98 ContentBrowserTest::TearDownOnMainThread();
90 } 99 }
91 100
92 void StartNewPlayer(MockMediaSessionPlayerObserver* player_observer, 101 void StartNewPlayer(MockMediaSessionPlayerObserver* player_observer,
93 media::MediaContentType media_content_type) { 102 media::MediaContentType media_content_type) {
94 bool result = AddPlayer(player_observer, player_observer->StartNewPlayer(), 103 bool result = AddPlayer(player_observer, player_observer->StartNewPlayer(),
95 media_content_type); 104 media_content_type);
96 EXPECT_TRUE(result); 105 EXPECT_TRUE(result);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 media_session_->OnSuspendInternal(MediaSession::SuspendType::SYSTEM, 147 media_session_->OnSuspendInternal(MediaSession::SuspendType::SYSTEM,
139 temporary 148 temporary
140 ? MediaSessionImpl::State::SUSPENDED 149 ? MediaSessionImpl::State::SUSPENDED
141 : MediaSessionImpl::State::INACTIVE); 150 : MediaSessionImpl::State::INACTIVE);
142 } 151 }
143 152
144 void SystemStartDucking() { media_session_->StartDucking(); } 153 void SystemStartDucking() { media_session_->StartDucking(); }
145 154
146 void SystemStopDucking() { media_session_->StopDucking(); } 155 void SystemStopDucking() { media_session_->StopDucking(); }
147 156
157 void EnsureMediaSessionService() {
158 mock_media_session_service_.reset(new MockMediaSessionServiceImpl(
159 shell()->web_contents()->GetMainFrame()));
160 mock_media_session_service_->SetMetadata(content::MediaMetadata());
161 }
162
163 void SetPlaybackState(blink::mojom::MediaSessionPlaybackState state) {
164 mock_media_session_service_->SetPlaybackState(state);
165 }
166
148 MockMediaSessionObserver* mock_media_session_observer() { 167 MockMediaSessionObserver* mock_media_session_observer() {
149 return mock_media_session_observer_.get(); 168 return mock_media_session_observer_.get();
150 } 169 }
151 170
152 MockAudioFocusDelegate* mock_audio_focus_delegate() { 171 MockAudioFocusDelegate* mock_audio_focus_delegate() {
153 return mock_audio_focus_delegate_; 172 return mock_audio_focus_delegate_;
154 } 173 }
155 174
156 std::unique_ptr<MediaSessionImpl> CreateDummyMediaSession() { 175 std::unique_ptr<MediaSessionImpl> CreateDummyMediaSession() {
157 return base::WrapUnique<MediaSessionImpl>(new MediaSessionImpl(nullptr)); 176 return base::WrapUnique<MediaSessionImpl>(new MediaSessionImpl(nullptr));
158 } 177 }
159 178
160 MediaSessionUmaHelper* GetMediaSessionUMAHelper() { 179 MediaSessionUmaHelper* GetMediaSessionUMAHelper() {
161 return media_session_->uma_helper_for_test(); 180 return media_session_->uma_helper_for_test();
162 } 181 }
163 182
164 protected: 183 protected:
165 MediaSessionImpl* media_session_; 184 MediaSessionImpl* media_session_;
166 std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_; 185 std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_;
167 MockAudioFocusDelegate* mock_audio_focus_delegate_; 186 MockAudioFocusDelegate* mock_audio_focus_delegate_;
187 std::unique_ptr<MockMediaSessionServiceImpl> mock_media_session_service_;
168 188
169 DISALLOW_COPY_AND_ASSIGN(MediaSessionImplBrowserTest); 189 DISALLOW_COPY_AND_ASSIGN(MediaSessionImplBrowserTest);
170 }; 190 };
171 191
172 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, 192 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
173 PlayersFromSameObserverDoNotStopEachOtherInSameSession) { 193 PlayersFromSameObserverDoNotStopEachOtherInSameSession) {
174 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(); 194 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
175 195
176 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent); 196 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
177 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent); 197 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(); 1040 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
1021 1041
1022 EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus()) 1042 EXPECT_CALL(*mock_audio_focus_delegate(), AbandonAudioFocus())
1023 .Times(1); // Called in TearDown 1043 .Times(1); // Called in TearDown
1024 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot); 1044 StartNewPlayer(player_observer.get(), media::MediaContentType::OneShot);
1025 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent); 1045 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1026 RemovePlayer(player_observer.get(), 0); 1046 RemovePlayer(player_observer.get(), 0);
1027 } 1047 }
1028 1048
1029 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, 1049 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
1050 ActualPlaybackStateWhilePlayerPaused) {
1051 EnsureMediaSessionService();
1052 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
1053 shell()->web_contents()->GetMainFrame());
1054
1055 ::testing::Sequence s;
1056 EXPECT_CALL(*mock_media_session_observer(),
1057 MediaSessionStateChanged(true, false))
1058 .InSequence(s);
1059 EXPECT_CALL(*mock_media_session_observer(),
1060 MediaSessionStateChanged(true, true))
1061 .InSequence(s);
1062 EXPECT_CALL(*mock_media_session_observer(),
1063 MediaSessionStateChanged(true, false))
1064 .InSequence(s);
1065 EXPECT_CALL(*mock_media_session_observer(),
1066 MediaSessionStateChanged(true, true))
1067 .InSequence(s);
1068 EXPECT_CALL(*mock_media_session_observer(),
1069 MediaSessionStateChanged(true, true))
1070 .InSequence(s);
1071
1072 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1073 OnPlayerPaused(player_observer.get(), 0);
1074 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1075 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1076 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1077
1078 // Verify before test exists. Otherwise the sequence will expire and cause
1079 // weird problems.
1080 ::testing::Mock::VerifyAndClear(mock_media_session_observer());
1081 }
1082
1083 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
1084 ActualPlaybackStateWhilePlayerPlaying) {
1085 EnsureMediaSessionService();
1086 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
1087 shell()->web_contents()->GetMainFrame());
1088 ::testing::Sequence s;
1089 EXPECT_CALL(*mock_media_session_observer(),
1090 MediaSessionStateChanged(true, false))
1091 .InSequence(s);
1092 EXPECT_CALL(*mock_media_session_observer(),
1093 MediaSessionStateChanged(true, false))
1094 .InSequence(s);
1095 EXPECT_CALL(*mock_media_session_observer(),
1096 MediaSessionStateChanged(true, false))
1097 .InSequence(s);
1098 EXPECT_CALL(*mock_media_session_observer(),
1099 MediaSessionStateChanged(true, false))
1100 .InSequence(s);
1101
1102 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1103 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1104 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1105 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1106
1107 // Verify before test exists. Otherwise the sequence will expire and cause
1108 // weird problems.
1109 ::testing::Mock::VerifyAndClear(mock_media_session_observer());
1110 }
1111
1112 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
1113 ActualPlaybackStateWhilePlayerRemoved) {
1114 EnsureMediaSessionService();
1115 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(
1116 shell()->web_contents()->GetMainFrame());
1117
1118 ::testing::Sequence s;
1119 EXPECT_CALL(*mock_media_session_observer(),
1120 MediaSessionStateChanged(true, false))
1121 .InSequence(s);
1122 EXPECT_CALL(*mock_media_session_observer(),
1123 MediaSessionStateChanged(false, _))
1124 .InSequence(s);
1125
1126 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1127 RemovePlayer(player_observer.get(), 0);
1128
1129 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PLAYING);
1130 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::PAUSED);
1131 SetPlaybackState(blink::mojom::MediaSessionPlaybackState::NONE);
1132
1133 // Verify before test exists. Otherwise the sequence will expire and cause
1134 // weird problems.
1135 ::testing::Mock::VerifyAndClear(mock_media_session_observer());
1136 }
1137
1138 IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
1030 UMA_Suspended_SystemTransient) { 1139 UMA_Suspended_SystemTransient) {
1031 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>(); 1140 auto player_observer = base::MakeUnique<MockMediaSessionPlayerObserver>();
1032 base::HistogramTester tester; 1141 base::HistogramTester tester;
1033 1142
1034 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent); 1143 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1035 SystemSuspend(true); 1144 SystemSuspend(true);
1036 1145
1037 std::unique_ptr<base::HistogramSamples> samples( 1146 std::unique_ptr<base::HistogramSamples> samples(
1038 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended")); 1147 tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
1039 EXPECT_EQ(1, samples->TotalCount()); 1148 EXPECT_EQ(1, samples->TotalCount());
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent); 1416 StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
1308 clock->Advance(base::TimeDelta::FromMilliseconds(1000)); 1417 clock->Advance(base::TimeDelta::FromMilliseconds(1000));
1309 media_session_->Stop(MediaSession::SuspendType::UI); 1418 media_session_->Stop(MediaSession::SuspendType::UI);
1310 1419
1311 std::unique_ptr<base::HistogramSamples> samples( 1420 std::unique_ptr<base::HistogramSamples> samples(
1312 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime")); 1421 tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
1313 EXPECT_EQ(2, samples->TotalCount()); 1422 EXPECT_EQ(2, samples->TotalCount());
1314 EXPECT_EQ(1, samples->GetCount(1000)); 1423 EXPECT_EQ(1, samples->GetCount(1000));
1315 EXPECT_EQ(1, samples->GetCount(10000)); 1424 EXPECT_EQ(1, samples->GetCount(10000));
1316 } 1425 }
OLDNEW
« no previous file with comments | « content/browser/media/session/media_session_impl.cc ('k') | content/browser/media/session/media_session_service_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698