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

Side by Side Diff: third_party/WebKit/Source/modules/webaudio/BaseAudioContextTest.cpp

Issue 2501863003: Support for AudioContextOptions latencyHint. (Closed)
Patch Set: Check all LatencyHints WebAudioDeviceImpl test. 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 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 "modules/webaudio/BaseAudioContext.h" 5 #include "modules/webaudio/BaseAudioContext.h"
6 6
7 #include "core/dom/Document.h" 7 #include "core/dom/Document.h"
8 #include "core/dom/DocumentUserGestureToken.h" 8 #include "core/dom/DocumentUserGestureToken.h"
9 #include "core/frame/FrameOwner.h" 9 #include "core/frame/FrameOwner.h"
10 #include "core/frame/FrameTypes.h" 10 #include "core/frame/FrameTypes.h"
11 #include "core/frame/FrameView.h" 11 #include "core/frame/FrameView.h"
12 #include "core/frame/Settings.h" 12 #include "core/frame/Settings.h"
13 #include "core/loader/DocumentLoader.h" 13 #include "core/loader/DocumentLoader.h"
14 #include "core/loader/EmptyClients.h" 14 #include "core/loader/EmptyClients.h"
15 #include "core/testing/DummyPageHolder.h" 15 #include "core/testing/DummyPageHolder.h"
16 #include "modules/webaudio/AudioContextOptions.h"
16 #include "platform/UserGestureIndicator.h" 17 #include "platform/UserGestureIndicator.h"
17 #include "platform/testing/HistogramTester.h" 18 #include "platform/testing/HistogramTester.h"
18 #include "platform/testing/TestingPlatformSupport.h" 19 #include "platform/testing/TestingPlatformSupport.h"
19 #include "public/platform/WebAudioDevice.h" 20 #include "public/platform/WebAudioDevice.h"
21 #include "public/platform/WebAudioLatencyHint.h"
20 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
21 23
22 namespace blink { 24 namespace blink {
23 25
24 namespace { 26 namespace {
25 27
26 const char* const kCrossOriginMetric = "WebAudio.Autoplay.CrossOrigin"; 28 const char* const kCrossOriginMetric = "WebAudio.Autoplay.CrossOrigin";
27 29
28 class MockCrossOriginFrameLoaderClient final : public EmptyFrameLoaderClient { 30 class MockCrossOriginFrameLoaderClient final : public EmptyFrameLoaderClient {
29 public: 31 public:
(...skipping 10 matching lines...) Expand all
40 Frame* top() const override { return m_parent.get(); } 42 Frame* top() const override { return m_parent.get(); }
41 43
42 private: 44 private:
43 explicit MockCrossOriginFrameLoaderClient(Frame* parent) : m_parent(parent) {} 45 explicit MockCrossOriginFrameLoaderClient(Frame* parent) : m_parent(parent) {}
44 46
45 Member<Frame> m_parent; 47 Member<Frame> m_parent;
46 }; 48 };
47 49
48 class MockWebAudioDevice : public WebAudioDevice { 50 class MockWebAudioDevice : public WebAudioDevice {
49 public: 51 public:
50 explicit MockWebAudioDevice(double sampleRate) : m_sampleRate(sampleRate) {} 52 explicit MockWebAudioDevice(double sampleRate, int framesPerBuffer)
53 : m_sampleRate(sampleRate), m_framesPerBuffer(framesPerBuffer) {}
51 ~MockWebAudioDevice() override = default; 54 ~MockWebAudioDevice() override = default;
52 55
53 void start() override {} 56 void start() override {}
54 void stop() override {} 57 void stop() override {}
55 double sampleRate() override { return m_sampleRate; } 58 double sampleRate() override { return m_sampleRate; }
59 int framesPerBuffer() override { return m_framesPerBuffer; }
56 60
57 private: 61 private:
58 double m_sampleRate; 62 double m_sampleRate;
63 int m_framesPerBuffer;
59 }; 64 };
60 65
61 class BaseAudioContextTestPlatform : public TestingPlatformSupport { 66 class BaseAudioContextTestPlatform : public TestingPlatformSupport {
62 public: 67 public:
63 WebAudioDevice* createAudioDevice(size_t bufferSize, 68 WebAudioDevice* createAudioDevice(unsigned numberOfInputChannels,
64 unsigned numberOfInputChannels,
65 unsigned numberOfChannels, 69 unsigned numberOfChannels,
66 double sampleRate, 70 const WebAudioLatencyHint& latencyHint,
67 WebAudioDevice::RenderCallback*, 71 WebAudioDevice::RenderCallback*,
68 const WebString& deviceId, 72 const WebString& deviceId,
69 const WebSecurityOrigin&) override { 73 const WebSecurityOrigin&) override {
70 return new MockWebAudioDevice(sampleRate); 74 return new MockWebAudioDevice(audioHardwareSampleRate(),
75 audioHardwareBufferSize());
71 } 76 }
72 77
73 double audioHardwareSampleRate() override { return 44100; } 78 double audioHardwareSampleRate() override { return 44100; }
79 size_t audioHardwareBufferSize() override { return 128; }
74 }; 80 };
75 81
76 } // anonymous namespace 82 } // anonymous namespace
77 83
78 class BaseAudioContextTest : public ::testing::Test { 84 class BaseAudioContextTest : public ::testing::Test {
79 protected: 85 protected:
80 using AutoplayStatus = BaseAudioContext::AutoplayStatus; 86 using AutoplayStatus = BaseAudioContext::AutoplayStatus;
81 87
82 void SetUp() override { 88 void SetUp() override {
83 m_dummyPageHolder = DummyPageHolder::create(); 89 m_dummyPageHolder = DummyPageHolder::create();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 136
131 Persistent<LocalFrame> m_childFrame; 137 Persistent<LocalFrame> m_childFrame;
132 Persistent<DocumentLoader> m_childDocumentLoader; 138 Persistent<DocumentLoader> m_childDocumentLoader;
133 139
134 BaseAudioContextTestPlatform m_testPlatform; 140 BaseAudioContextTestPlatform m_testPlatform;
135 }; 141 };
136 142
137 TEST_F(BaseAudioContextTest, AutoplayMetrics_NoRestriction) { 143 TEST_F(BaseAudioContextTest, AutoplayMetrics_NoRestriction) {
138 HistogramTester histogramTester; 144 HistogramTester histogramTester;
139 145
140 BaseAudioContext* audioContext = 146 BaseAudioContext* audioContext = BaseAudioContext::create(
141 BaseAudioContext::create(document(), ASSERT_NO_EXCEPTION); 147 document(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
142 recordAutoplayStatus(audioContext); 148 recordAutoplayStatus(audioContext);
143 149
144 histogramTester.expectTotalCount(kCrossOriginMetric, 0); 150 histogramTester.expectTotalCount(kCrossOriginMetric, 0);
145 } 151 }
146 152
147 TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateNoGesture) { 153 TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateNoGesture) {
148 HistogramTester histogramTester; 154 HistogramTester histogramTester;
149 createChildFrame(); 155 createChildFrame();
150 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 156 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
151 157
152 BaseAudioContext* audioContext = 158 BaseAudioContext* audioContext = BaseAudioContext::create(
153 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 159 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
154 recordAutoplayStatus(audioContext); 160 recordAutoplayStatus(audioContext);
155 161
156 histogramTester.expectBucketCount(kCrossOriginMetric, 162 histogramTester.expectBucketCount(kCrossOriginMetric,
157 AutoplayStatus::AutoplayStatusFailed, 1); 163 AutoplayStatus::AutoplayStatusFailed, 1);
158 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 164 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
159 } 165 }
160 166
161 TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeNoGesture) { 167 TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeNoGesture) {
162 HistogramTester histogramTester; 168 HistogramTester histogramTester;
163 createChildFrame(); 169 createChildFrame();
164 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 170 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
165 171
166 ScriptState::Scope scope(getScriptStateFrom(childDocument())); 172 ScriptState::Scope scope(getScriptStateFrom(childDocument()));
167 173
168 BaseAudioContext* audioContext = 174 BaseAudioContext* audioContext = BaseAudioContext::create(
169 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 175 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
170 audioContext->resumeContext(getScriptStateFrom(childDocument())); 176 audioContext->resumeContext(getScriptStateFrom(childDocument()));
171 rejectPendingResolvers(audioContext); 177 rejectPendingResolvers(audioContext);
172 recordAutoplayStatus(audioContext); 178 recordAutoplayStatus(audioContext);
173 179
174 histogramTester.expectBucketCount(kCrossOriginMetric, 180 histogramTester.expectBucketCount(kCrossOriginMetric,
175 AutoplayStatus::AutoplayStatusFailed, 1); 181 AutoplayStatus::AutoplayStatusFailed, 1);
176 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 182 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
177 } 183 }
178 184
179 TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateGesture) { 185 TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateGesture) {
180 HistogramTester histogramTester; 186 HistogramTester histogramTester;
181 createChildFrame(); 187 createChildFrame();
182 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 188 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
183 189
184 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( 190 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create(
185 &childDocument(), UserGestureToken::NewGesture)); 191 &childDocument(), UserGestureToken::NewGesture));
186 192
187 BaseAudioContext* audioContext = 193 BaseAudioContext* audioContext = BaseAudioContext::create(
188 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 194 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
189 recordAutoplayStatus(audioContext); 195 recordAutoplayStatus(audioContext);
190 196
191 histogramTester.expectBucketCount(kCrossOriginMetric, 197 histogramTester.expectBucketCount(kCrossOriginMetric,
192 AutoplayStatus::AutoplayStatusSucceeded, 1); 198 AutoplayStatus::AutoplayStatusSucceeded, 1);
193 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 199 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
194 } 200 }
195 201
196 TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeGesture) { 202 TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeGesture) {
197 HistogramTester histogramTester; 203 HistogramTester histogramTester;
198 createChildFrame(); 204 createChildFrame();
199 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 205 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
200 206
201 ScriptState::Scope scope(getScriptStateFrom(childDocument())); 207 ScriptState::Scope scope(getScriptStateFrom(childDocument()));
202 208
203 BaseAudioContext* audioContext = 209 BaseAudioContext* audioContext = BaseAudioContext::create(
204 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 210 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
205 211
206 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( 212 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create(
207 &childDocument(), UserGestureToken::NewGesture)); 213 &childDocument(), UserGestureToken::NewGesture));
208 214
209 audioContext->resumeContext(getScriptStateFrom(childDocument())); 215 audioContext->resumeContext(getScriptStateFrom(childDocument()));
210 rejectPendingResolvers(audioContext); 216 rejectPendingResolvers(audioContext);
211 recordAutoplayStatus(audioContext); 217 recordAutoplayStatus(audioContext);
212 218
213 histogramTester.expectBucketCount(kCrossOriginMetric, 219 histogramTester.expectBucketCount(kCrossOriginMetric,
214 AutoplayStatus::AutoplayStatusSucceeded, 1); 220 AutoplayStatus::AutoplayStatusSucceeded, 1);
215 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 221 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
216 } 222 }
217 223
218 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGesture) { 224 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGesture) {
219 HistogramTester histogramTester; 225 HistogramTester histogramTester;
220 createChildFrame(); 226 createChildFrame();
221 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 227 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
222 228
223 BaseAudioContext* audioContext = 229 BaseAudioContext* audioContext = BaseAudioContext::create(
224 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 230 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
225 audioContext->maybeRecordStartAttempt(); 231 audioContext->maybeRecordStartAttempt();
226 recordAutoplayStatus(audioContext); 232 recordAutoplayStatus(audioContext);
227 233
228 histogramTester.expectBucketCount(kCrossOriginMetric, 234 histogramTester.expectBucketCount(kCrossOriginMetric,
229 AutoplayStatus::AutoplayStatusFailed, 1); 235 AutoplayStatus::AutoplayStatusFailed, 1);
230 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 236 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
231 } 237 }
232 238
233 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGesture) { 239 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGesture) {
234 HistogramTester histogramTester; 240 HistogramTester histogramTester;
235 createChildFrame(); 241 createChildFrame();
236 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 242 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
237 243
238 BaseAudioContext* audioContext = 244 BaseAudioContext* audioContext = BaseAudioContext::create(
239 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 245 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
240 246
241 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( 247 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create(
242 &childDocument(), UserGestureToken::NewGesture)); 248 &childDocument(), UserGestureToken::NewGesture));
243 audioContext->maybeRecordStartAttempt(); 249 audioContext->maybeRecordStartAttempt();
244 recordAutoplayStatus(audioContext); 250 recordAutoplayStatus(audioContext);
245 251
246 histogramTester.expectBucketCount( 252 histogramTester.expectBucketCount(
247 kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailedWithStart, 1); 253 kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailedWithStart, 1);
248 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 254 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
249 } 255 }
250 256
251 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGestureThenSuccess) { 257 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartNoGestureThenSuccess) {
252 HistogramTester histogramTester; 258 HistogramTester histogramTester;
253 createChildFrame(); 259 createChildFrame();
254 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 260 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
255 261
256 ScriptState::Scope scope(getScriptStateFrom(childDocument())); 262 ScriptState::Scope scope(getScriptStateFrom(childDocument()));
257 263
258 BaseAudioContext* audioContext = 264 BaseAudioContext* audioContext = BaseAudioContext::create(
259 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 265 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
260 audioContext->maybeRecordStartAttempt(); 266 audioContext->maybeRecordStartAttempt();
261 267
262 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( 268 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create(
263 &childDocument(), UserGestureToken::NewGesture)); 269 &childDocument(), UserGestureToken::NewGesture));
264 audioContext->resumeContext(getScriptStateFrom(childDocument())); 270 audioContext->resumeContext(getScriptStateFrom(childDocument()));
265 rejectPendingResolvers(audioContext); 271 rejectPendingResolvers(audioContext);
266 recordAutoplayStatus(audioContext); 272 recordAutoplayStatus(audioContext);
267 273
268 histogramTester.expectBucketCount(kCrossOriginMetric, 274 histogramTester.expectBucketCount(kCrossOriginMetric,
269 AutoplayStatus::AutoplayStatusSucceeded, 1); 275 AutoplayStatus::AutoplayStatusSucceeded, 1);
270 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 276 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
271 } 277 }
272 278
273 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGestureThenSucces) { 279 TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGestureThenSucces) {
274 HistogramTester histogramTester; 280 HistogramTester histogramTester;
275 createChildFrame(); 281 createChildFrame();
276 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); 282 childDocument().settings()->setMediaPlaybackRequiresUserGesture(true);
277 283
278 ScriptState::Scope scope(getScriptStateFrom(childDocument())); 284 ScriptState::Scope scope(getScriptStateFrom(childDocument()));
279 285
280 BaseAudioContext* audioContext = 286 BaseAudioContext* audioContext = BaseAudioContext::create(
281 BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); 287 childDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION);
282 288
283 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( 289 UserGestureIndicator userGestureScope(DocumentUserGestureToken::create(
284 &childDocument(), UserGestureToken::NewGesture)); 290 &childDocument(), UserGestureToken::NewGesture));
285 audioContext->maybeRecordStartAttempt(); 291 audioContext->maybeRecordStartAttempt();
286 audioContext->resumeContext(getScriptStateFrom(childDocument())); 292 audioContext->resumeContext(getScriptStateFrom(childDocument()));
287 rejectPendingResolvers(audioContext); 293 rejectPendingResolvers(audioContext);
288 recordAutoplayStatus(audioContext); 294 recordAutoplayStatus(audioContext);
289 295
290 histogramTester.expectBucketCount(kCrossOriginMetric, 296 histogramTester.expectBucketCount(kCrossOriginMetric,
291 AutoplayStatus::AutoplayStatusSucceeded, 1); 297 AutoplayStatus::AutoplayStatusSucceeded, 1);
292 histogramTester.expectTotalCount(kCrossOriginMetric, 1); 298 histogramTester.expectTotalCount(kCrossOriginMetric, 1);
293 } 299 }
294 300
295 } // namespace blink 301 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698