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

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

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

Powered by Google App Engine
This is Rietveld 408576698