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

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

Issue 2381963004: Reland "Letting Flash join MediaSession (stack implementaion)" (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/media/session/audio_focus_manager.h" 5 #include "content/browser/media/session/audio_focus_manager.h"
6 6
7 #include "base/command_line.h"
7 #include "content/browser/media/session/media_session.h" 8 #include "content/browser/media/session/media_session.h"
9 #include "content/browser/media/session/media_session_observer.h"
8 #include "content/public/test/mock_render_process_host.h" 10 #include "content/public/test/mock_render_process_host.h"
9 #include "content/public/test/test_browser_context.h" 11 #include "content/public/test/test_browser_context.h"
10 #include "content/public/test/test_browser_thread.h" 12 #include "content/public/test/test_browser_thread.h"
11 #include "content/test/test_web_contents.h" 13 #include "content/test/test_web_contents.h"
14 #include "media/base/media_content_type.h"
15 #include "media/base/media_switches.h"
12 16
13 namespace content { 17 namespace content {
14 18
19 namespace {
20
21 class MockMediaSessionObserver : public MediaSessionObserver {
22 public:
23 void OnSuspend(int player_id) override {}
24 void OnResume(int player_id) override {}
25 void OnSetVolumeMultiplier(
26 int player_id, double volume_multiplier) override {}
27 };
28
29 } // anonymous namespace
30
15 using AudioFocusType = AudioFocusManager::AudioFocusType; 31 using AudioFocusType = AudioFocusManager::AudioFocusType;
16 using SuspendType = MediaSession::SuspendType; 32 using SuspendType = MediaSession::SuspendType;
17 33
18 class AudioFocusManagerTest : public testing::Test { 34 class AudioFocusManagerTest : public testing::Test {
19 public: 35 public:
20 AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {} 36 AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {}
21 37
22 void SetUp() override { 38 void SetUp() override {
39 base::CommandLine::ForCurrentProcess()->AppendSwitch(
40 switches::kEnableDefaultMediaSession);
23 rph_factory_.reset(new MockRenderProcessHostFactory()); 41 rph_factory_.reset(new MockRenderProcessHostFactory());
24 SiteInstanceImpl::set_render_process_host_factory(rph_factory_.get()); 42 SiteInstanceImpl::set_render_process_host_factory(rph_factory_.get());
25 browser_context_.reset(new TestBrowserContext()); 43 browser_context_.reset(new TestBrowserContext());
44 pepper_observer_.reset(new MockMediaSessionObserver());
26 } 45 }
27 46
28 void TearDown() override { 47 void TearDown() override {
29 browser_context_.reset(); 48 browser_context_.reset();
30 SiteInstanceImpl::set_render_process_host_factory(nullptr); 49 SiteInstanceImpl::set_render_process_host_factory(nullptr);
31 rph_factory_.reset(); 50 rph_factory_.reset();
32 } 51 }
33 52
34 WebContents* GetAudioFocusedContent() const { 53 MediaSession* GetAudioFocusedSession() const {
35 if (!AudioFocusManager::GetInstance()->focus_entry_) 54 const auto& audio_focus_stack =
36 return nullptr; 55 AudioFocusManager::GetInstance()->audio_focus_stack_;
37 return AudioFocusManager::GetInstance()->focus_entry_->web_contents(); 56 for (auto iter = audio_focus_stack.rbegin();
57 iter != audio_focus_stack.rend(); ++iter) {
58 if ((*iter)->audio_focus_type() ==
59 AudioFocusManager::AudioFocusType::Gain)
60 return (*iter);
61 }
62 return nullptr;
38 } 63 }
39 64
40 int GetTransientMaybeDuckCount() const { 65 int GetTransientMaybeDuckCount() const {
41 return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount(); 66 int count = 0;
67 const auto& audio_focus_stack =
68 AudioFocusManager::GetInstance()->audio_focus_stack_;
69 for (auto iter = audio_focus_stack.rbegin();
70 iter != audio_focus_stack.rend(); ++iter) {
71 if ((*iter)->audio_focus_type() ==
72 AudioFocusManager::AudioFocusType::GainTransientMayDuck) {
73 ++count;
74 } else {
75 break;
76 }
77 }
78
79 return count;
42 } 80 }
43 81
44 double IsSessionDucking(MediaSession* session) { 82 double IsSessionDucking(MediaSession* session) {
45 return session->is_ducking_; // Quack! Quack! 83 return session->is_ducking_; // Quack! Quack!
46 } 84 }
47 85
86 void RequestAudioFocus(MediaSession* session,
87 AudioFocusManager::AudioFocusType audio_focus_type) {
88 session->RequestSystemAudioFocus(audio_focus_type);
89 }
90
91 void AbandonAudioFocus(MediaSession* session) {
92 session->AbandonSystemAudioFocusIfNeeded();
93 }
94
48 WebContents* CreateWebContents() { 95 WebContents* CreateWebContents() {
49 return TestWebContents::Create(browser_context_.get(), 96 return TestWebContents::Create(browser_context_.get(),
50 SiteInstance::SiteInstance::Create(browser_context_.get())); 97 SiteInstance::SiteInstance::Create(browser_context_.get()));
51 } 98 }
52 99
100 std::unique_ptr<MediaSessionObserver> pepper_observer_;
101
53 private: 102 private:
54 base::MessageLoopForUI message_loop_; 103 base::MessageLoopForUI message_loop_;
55 TestBrowserThread ui_thread_; 104 TestBrowserThread ui_thread_;
56 105
57 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_; 106 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_;
58 std::unique_ptr<TestBrowserContext> browser_context_; 107 std::unique_ptr<TestBrowserContext> browser_context_;
59 }; 108 };
60 109
61 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) { 110 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) {
62 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance(); 111 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance();
63 ASSERT_TRUE(!!audio_focus_manager); 112 ASSERT_TRUE(!!audio_focus_manager);
64 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance()); 113 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance());
65 } 114 }
66 115
67 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) { 116 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) {
68 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 117 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
69 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 118 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
70 119
71 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 120 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
72 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 121 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
73 122
74 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); 123 std::unique_ptr<WebContents> web_contents_3(CreateWebContents());
75 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); 124 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
76 125
77 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 126 ASSERT_EQ(nullptr, GetAudioFocusedSession());
78 127
79 AudioFocusManager::GetInstance()->RequestAudioFocus( 128 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
80 media_session_1, AudioFocusManager::AudioFocusType::Gain); 129 ASSERT_EQ(media_session_1, GetAudioFocusedSession());
81 ASSERT_EQ(web_contents_1.get(), GetAudioFocusedContent());
82 130
83 AudioFocusManager::GetInstance()->RequestAudioFocus( 131 RequestAudioFocus(media_session_2, AudioFocusManager::AudioFocusType::Gain);
84 media_session_2, AudioFocusManager::AudioFocusType::Gain); 132 ASSERT_EQ(media_session_2, GetAudioFocusedSession());
85 ASSERT_EQ(web_contents_2.get(), GetAudioFocusedContent());
86 133
87 AudioFocusManager::GetInstance()->RequestAudioFocus( 134 RequestAudioFocus(media_session_3, AudioFocusManager::AudioFocusType::Gain);
88 media_session_3, AudioFocusManager::AudioFocusType::Gain); 135 ASSERT_EQ(media_session_3, GetAudioFocusedSession());
89 ASSERT_EQ(web_contents_3.get(), GetAudioFocusedContent());
90 } 136 }
91 137
92 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) { 138 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) {
93 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 139 std::unique_ptr<WebContents> web_contents(CreateWebContents());
94 MediaSession* media_session = MediaSession::Get(web_contents.get()); 140 MediaSession* media_session = MediaSession::Get(web_contents.get());
95 141
96 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 142 ASSERT_EQ(nullptr, GetAudioFocusedSession());
97 143
98 AudioFocusManager::GetInstance()->RequestAudioFocus( 144 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
99 media_session, AudioFocusManager::AudioFocusType::Gain); 145 ASSERT_EQ(media_session, GetAudioFocusedSession());
100 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
101 146
102 AudioFocusManager::GetInstance()->RequestAudioFocus( 147 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
103 media_session, AudioFocusManager::AudioFocusType::Gain); 148 ASSERT_EQ(media_session, GetAudioFocusedSession());
104 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
105 } 149 }
106 150
107 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) { 151 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) {
108 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 152 std::unique_ptr<WebContents> web_contents(CreateWebContents());
109 MediaSession* media_session = MediaSession::Get(web_contents.get()); 153 MediaSession* media_session = MediaSession::Get(web_contents.get());
110 154
111 AudioFocusManager::GetInstance()->RequestAudioFocus( 155 RequestAudioFocus(
112 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 156 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
113 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 157 ASSERT_EQ(nullptr, GetAudioFocusedSession());
114 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 158 ASSERT_EQ(1, GetTransientMaybeDuckCount());
115 159
116 AudioFocusManager::GetInstance()->RequestAudioFocus( 160 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
117 media_session, AudioFocusManager::AudioFocusType::Gain); 161 ASSERT_EQ(media_session, GetAudioFocusedSession());
118 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
119 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 162 ASSERT_EQ(0, GetTransientMaybeDuckCount());
120 } 163 }
121 164
122 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) { 165 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) {
123 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 166 std::unique_ptr<WebContents> web_contents(CreateWebContents());
124 MediaSession* media_session = MediaSession::Get(web_contents.get()); 167 MediaSession* media_session = MediaSession::Get(web_contents.get());
125 168
126 AudioFocusManager::GetInstance()->RequestAudioFocus( 169 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
127 media_session, AudioFocusManager::AudioFocusType::Gain); 170 ASSERT_EQ(media_session, GetAudioFocusedSession());
128 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
129 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 171 ASSERT_EQ(0, GetTransientMaybeDuckCount());
130 172
131 AudioFocusManager::GetInstance()->RequestAudioFocus( 173 RequestAudioFocus(
132 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 174 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
133 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 175 ASSERT_EQ(nullptr, GetAudioFocusedSession());
134 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 176 ASSERT_EQ(1, GetTransientMaybeDuckCount());
135 ASSERT_FALSE(IsSessionDucking(media_session)); 177 ASSERT_FALSE(IsSessionDucking(media_session));
136 } 178 }
137 179
138 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) { 180 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) {
139 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 181 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
140 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 182 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
141 183
142 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 184 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
143 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 185 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
144 186
145 AudioFocusManager::GetInstance()->RequestAudioFocus( 187 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
146 media_session_1, AudioFocusManager::AudioFocusType::Gain);
147 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 188 ASSERT_EQ(0, GetTransientMaybeDuckCount());
148 ASSERT_FALSE(IsSessionDucking(media_session_1)); 189 ASSERT_FALSE(IsSessionDucking(media_session_1));
149 190
150 AudioFocusManager::GetInstance()->RequestAudioFocus( 191 RequestAudioFocus(
151 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 192 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
152 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 193 ASSERT_EQ(1, GetTransientMaybeDuckCount());
153 ASSERT_TRUE(IsSessionDucking(media_session_1)); 194 ASSERT_TRUE(IsSessionDucking(media_session_1));
154 195
155 AudioFocusManager::GetInstance()->RequestAudioFocus( 196 RequestAudioFocus(
156 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 197 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
157 ASSERT_EQ(2, GetTransientMaybeDuckCount()); 198 ASSERT_EQ(2, GetTransientMaybeDuckCount());
158 ASSERT_FALSE(IsSessionDucking(media_session_1)); 199 ASSERT_FALSE(IsSessionDucking(media_session_1));
159 } 200 }
160 201
161 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) { 202 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) {
162 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 203 std::unique_ptr<WebContents> web_contents(CreateWebContents());
163 MediaSession* media_session = MediaSession::Get(web_contents.get()); 204 MediaSession* media_session = MediaSession::Get(web_contents.get());
164 205
165 AudioFocusManager::GetInstance()->RequestAudioFocus( 206 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
166 media_session, AudioFocusManager::AudioFocusType::Gain); 207 ASSERT_EQ(media_session, GetAudioFocusedSession());
167 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
168 208
169 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); 209 AbandonAudioFocus(media_session);
170 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 210 ASSERT_EQ(nullptr, GetAudioFocusedSession());
171 } 211 }
172 212
173 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) { 213 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) {
174 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 214 std::unique_ptr<WebContents> web_contents(CreateWebContents());
175 MediaSession* media_session = MediaSession::Get(web_contents.get()); 215 MediaSession* media_session = MediaSession::Get(web_contents.get());
176 216
177 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); 217 AbandonAudioFocus(media_session);
178 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 218 ASSERT_EQ(nullptr, GetAudioFocusedSession());
179 } 219 }
180 220
181 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) { 221 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) {
182 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 222 std::unique_ptr<WebContents> web_contents(CreateWebContents());
183 MediaSession* media_session = MediaSession::Get(web_contents.get()); 223 MediaSession* media_session = MediaSession::Get(web_contents.get());
184 224
185 AudioFocusManager::GetInstance()->RequestAudioFocus( 225 RequestAudioFocus(
186 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 226 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
187 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 227 ASSERT_EQ(1, GetTransientMaybeDuckCount());
188 228
189 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); 229 AbandonAudioFocus(media_session);
190 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 230 ASSERT_EQ(0, GetTransientMaybeDuckCount());
191 } 231 }
192 232
193 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) { 233 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) {
194 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 234 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
195 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 235 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
196 236
197 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 237 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
198 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 238 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
199 239
200 AudioFocusManager::GetInstance()->RequestAudioFocus( 240 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
201 media_session_1, AudioFocusManager::AudioFocusType::Gain);
202 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 241 ASSERT_EQ(0, GetTransientMaybeDuckCount());
203 ASSERT_FALSE(IsSessionDucking(media_session_1)); 242 ASSERT_FALSE(IsSessionDucking(media_session_1));
204 243
205 AudioFocusManager::GetInstance()->RequestAudioFocus( 244 RequestAudioFocus(
206 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 245 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
207 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 246 ASSERT_EQ(1, GetTransientMaybeDuckCount());
208 ASSERT_TRUE(IsSessionDucking(media_session_1)); 247 ASSERT_TRUE(IsSessionDucking(media_session_1));
209 248
210 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_1); 249 AbandonAudioFocus(media_session_1);
211 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 250 ASSERT_EQ(1, GetTransientMaybeDuckCount());
212 251
213 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); 252 AbandonAudioFocus(media_session_2);
214 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 253 ASSERT_EQ(0, GetTransientMaybeDuckCount());
215 254
216 AudioFocusManager::GetInstance()->RequestAudioFocus( 255 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
217 media_session_1, AudioFocusManager::AudioFocusType::Gain);
218 ASSERT_FALSE(IsSessionDucking(media_session_1)); 256 ASSERT_FALSE(IsSessionDucking(media_session_1));
219 } 257 }
220 258
221 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) { 259 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) {
222 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 260 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
223 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 261 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
224 262
225 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 263 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
226 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 264 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
227 265
228 AudioFocusManager::GetInstance()->RequestAudioFocus( 266 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
229 media_session_1, AudioFocusManager::AudioFocusType::Gain);
230 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 267 ASSERT_EQ(0, GetTransientMaybeDuckCount());
231 ASSERT_FALSE(IsSessionDucking(media_session_1)); 268 ASSERT_FALSE(IsSessionDucking(media_session_1));
232 269
233 AudioFocusManager::GetInstance()->RequestAudioFocus( 270 RequestAudioFocus(
234 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 271 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
235 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 272 ASSERT_EQ(1, GetTransientMaybeDuckCount());
236 ASSERT_TRUE(IsSessionDucking(media_session_1)); 273 ASSERT_TRUE(IsSessionDucking(media_session_1));
237 274
238 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); 275 AbandonAudioFocus(media_session_2);
239 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 276 ASSERT_EQ(0, GetTransientMaybeDuckCount());
240 ASSERT_FALSE(IsSessionDucking(media_session_1)); 277 ASSERT_FALSE(IsSessionDucking(media_session_1));
241 } 278 }
242 279
243 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) { 280 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) {
244 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 281 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
245 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 282 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
246 283
247 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 284 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
248 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 285 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
249 286
250 AudioFocusManager::GetInstance()->RequestAudioFocus( 287 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
251 media_session_1, AudioFocusManager::AudioFocusType::Gain);
252 ASSERT_FALSE(IsSessionDucking(media_session_1)); 288 ASSERT_FALSE(IsSessionDucking(media_session_1));
253 289
254 AudioFocusManager::GetInstance()->RequestAudioFocus( 290 RequestAudioFocus(
255 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 291 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
256 ASSERT_TRUE(IsSessionDucking(media_session_1)); 292 ASSERT_TRUE(IsSessionDucking(media_session_1));
257 } 293 }
258 294
259 TEST_F(AudioFocusManagerTest, DuckWhenStarting) { 295 TEST_F(AudioFocusManagerTest, GainSuspendsTransient) {
260 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 296 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
261 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 297 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
262 298
263 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 299 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
264 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 300 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
265 301
266 AudioFocusManager::GetInstance()->RequestAudioFocus( 302 RequestAudioFocus(
267 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 303 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
268 304
269 AudioFocusManager::GetInstance()->RequestAudioFocus( 305 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
270 media_session_1, AudioFocusManager::AudioFocusType::Gain); 306 ASSERT_TRUE(media_session_2->IsSuspended());
271 ASSERT_TRUE(IsSessionDucking(media_session_1));
272 } 307 }
273 308
274 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { 309 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) {
275 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 310 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
276 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 311 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
277 312
278 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 313 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
279 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 314 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
280 315
281 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); 316 std::unique_ptr<WebContents> web_contents_3(CreateWebContents());
282 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); 317 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
283 318
284 AudioFocusManager::GetInstance()->RequestAudioFocus( 319 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
285 media_session_1, AudioFocusManager::AudioFocusType::Gain);
286 ASSERT_FALSE(IsSessionDucking(media_session_1)); 320 ASSERT_FALSE(IsSessionDucking(media_session_1));
287 321
288 AudioFocusManager::GetInstance()->RequestAudioFocus( 322 RequestAudioFocus(
289 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 323 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
290 ASSERT_TRUE(IsSessionDucking(media_session_1)); 324 ASSERT_TRUE(IsSessionDucking(media_session_1));
291 325
292 AudioFocusManager::GetInstance()->RequestAudioFocus( 326 RequestAudioFocus(
293 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 327 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
294 ASSERT_TRUE(IsSessionDucking(media_session_1)); 328 ASSERT_TRUE(IsSessionDucking(media_session_1));
295 329
296 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); 330 AbandonAudioFocus(media_session_2);
297 ASSERT_TRUE(IsSessionDucking(media_session_1)); 331 ASSERT_TRUE(IsSessionDucking(media_session_1));
298 332
299 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_3); 333 AbandonAudioFocus(media_session_3);
300 ASSERT_FALSE(IsSessionDucking(media_session_1)); 334 ASSERT_FALSE(IsSessionDucking(media_session_1));
301 } 335 }
302 336
303 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) { 337 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) {
304 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 338 std::unique_ptr<WebContents> web_contents(CreateWebContents());
305 MediaSession* media_session = MediaSession::Get(web_contents.get()); 339 MediaSession* media_session = MediaSession::Get(web_contents.get());
306 340
307 AudioFocusManager::GetInstance()->RequestAudioFocus( 341 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain);
308 media_session, AudioFocusManager::AudioFocusType::Gain); 342 ASSERT_EQ(media_session, GetAudioFocusedSession());
309 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
310 343
311 web_contents.reset(); 344 web_contents.reset();
312 ASSERT_EQ(nullptr, GetAudioFocusedContent()); 345 ASSERT_EQ(nullptr, GetAudioFocusedSession());
313 } 346 }
314 347
315 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) { 348 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) {
316 std::unique_ptr<WebContents> web_contents(CreateWebContents()); 349 std::unique_ptr<WebContents> web_contents(CreateWebContents());
317 MediaSession* media_session = MediaSession::Get(web_contents.get()); 350 MediaSession* media_session = MediaSession::Get(web_contents.get());
318 351
319 AudioFocusManager::GetInstance()->RequestAudioFocus( 352 RequestAudioFocus(
320 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 353 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
321 ASSERT_EQ(1, GetTransientMaybeDuckCount()); 354 ASSERT_EQ(1, GetTransientMaybeDuckCount());
322 355
323 web_contents.reset(); 356 web_contents.reset();
324 ASSERT_EQ(0, GetTransientMaybeDuckCount()); 357 ASSERT_EQ(0, GetTransientMaybeDuckCount());
325 } 358 }
326 359
327 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) { 360 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) {
328 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); 361 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
329 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); 362 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
330 363
331 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); 364 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
332 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); 365 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
333 366
334 AudioFocusManager::GetInstance()->RequestAudioFocus( 367 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain);
335 media_session_1, AudioFocusManager::AudioFocusType::Gain);
336 ASSERT_FALSE(IsSessionDucking(media_session_1)); 368 ASSERT_FALSE(IsSessionDucking(media_session_1));
337 369
338 AudioFocusManager::GetInstance()->RequestAudioFocus( 370 RequestAudioFocus(
339 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); 371 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
340 ASSERT_TRUE(IsSessionDucking(media_session_1)); 372 ASSERT_TRUE(IsSessionDucking(media_session_1));
341 373
342 web_contents_2.reset(); 374 web_contents_2.reset();
343 ASSERT_FALSE(IsSessionDucking(media_session_1)); 375 ASSERT_FALSE(IsSessionDucking(media_session_1));
344 } 376 }
345 377
378 TEST_F(AudioFocusManagerTest, PepperRequestsGainFocus) {
379 std::unique_ptr<WebContents> web_contents(CreateWebContents());
380 MediaSession* media_session = MediaSession::Get(web_contents.get());
381
382 media_session->AddPlayer(
383 pepper_observer_.get(), 0, media::MediaContentType::Pepper);
384 ASSERT_EQ(media_session, GetAudioFocusedSession());
385
386 media_session->RemovePlayer(pepper_observer_.get(), 0);
387 ASSERT_EQ(nullptr, GetAudioFocusedSession());
388 }
389
390 TEST_F(AudioFocusManagerTest, GainDucksPepper) {
391 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
392 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
393
394 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
395 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
396
397 media_session_1->AddPlayer(
398 pepper_observer_.get(), 0, media::MediaContentType::Pepper);
399
400 RequestAudioFocus(
401 media_session_2, AudioFocusManager::AudioFocusType::Gain);
402
403 ASSERT_EQ(media_session_2, GetAudioFocusedSession());
404 ASSERT_TRUE(media_session_1->IsActive());
405 ASSERT_TRUE(IsSessionDucking(media_session_1));
406 }
407
408 TEST_F(AudioFocusManagerTest, AbandoningGainFocusRevokesTopMostPepperSession) {
409 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
410 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
411
412 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
413 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
414
415 std::unique_ptr<WebContents> web_contents_3(CreateWebContents());
416 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
417
418 media_session_1->AddPlayer(
419 pepper_observer_.get(), 0, media::MediaContentType::Pepper);
420
421 RequestAudioFocus(
422 media_session_2, AudioFocusManager::AudioFocusType::Gain);
423 RequestAudioFocus(
424 media_session_3, AudioFocusManager::AudioFocusType::Gain);
425
426 ASSERT_EQ(media_session_3, GetAudioFocusedSession());
427 ASSERT_TRUE(media_session_2->IsReallySuspended());
428 ASSERT_TRUE(media_session_1->IsActive());
429 ASSERT_TRUE(IsSessionDucking(media_session_1));
430
431 AbandonAudioFocus(media_session_3);
432 ASSERT_EQ(media_session_1, GetAudioFocusedSession());
433 }
434
346 } // namespace content 435 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/session/audio_focus_manager.cc ('k') | content/browser/media/session/media_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698