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

Unified Diff: third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html

Issue 2895963003: Apply layout-test-tidy to LayoutTests/webaudio (Closed)
Patch Set: Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html
diff --git a/third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html b/third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html
index 597206e05520bed0dd4932b25ad901f4c1df693c..7d6da79d30cf832ab52f2cbb26479cdb8ba1b32f 100644
--- a/third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html
+++ b/third_party/WebKit/LayoutTests/webaudio/dom-exceptions.html
@@ -1,747 +1,802 @@
-<!doctype html>
+<!DOCTYPE html>
<html>
-<head>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="resources/audit-util.js"></script>
-<script src="resources/audit.js"></script>
-<script src="resources/biquad-testing.js"></script>
-</head>
-
-<body>
-<script>
-let audit = Audit.createTaskRunner();
-
-let otherContext;
-let node;
-let node2;
-let mode;
-let panner;
-let script;
-let source;
-
-function shouldThrowAndBeUnchanged(should, node, attr, value) {
- should(
- () => node[attr] = value,
- node.constructor.name + '.' + attr + ' = ' + value)
- .throw();
- should(node[attr], node.constructor.name + '.' + attr).notBeEqualTo(value);
-}
-
-audit.define(
- {label: 'initialize', description: 'Initialize contexts for testing'},
- (task, should) => {
-
- should(() => {
- context = new AudioContext();
- }, 'context = new AudioContext()').notThrow();
-
- should(() => {
- otherContext = new AudioContext();
- }, 'otherContext = new AudioContext()').notThrow();
-
- task.done();
- });
-
-audit.define('createBuffer', (task, should) => {
- // Invalid number of channels: NotSupportedError
- should(
- () => context.createBuffer(99, 1, context.sampleRate),
- 'context.createBuffer(99, 1, context.sampleRate)')
- .throw('NotSupportedError');
- should(
- () => context.createBuffer(0, 1, context.sampleRate),
- 'context.createBuffer(0, 1, context.sampleRate)')
- .throw('NotSupportedError');
- // Invalid sample rate: NotSupportedError
- should(() => context.createBuffer(1, 1, 1), 'context.createBuffer(1, 1, 1)')
- .throw('NotSupportedError');
- should(
- () => context.createBuffer(1, 1, 2999),
- 'context.createBuffer(1, 1, 2999)')
- .throw('NotSupportedError');
- should(
- () => context.createBuffer(1, 1, 384001),
- 'context.createBuffer(1, 1, 384001)')
- .throw('NotSupportedError');
- should(
- () => context.createBuffer(1, 1, 1e6), 'context.createBuffer(1, 1, 1e6)')
- .throw('NotSupportedError');
- // Check valid values from crbug.com/344375
- should(
- () => context.createBuffer(1, 1, 3000),
- 'context.createBuffer(1, 1, 3000)')
- .notThrow();
- should(
- () => context.createBuffer(1, 1, 192000),
- 'context.createBuffer(1, 1, 192000)')
- .notThrow();
- should(
- () => context.createBuffer(1, 1, 384000),
- 'context.createBuffer(1, 1, 384000)')
- .notThrow();
- // Invalid number of frames: NotSupportedError
- should(
- () => context.createBuffer(1, 0, context.sampleRate),
- 'context.createBuffer(1, 0, context.sampleRate)')
- .throw('NotSupportedError');
- // 2-arg createBuffer not allowed.
- should(
- () => context.createBuffer(new ArrayBuffer(100), true),
- 'context.createBuffer(new ArrayBuffer(100), true)')
- .throw('TypeError');
-
- task.done();
-});
-
-audit.define('createMediaElementSource', (task, should) => {
- // Invalid sources (unspecified error)
- should(
- () => context.createMediaElementSource(null),
- 'context.createMediaElementSource(null)')
- .throw();
- task.done();
-});
-
-audit.define('createMediaStreamSource', (task, should) => {
- // Invalid sources (unspecified error)
- should(
- () => context.createMediaStreamSource(null),
- 'context.createMediaStreamSource(null)')
- .throw();
-
- task.done();
-});
-
-audit.define('createScriptProcessor', (task, should) => {
- // Invalid buffer size: IndexSizeError
- should(
- () => context.createScriptProcessor(1, 1, 1),
- 'context.createScriptProcessor(1, 1, 1)')
- .throw('IndexSizeError');
- // Invalid number of inputs and outputs: IndexSizeError
- should(
- () => context.createScriptProcessor(4096, 100, 1),
- 'context.createScriptProcessor(4096, 100, 1)')
- .throw('IndexSizeError');
- should(
- () => context.createScriptProcessor(4096, 1, 100),
- 'context.createScriptProcessor(4096, 1, 100)')
- .throw('IndexSizeError');
- should(
- () => context.createScriptProcessor(), 'context.createScriptProcessor()')
- .notThrow();
- should(
- () => context.createScriptProcessor(0),
- 'context.createScriptProcessor(0)')
- .notThrow();
-
- task.done();
-});
-
-audit.define('createChannelSplitter', (task, should) => {
- // Invalid number of channels: IndexSizeError
- should(
- () => context.createChannelSplitter(0),
- 'context.createChannelSplitter(0)')
- .throw('IndexSizeError');
- should(
- () => context.createChannelSplitter(99),
- 'context.createChannelSplitter(99)')
- .throw('IndexSizeError');
- should(() => context.createChannelMerger(0), 'context.createChannelMerger(0)')
- .throw('IndexSizeError');
-
- task.done();
-});
-
-audit.define('createChannelMerger', (task, should) => {
- // Invalid number of channels: IndexSizeError
- should(
- () => context.createChannelMerger(99), 'context.createChannelMerger(99)')
- .throw('IndexSizeError');
-
- task.done();
-});
-
-audit.define('createPeriodicWave', (task, should) => {
- // Invalid real/imag arrays: IndexSizeError
- should(
- () => context.createPeriodicWave(null, null),
- 'context.createPeriodicWave(null, null)')
- .throw('TypeError');
- should(
- () => context.createPeriodicWave(new Float32Array(10), null),
- 'context.createPeriodicWave(new Float32Array(10), null)')
- .throw('TypeError');
- // Verify that we can use large arrays with no limit. Roughly.
- should(
- () => context.createPeriodicWave(
- new Float32Array(4100), new Float32Array(4100)),
- 'context.createPeriodicWave(new Float32Array(4100), new Float32Array(4100))')
- .notThrow();
- should(
- () => context.createPeriodicWave(
- new Float32Array(8192), new Float32Array(8192)),
- 'context.createPeriodicWave(new Float32Array(8192), new Float32Array(8192))')
- .notThrow();
- should(
- () => context.createPeriodicWave(
- new Float32Array(10000), new Float32Array(10000)),
- 'context.createPeriodicWave(new Float32Array(10000), new Float32Array(10000))')
- .notThrow();
- // Real and imaginary arrays must have the same size: IndexSizeError
- should(
- () =>
- context.createPeriodicWave(new Float32Array(10), new Float32Array(7)),
- 'context.createPeriodicWave(new Float32Array(10), new Float32Array(7))')
- .throw('IndexSizeError');
-
- task.done();
-});
-
-audit.define('createAnalyser', (task, should) => {
- // Analysers
- node = context.createAnalyser();
- // Invalid fftSize: IndexSizeError
- shouldThrowAndBeUnchanged(should, node, 'fftSize', '42');
- shouldThrowAndBeUnchanged(should, node, 'fftSize', '16');
- should(() => node.fftSize = 32768, 'AnalyserNode.fftSize = 32768').notThrow();
- shouldThrowAndBeUnchanged(should, node, 'fftSize', '65536');
-
- shouldThrowAndBeUnchanged(should, node, 'minDecibels', '-10');
- shouldThrowAndBeUnchanged(should, node, 'maxDecibels', '-150');
- shouldThrowAndBeUnchanged(should, node, 'minDecibels', '-30');
- shouldThrowAndBeUnchanged(should, node, 'maxDecibels', '-100');
-
- shouldThrowAndBeUnchanged(should, node, 'smoothingTimeConstant', '-0.1');
- shouldThrowAndBeUnchanged(should, node, 'smoothingTimeConstant', '1.5');
-
- should(
- () => node.getFloatFrequencyData(null),
- 'AnalyserNode.getFloatFrequencyData(null)')
- .throw();
- should(
- () => node.getByteFrequencyData(null),
- node.constructor.name + '.getByteFrequencyData(null)')
- .throw();
- should(
- () => node.getFloatTimeDomainData(null),
- node.constructor.name + '.getFloatTimeDomainData(null)')
- .throw();
- should(
- () => node.getByteTimeDomainData(null),
- node.constructor.name + '.getByteTimeDomainData(null)')
- .throw();
-
- if (window.SharedArrayBuffer) {
- should(
- () => node.getFloatFrequencyData(new Float32Array(new SharedArrayBuffer(16))),
- 'AnalyserNode.getFloatFrequencyData(SharedArrayBuffer view)')
- .throw();
- should(
- () => node.getByteFrequencyData(new Uint8Array(new SharedArrayBuffer(16))),
- node.constructor.name + '.getByteFrequencyData(SharedArrayBuffer view)')
- .throw();
- should(
- () => node.getFloatTimeDomainData(new Float32Array(new SharedArrayBuffer(16))),
- node.constructor.name + '.getFloatTimeDomainData(SharedArrayBuffer view)')
- .throw();
- should(
- () => node.getByteTimeDomainData(new Uint8Array(new SharedArrayBuffer(16))),
- node.constructor.name + '.getByteTimeDomainData(SharedArrayBuffer view)')
- .throw();
- }
-
- // AudioBuffers
- node = context.createBuffer(1, 1, context.sampleRate);
- // Invalid channel index: IndexSizeError
- should(
- () => node.getChannelData(2),
- node.constructor.name + '.getChannelData(2)')
- .throw();
-
- task.done();
-});
-
-audit.define(
- {
- label: 'Init test nodes',
- description: 'Create test nodes for the following tests'
- },
- (task, should) => {
- should(() => {
- node = context.createGain();
- }, 'node = context.createGain()').notThrow();
- should(() => {
- node2 = context.createGain();
- }, 'node2 = context.createGain()').notThrow();
-
- task.done();
- });
-
-audit.define(
- {label: 'connections', description: 'AudioNode connections'},
- (task, should) => {
-
- // AudioNode connections
- // Invalid destination node (unspecified error)
- should(() => node.connect(null, 0, 0), 'node.connect(null, 0, 0)')
- .throw();
- // Invalid input or output index: IndexSizeError
- should(
- () => node.connect(context.destination, 100, 0),
- 'node.connect(context.destination, 100, 0)')
- .throw('IndexSizeError');
- should(
- () => node.connect(context.destination, 0, 100),
- 'node.connect(context.destination, 0, 100)')
- .throw('IndexSizeError');
- should(
- () => node.connect(node2.gain, 100), 'node.connect(node2.gain, 100)')
- .throw('IndexSizeError');
- should(() => node.disconnect(99), 'node.disconnect(99)')
- .throw('IndexSizeError');
- // Can't connect to a different context (unspecified error)
- should(
- () => node.connect(otherContext.destination),
- 'node.connect(otherContext.destination)')
- .throw();
-
- task.done();
- });
-
-audit.define(
- {
- label: 'channel-stuff',
- description: 'channelCount, channelCountMode, channelInterpretation'
- },
- (task, should) => {
-
- // Invalid channel count: NotSupportedError
- shouldThrowAndBeUnchanged(should, node, 'channelCount', '99');
- // Invalid mode or interpretation (unspecified error)
- currentMode = node.channelCountMode;
- currentInterpretation = node.channelInterpretation;
- should(
- () => node.channelCountMode = 'fancy',
- 'node.channelCountMode = "fancy"')
- .notThrow();
- should(node.channelCountMode, 'node.channelCountMode')
- .beEqualTo(currentMode);
- should(
- () => node.channelInterpretation = mode,
- 'node.channelInterpretation = mode')
- .notThrow();
- should(node.channelInterpretation, 'node.channelInterpretation')
- .beEqualTo(currentInterpretation);
- // Destination node channel count: should throw IndexSizeError on invalid
- // channel count. shouldNotThrow() method cannot be used because the error
- // message includes the number of channels, which can change depending on
- // the actual attached hardware.
- should(
- () => context.destination.channelCount = 99,
- 'context.destination.channelCount = 99')
- .throw('IndexSizeError', { omitErrorMessage: true });
-
- task.done();
- });
-
-audit.define('audioparam', (task, should) => {
- // AudioParams
- param = context.createGain().gain;
- should(
- () => param.setValueCurveAtTime(null, 0, 0),
- 'param.setValueCurveAtTime(null, 0, 0)')
- .throw();
-
- // exponentialRampToValue should throw only for "zero" target values.
- should(
- () => node.gain.exponentialRampToValueAtTime(-1, 0.1),
- 'node.gain.exponentialRampToValueAtTime(-1, 0.1)')
- .notThrow();
- should(
- () => node.gain.exponentialRampToValueAtTime(0, 0.1),
- 'node.gain.exponentialRampToValueAtTime(0, 0.1)')
- .throw();
- // 1e-100 is 0 when converted to a single precision float.
- should(
- () => node.gain.exponentialRampToValueAtTime(1e-100, 0.1),
- 'node.gain.exponentialRampToValueAtTime(1e-100, 0.1)')
- .throw();
- // See crbug.com/459391.
- // Math.pow(2, -149) = 1.401298464324817e-45 is the double-float value of the
- // least positive single float number. We do it this way to make sure no
- // round-off or conversion
- // errors happen when reading 1.401298464324817e-45.
- should(
- () => node.gain.exponentialRampToValueAtTime(Math.pow(2, -149), 0.1),
- 'node.gain.exponentialRampToValueAtTime(Math.pow(2, -149), 0.1)')
- .notThrow();
- // Math.pow(2, -150) = 7.006492321624085d-46 is the largest double float value
- // such that
- // conversion to a float produces 0. Any larger value would produce a
- // non-zero value when
- // converted to a single float.
- should(
- () => node.gain.exponentialRampToValueAtTime(Math.pow(2, -150), 0.1),
- 'node.gain.exponentialRampToValueAtTime(Math.pow(2, -150), 0.1)')
- .throw();
-
- task.done();
-});
-
-audit.define('biquad', (task, should) => {
- // BiquadFilterNode
- node = context.createBiquadFilter();
- should(
- () => node.getFrequencyResponse(
- new Float32Array(1), new Float32Array(1), new Float32Array(1)),
- 'node.getFrequencyResponse(new Float32Array(1), new Float32Array(1), new Float32Array(1))')
- .notThrow();
- should(
- () => node.getFrequencyResponse(
- null, new Float32Array(1), new Float32Array(1)),
- 'node.getFrequencyResponse(null, new Float32Array(1), new Float32Array(1))')
- .throw();
- should(
- () => node.getFrequencyResponse(
- new Float32Array(1), null, new Float32Array(1)),
- 'node.getFrequencyResponse(new Float32Array(1), null, new Float32Array(1))')
- .throw();
- should(
- () => node.getFrequencyResponse(
- new Float32Array(1), new Float32Array(1), null),
- 'node.getFrequencyResponse(new Float32Array(1), new Float32Array(1), null)')
- .throw();
-
- if (window.SharedArrayBuffer) {
- let shared_view = new Float32Array(new SharedArrayBuffer(4));
- let nonshared_view = new Float32Array(1);
-
- should(
- () => node.getFrequencyResponse(shared_view, nonshared_view, nonshared_view),
- 'node.getFrequencyResponse(shared_view, nonshared_view, nonshared_view)')
- .throw();
- should(
- () => node.getFrequencyResponse(nonshared_view, shared_view, nonshared_view),
- 'node.getFrequencyResponse(nonshared_view, shared_view, nonshared_view)')
- .throw();
- should(
- () => node.getFrequencyResponse(nonshared_view, nonshared_view, shared_view),
- 'node.getFrequencyResponse(nonshared_view, nonshared_view, shared_view)')
- .throw();
- }
-
- task.done();
-});
-
-audit.define('offline-audio-context', (task, should) => {
- // OfflineAudioContext
- // Max supported channels
- should(
- () => new OfflineAudioContext(32, 100, context.sampleRate),
- 'new OfflineAudioContext(32, 100, context.sampleRate)')
- .notThrow();
- // Invalid number of channels
- should(
- () => new OfflineAudioContext(0, 100, context.sampleRate),
- 'new OfflineAudioContext(0, 100, context.sampleRate)')
- .throw('NotSupportedError');
- should(
- () => new OfflineAudioContext(99, 100, context.sampleRate),
- 'new OfflineAudioContext(99, 100, context.sampleRate)')
- .throw('NotSupportedError');
- // Invalid sample rate.
- should(
- () => new OfflineAudioContext(1, 100, 1),
- 'new OfflineAudioContext(1, 100, 1)')
- .throw('NotSupportedError');
- should(
- () => new OfflineAudioContext(1, 100, 1e6),
- 'new OfflineAudioContext(1, 100, 1e6)')
- .throw('NotSupportedError');
- // Invalid frame length (crbug.com/351277)
- should(
- () => new OfflineAudioContext(1, -88200000000000, 44100),
- 'new OfflineAudioContext(1, -88200000000000, 44100)')
- .throw('NotSupportedError');
- should(
- () => new OfflineAudioContext(1, 0, 44100),
- 'new OfflineAudioContext(1, 0, 44100)')
- .throw('NotSupportedError');
-
- task.done();
-});
-
-audit.define('waveshaper', (task, should) => {
- // WaveShaper types
- node = context.createWaveShaper();
- currentOversample = node.oversample;
- should(() => node.oversample = '9x', 'node.oversample = "9x"').notThrow();
- should(node.oversample, 'node.oversample').beEqualTo(currentOversample);
- should(() => node.curve = {}, 'node.curve = {}').throw();
- should(
- () => node.curve = new Float32Array(1),
- 'node.curve = new Float32Array(1)')
- .throw();
- should(node.curve, 'node.curve').beEqualTo(null);
- should(
- () => node.curve = new Float32Array(2),
- 'node.curve = new Float32Array(2)')
- .notThrow();
- should(() => node.curve = null, 'node.curve = null').notThrow();
-
- task.done();
-});
-
-audit.define(
- {label: 'audio-buffer-source', description: 'AudioBufferSource start/stop'},
- (task, should) => {
- // Start/stop for AudioBufferSourceNodes
- buffer = context.createBuffer(1, 1, context.sampleRate);
- should(
- () => source = context.createBufferSource(),
- 'source = context.createBufferSource()')
- .notThrow();
- should(() => { source.buffer = buffer}, 'source.buffer = buffer').notThrow();
- should(
- () => source.buffer = context.createBuffer(1, 10, context.sampleRate),
- 'source.buffer = context.createBuffer(1, 10, context.sampleRate)')
- .throw();
- should(() => {source.start(-1)}, 'source.start(-1)').throw();
- should(() => {source.start(Infinity)}, 'source.start(Infinity)').throw();
- should(() => {source.start(-Infinity)}, 'source.start(-Infinity)').throw();
- should(() => {source.start(NaN)}, 'source.start(NaN)').throw();
- should(() => {source.start(1, Infinity)}, 'source.start(1, Infinity)')
- .throw();
- should(() => {source.start(1, -Infinity)}, 'source.start(1, -Infinity)')
- .throw();
- should(() => {source.start(1, NaN)}, 'source.start(1, NaN)').throw();
- should(() => {source.start(1, -1)}, 'source.start(1, -1)').throw();
- should(
- () => {source.start(1, -Number.MIN_VALUE)},
- 'source.start(1, -Number.MIN_VALUE)')
- .throw();
- should(() => {source.start(1, 1, Infinity)}, 'source.start(1, 1, Infinity)')
- .throw();
- should(
- () => {source.start(1, 1, -Infinity)}, 'source.start(1, 1, -Infinity)')
- .throw();
- should(() => {source.start(1, 1, NaN)}, 'source.start(1, 1, NaN)').throw();
- should(() => {source.start(1, 1, -1)}, 'source.start(1, 1, -1)').throw();
- should(
- () => {source.start(1, 1, -Number.MIN_VALUE)},
- 'source.start(1, 1, -Number.MIN_VALUE)')
- .throw();
- should(() => source.start(), 'source.start()').notThrow();
- should(
- () => source.stop(-Number.MIN_VALUE),
- 'source.stop(-Number.MIN_VALUE)')
- .throw();
- should(() => source.stop(Infinity), 'source.stop(Infinity)').throw();
- should(() => source.stop(-Infinity), 'source.stop(-Infinity)').throw();
- should(() => source.stop(NaN), 'source.stop(NaN)').throw();
- should(() => source.stop(), 'source.stop()').notThrow();
-
- // Verify that start(0, 0) doesn't signal.
- let source2;
- should(
- () => { source2 = context.createBufferSource()},
- 'source2 = context.createBufferSource()')
- .notThrow();
- should(() => source2.buffer = buffer, 'source2.buffer = buffer').notThrow();
- should(() => source2.start(0, 0), 'source2.start(0, 0)').notThrow();
-
- // Verify that start(0, -0.0) doesn't signal.
- let source3;
- should(
- () => source3 = context.createBufferSource(),
- 'source3 = context.createBufferSource()')
- .notThrow();
- should(() => source3.buffer = buffer, 'source3.buffer = buffer').notThrow();
- should(
- () => source3.start(0, -1 / Infinity), 'source3.start(0, -1/Infinity)')
- .notThrow();
-
- // It's not clear from the spec, but I think it's valid to call start().
- // The spec is silent on what happens if we call stop() afterwards, so
- // don't call it.
- let source4;
- should(
- () => source4 = context.createBufferSource(),
- 'source4 = context.createBufferSource()')
- .notThrow();
- should(() => source4.start(), 'source4.start()').notThrow();
-
- buffer = context.createBuffer(1, 1, context.sampleRate);
- let source5;
- should(
- () => source5 = context.createBufferSource(),
- 'source5 = context.createBufferSource()')
- .notThrow();
- should(() => source5.buffer = buffer, 'source5.buffer = buffer').notThrow();
- should(() => source5.stop(), 'source5.stop()').throw();
-
- buffer = context.createBuffer(1, 1, context.sampleRate);
- let source6;
- should(
- () => source6 = context.createBufferSource(),
- 'source6 = context.createBufferSource()')
- .notThrow();
- should(() => source6.buffer = buffer, 'source6.buffer = buffer').notThrow();
- should(() => source6.start(), 'source6.start()').notThrow();
- should(() => source6.start(), 'source6.start()').throw();
-
- buffer = context.createBuffer(1, 1, context.sampleRate);
- let source7;
- should(
- () => source7 = context.createBufferSource(),
- 'source7 = context.createBufferSource()')
- .notThrow();
- should(() => source7.buffer = buffer, 'source7.buffer = buffer').notThrow();
- should(() => source7.start(), 'source7.start()').notThrow();
- should(() => source7.stop(), 'source7.stop()').notThrow();
-
- task.done();
- });
-
-audit.define(
- {label: 'oscillator', description: 'start/stop'}, (task, should) => {
-
- let source8;
- // Start/stop for OscillatorNodes
- should(
- () => source8 = context.createOscillator(),
- 'source8 = context.createOscillator()')
- .notThrow();
- should(
- () => source8.start(-Number.MIN_VALUE),
- 'source8.start(-Number.MIN_VALUE)')
- .throw();
- should(() => source8.start(Infinity), 'source8.start(Infinity)').throw();
- should(() => source8.start(-Infinity), 'source8.start(-Infinity)').throw();
- should(() => source8.start(NaN), 'source8.start(NaN)').throw();
- should(() => source8.start(), 'source8.start()').notThrow();
- should(
- () => source8.stop(-Number.MIN_VALUE),
- 'source8.stop(-Number.MIN_VALUE)')
- .throw();
- should(() => source8.stop(Infinity), 'source8.stop(Infinity)').throw();
- should(() => source8.stop(-Infinity), 'source8.stop(-Infinity)').throw();
- should(() => source8.stop(NaN), 'source8.stop(NaN)').throw();
- should(() => source8.stop(), 'source8.stop()').notThrow();
-
- should(
- () => osc = context.createOscillator(),
- 'osc = context.createOscillator()')
- .notThrow();
- should(() => osc.stop(), 'osc.stop()').throw();
- should(
- () => osc1 = context.createOscillator(),
- 'osc1 = context.createOscillator()')
- .notThrow();
- should(() => osc1.start(), 'osc1.start()').notThrow();
- should(() => osc1.stop(), 'osc1.stop()').notThrow();
-
- should(() => osc.setPeriodicWave(null), 'osc.setPeriodicWave(null)')
- .throw();
-
-
- task.done();
- });
-
-audit.define('convolver', (task, should) => {
- // Convolver buffer rate must match context rate. Create on offline context so
- // we
- // specify the context rate exactly, in case the test is run on platforms with
- // different
- // HW sample rates.
- should(
- () => oc = new OfflineAudioContext(1, 44100, 44100),
- 'oc = new OfflineAudioContext(1, 44100, 44100)')
- .notThrow();
- should(() => conv = oc.createConvolver(), 'conv = oc.createConvolver()')
- .notThrow();
- should(() => conv.buffer = {}, 'conv.buffer = {}').throw();
- should(
- () => conv.buffer = oc.createBuffer(1, 100, 22050),
- 'conv.buffer = oc.createBuffer(1, 100, 22050)')
- .throw();
- // conv.buffer should be unchanged (null) because the above failed.
- should(conv.buffer, 'conv.buffer').beEqualTo(null);
-
- task.done();
-});
-
-audit.define('panner', (task, should) => {
- // PannerNode channel count and mode
- panner = context.createPanner();
- // Channel count can only be set to 1 or 2.
- should(() => panner.channelCount = 1, 'panner.channelCount = 1').notThrow();
- should(() => panner.channelCount = 2, 'panner.channelCount = 2').notThrow();
- shouldThrowAndBeUnchanged(should, panner, 'channelCount', 0);
- shouldThrowAndBeUnchanged(should, panner, 'channelCount', 3);
- // It is illegal to set the mode to 'max'
- shouldThrowAndBeUnchanged(should, panner, 'channelCountMode', 'max');
- should(
- () => panner.channelCountMode = 'explicit',
- 'panner.channelCountMode = "explicit"')
- .notThrow();
- should(
- () => panner.channelCountMode = 'clamped-max',
- 'panner.channelCountMode = "clamped-max"')
- .notThrow();
- should(
- () => panner.channelCountMode = 'junk',
- 'panner.channelCountMode = "junk"')
- .notThrow();
-
- task.done();
-});
-
-audit.define('script-processor', (task, should) => {
- // Test channel count and mode for a ScriptProcessor.
- should(
- () => script = context.createScriptProcessor(256, 3),
- 'script = context.createScriptProcessor(256, 3)')
- .notThrow();
- // Make sure the channelCount and mode are set correctly.
- should(script.channelCount, 'script.channelCount').beEqualTo(3);
- should(script.channelCountMode, 'script.channelCountMode')
- .beEqualTo('explicit');
- // Cannot change the channelCount or mode to anything else
- should(() => script.channelCount = 3, 'script.channelCount = 3').notThrow();
- shouldThrowAndBeUnchanged(should, script, 'channelCount', 1);
-
- shouldThrowAndBeUnchanged(should, script, 'channelCount', 7);
- should(
- () => script.channelCountMode = 'explicit',
- 'script.channelCountMode = "explicit"')
- .notThrow();
- shouldThrowAndBeUnchanged(should, script, 'channelCountMode', 'max');
- shouldThrowAndBeUnchanged(should, script, 'channelCountMode', 'clamped-max');
- should(
- () => script.channelCountMode = 'junk',
- 'script.channelCountMode = "junk"')
- .notThrow();
-
- task.done();
-});
-
-audit.define(
- {label: 'misc', description: 'Miscellaneous tests'}, (task, should) => {
-
- // noteOn and noteOff don't exist anymore
- should(osc.noteOn, 'osc.noteOn').beEqualTo(undefined);
- should(osc.noteOff, 'osc.noteOff').beEqualTo(undefined);
- should(source.noteOn, 'source.noteOn').beEqualTo(undefined);
- should(source.noteOff, 'source.noteOff').beEqualTo(undefined);
-
- task.done();
- });
-
-audit.run();
-</script>
-</body>
+ <head>
+ <title>
+ dom-exceptions.html
+ </title>
+ <script src="../resources/testharness.js"></script>
+ <script src="../resources/testharnessreport.js"></script>
+ <script src="resources/audit-util.js"></script>
+ <script src="resources/audit.js"></script>
+ <script src="resources/biquad-testing.js"></script>
+ </head>
+ <body>
+ <script id="layout-test-code">
+ let audit = Audit.createTaskRunner();
+
+ let otherContext;
+ let node;
+ let node2;
+ let mode;
+ let panner;
+ let script;
+ let source;
+
+ function shouldThrowAndBeUnchanged(should, node, attr, value) {
+ should(
+ () => node[attr] = value,
+ node.constructor.name + '.' + attr + ' = ' + value)
+ .throw();
+ should(node[attr], node.constructor.name + '.' + attr)
+ .notBeEqualTo(value);
+ }
+
+ audit.define(
+ {label: 'initialize', description: 'Initialize contexts for testing'},
+ (task, should) => {
+
+ should(() => {
+ context = new AudioContext();
+ }, 'context = new AudioContext()').notThrow();
+
+ should(() => {
+ otherContext = new AudioContext();
+ }, 'otherContext = new AudioContext()').notThrow();
+
+ task.done();
+ });
+
+ audit.define('createBuffer', (task, should) => {
+ // Invalid number of channels: NotSupportedError
+ should(
+ () => context.createBuffer(99, 1, context.sampleRate),
+ 'context.createBuffer(99, 1, context.sampleRate)')
+ .throw('NotSupportedError');
+ should(
+ () => context.createBuffer(0, 1, context.sampleRate),
+ 'context.createBuffer(0, 1, context.sampleRate)')
+ .throw('NotSupportedError');
+ // Invalid sample rate: NotSupportedError
+ should(
+ () => context.createBuffer(1, 1, 1),
+ 'context.createBuffer(1, 1, 1)')
+ .throw('NotSupportedError');
+ should(
+ () => context.createBuffer(1, 1, 2999),
+ 'context.createBuffer(1, 1, 2999)')
+ .throw('NotSupportedError');
+ should(
+ () => context.createBuffer(1, 1, 384001),
+ 'context.createBuffer(1, 1, 384001)')
+ .throw('NotSupportedError');
+ should(
+ () => context.createBuffer(1, 1, 1e6),
+ 'context.createBuffer(1, 1, 1e6)')
+ .throw('NotSupportedError');
+ // Check valid values from crbug.com/344375
+ should(
+ () => context.createBuffer(1, 1, 3000),
+ 'context.createBuffer(1, 1, 3000)')
+ .notThrow();
+ should(
+ () => context.createBuffer(1, 1, 192000),
+ 'context.createBuffer(1, 1, 192000)')
+ .notThrow();
+ should(
+ () => context.createBuffer(1, 1, 384000),
+ 'context.createBuffer(1, 1, 384000)')
+ .notThrow();
+ // Invalid number of frames: NotSupportedError
+ should(
+ () => context.createBuffer(1, 0, context.sampleRate),
+ 'context.createBuffer(1, 0, context.sampleRate)')
+ .throw('NotSupportedError');
+ // 2-arg createBuffer not allowed.
+ should(
+ () => context.createBuffer(new ArrayBuffer(100), true),
+ 'context.createBuffer(new ArrayBuffer(100), true)')
+ .throw('TypeError');
+
+ task.done();
+ });
+
+ audit.define('createMediaElementSource', (task, should) => {
+ // Invalid sources (unspecified error)
+ should(
+ () => context.createMediaElementSource(null),
+ 'context.createMediaElementSource(null)')
+ .throw();
+ task.done();
+ });
+
+ audit.define('createMediaStreamSource', (task, should) => {
+ // Invalid sources (unspecified error)
+ should(
+ () => context.createMediaStreamSource(null),
+ 'context.createMediaStreamSource(null)')
+ .throw();
+
+ task.done();
+ });
+
+ audit.define('createScriptProcessor', (task, should) => {
+ // Invalid buffer size: IndexSizeError
+ should(
+ () => context.createScriptProcessor(1, 1, 1),
+ 'context.createScriptProcessor(1, 1, 1)')
+ .throw('IndexSizeError');
+ // Invalid number of inputs and outputs: IndexSizeError
+ should(
+ () => context.createScriptProcessor(4096, 100, 1),
+ 'context.createScriptProcessor(4096, 100, 1)')
+ .throw('IndexSizeError');
+ should(
+ () => context.createScriptProcessor(4096, 1, 100),
+ 'context.createScriptProcessor(4096, 1, 100)')
+ .throw('IndexSizeError');
+ should(
+ () => context.createScriptProcessor(),
+ 'context.createScriptProcessor()')
+ .notThrow();
+ should(
+ () => context.createScriptProcessor(0),
+ 'context.createScriptProcessor(0)')
+ .notThrow();
+
+ task.done();
+ });
+
+ audit.define('createChannelSplitter', (task, should) => {
+ // Invalid number of channels: IndexSizeError
+ should(
+ () => context.createChannelSplitter(0),
+ 'context.createChannelSplitter(0)')
+ .throw('IndexSizeError');
+ should(
+ () => context.createChannelSplitter(99),
+ 'context.createChannelSplitter(99)')
+ .throw('IndexSizeError');
+ should(
+ () => context.createChannelMerger(0),
+ 'context.createChannelMerger(0)')
+ .throw('IndexSizeError');
+
+ task.done();
+ });
+
+ audit.define('createChannelMerger', (task, should) => {
+ // Invalid number of channels: IndexSizeError
+ should(
+ () => context.createChannelMerger(99),
+ 'context.createChannelMerger(99)')
+ .throw('IndexSizeError');
+
+ task.done();
+ });
+
+ audit.define('createPeriodicWave', (task, should) => {
+ // Invalid real/imag arrays: IndexSizeError
+ should(
+ () => context.createPeriodicWave(null, null),
+ 'context.createPeriodicWave(null, null)')
+ .throw('TypeError');
+ should(
+ () => context.createPeriodicWave(new Float32Array(10), null),
+ 'context.createPeriodicWave(new Float32Array(10), null)')
+ .throw('TypeError');
+ // Verify that we can use large arrays with no limit. Roughly.
+ should(
+ () => context.createPeriodicWave(
+ new Float32Array(4100), new Float32Array(4100)),
+ 'context.createPeriodicWave(new Float32Array(4100), new Float32Array(4100))')
+ .notThrow();
+ should(
+ () => context.createPeriodicWave(
+ new Float32Array(8192), new Float32Array(8192)),
+ 'context.createPeriodicWave(new Float32Array(8192), new Float32Array(8192))')
+ .notThrow();
+ should(
+ () => context.createPeriodicWave(
+ new Float32Array(10000), new Float32Array(10000)),
+ 'context.createPeriodicWave(new Float32Array(10000), new Float32Array(10000))')
+ .notThrow();
+ // Real and imaginary arrays must have the same size: IndexSizeError
+ should(
+ () => context.createPeriodicWave(
+ new Float32Array(10), new Float32Array(7)),
+ 'context.createPeriodicWave(new Float32Array(10), new Float32Array(7))')
+ .throw('IndexSizeError');
+
+ task.done();
+ });
+
+ audit.define('createAnalyser', (task, should) => {
+ // Analysers
+ node = context.createAnalyser();
+ // Invalid fftSize: IndexSizeError
+ shouldThrowAndBeUnchanged(should, node, 'fftSize', '42');
+ shouldThrowAndBeUnchanged(should, node, 'fftSize', '16');
+ should(() => node.fftSize = 32768, 'AnalyserNode.fftSize = 32768')
+ .notThrow();
+ shouldThrowAndBeUnchanged(should, node, 'fftSize', '65536');
+
+ shouldThrowAndBeUnchanged(should, node, 'minDecibels', '-10');
+ shouldThrowAndBeUnchanged(should, node, 'maxDecibels', '-150');
+ shouldThrowAndBeUnchanged(should, node, 'minDecibels', '-30');
+ shouldThrowAndBeUnchanged(should, node, 'maxDecibels', '-100');
+
+ shouldThrowAndBeUnchanged(
+ should, node, 'smoothingTimeConstant', '-0.1');
+ shouldThrowAndBeUnchanged(should, node, 'smoothingTimeConstant', '1.5');
+
+ should(
+ () => node.getFloatFrequencyData(null),
+ 'AnalyserNode.getFloatFrequencyData(null)')
+ .throw();
+ should(
+ () => node.getByteFrequencyData(null),
+ node.constructor.name + '.getByteFrequencyData(null)')
+ .throw();
+ should(
+ () => node.getFloatTimeDomainData(null),
+ node.constructor.name + '.getFloatTimeDomainData(null)')
+ .throw();
+ should(
+ () => node.getByteTimeDomainData(null),
+ node.constructor.name + '.getByteTimeDomainData(null)')
+ .throw();
+
+ if (window.SharedArrayBuffer) {
+ should(
+ () => node.getFloatFrequencyData(
+ new Float32Array(new SharedArrayBuffer(16))),
+ 'AnalyserNode.getFloatFrequencyData(SharedArrayBuffer view)')
+ .throw();
+ should(
+ () => node.getByteFrequencyData(
+ new Uint8Array(new SharedArrayBuffer(16))),
+ node.constructor.name +
+ '.getByteFrequencyData(SharedArrayBuffer view)')
+ .throw();
+ should(
+ () => node.getFloatTimeDomainData(
+ new Float32Array(new SharedArrayBuffer(16))),
+ node.constructor.name +
+ '.getFloatTimeDomainData(SharedArrayBuffer view)')
+ .throw();
+ should(
+ () => node.getByteTimeDomainData(
+ new Uint8Array(new SharedArrayBuffer(16))),
+ node.constructor.name +
+ '.getByteTimeDomainData(SharedArrayBuffer view)')
+ .throw();
+ }
+
+ // AudioBuffers
+ node = context.createBuffer(1, 1, context.sampleRate);
+ // Invalid channel index: IndexSizeError
+ should(
+ () => node.getChannelData(2),
+ node.constructor.name + '.getChannelData(2)')
+ .throw();
+
+ task.done();
+ });
+
+ audit.define(
+ {
+ label: 'Init test nodes',
+ description: 'Create test nodes for the following tests'
+ },
+ (task, should) => {
+ should(() => {
+ node = context.createGain();
+ }, 'node = context.createGain()').notThrow();
+ should(() => {
+ node2 = context.createGain();
+ }, 'node2 = context.createGain()').notThrow();
+
+ task.done();
+ });
+
+ audit.define(
+ {label: 'connections', description: 'AudioNode connections'},
+ (task, should) => {
+
+ // AudioNode connections
+ // Invalid destination node (unspecified error)
+ should(() => node.connect(null, 0, 0), 'node.connect(null, 0, 0)')
+ .throw();
+ // Invalid input or output index: IndexSizeError
+ should(
+ () => node.connect(context.destination, 100, 0),
+ 'node.connect(context.destination, 100, 0)')
+ .throw('IndexSizeError');
+ should(
+ () => node.connect(context.destination, 0, 100),
+ 'node.connect(context.destination, 0, 100)')
+ .throw('IndexSizeError');
+ should(
+ () => node.connect(node2.gain, 100),
+ 'node.connect(node2.gain, 100)')
+ .throw('IndexSizeError');
+ should(() => node.disconnect(99), 'node.disconnect(99)')
+ .throw('IndexSizeError');
+ // Can't connect to a different context (unspecified error)
+ should(
+ () => node.connect(otherContext.destination),
+ 'node.connect(otherContext.destination)')
+ .throw();
+
+ task.done();
+ });
+
+ audit.define(
+ {
+ label: 'channel-stuff',
+ description: 'channelCount, channelCountMode, channelInterpretation'
+ },
+ (task, should) => {
+
+ // Invalid channel count: NotSupportedError
+ shouldThrowAndBeUnchanged(should, node, 'channelCount', '99');
+ // Invalid mode or interpretation (unspecified error)
+ currentMode = node.channelCountMode;
+ currentInterpretation = node.channelInterpretation;
+ should(
+ () => node.channelCountMode = 'fancy',
+ 'node.channelCountMode = "fancy"')
+ .notThrow();
+ should(node.channelCountMode, 'node.channelCountMode')
+ .beEqualTo(currentMode);
+ should(
+ () => node.channelInterpretation = mode,
+ 'node.channelInterpretation = mode')
+ .notThrow();
+ should(node.channelInterpretation, 'node.channelInterpretation')
+ .beEqualTo(currentInterpretation);
+ // Destination node channel count: should throw IndexSizeError on
+ // invalid channel count. shouldNotThrow() method cannot be used
+ // because the error message includes the number of channels, which
+ // can change depending on the actual attached hardware.
+ should(
+ () => context.destination.channelCount = 99,
+ 'context.destination.channelCount = 99')
+ .throw('IndexSizeError', {omitErrorMessage: true});
+
+ task.done();
+ });
+
+ audit.define('audioparam', (task, should) => {
+ // AudioParams
+ param = context.createGain().gain;
+ should(
+ () => param.setValueCurveAtTime(null, 0, 0),
+ 'param.setValueCurveAtTime(null, 0, 0)')
+ .throw();
+
+ // exponentialRampToValue should throw only for "zero" target values.
+ should(
+ () => node.gain.exponentialRampToValueAtTime(-1, 0.1),
+ 'node.gain.exponentialRampToValueAtTime(-1, 0.1)')
+ .notThrow();
+ should(
+ () => node.gain.exponentialRampToValueAtTime(0, 0.1),
+ 'node.gain.exponentialRampToValueAtTime(0, 0.1)')
+ .throw();
+ // 1e-100 is 0 when converted to a single precision float.
+ should(
+ () => node.gain.exponentialRampToValueAtTime(1e-100, 0.1),
+ 'node.gain.exponentialRampToValueAtTime(1e-100, 0.1)')
+ .throw();
+ // See crbug.com/459391.
+ // Math.pow(2, -149) = 1.401298464324817e-45 is the double-float value
+ // of the least positive single float number. We do it this way to make
+ // sure no round-off or conversion errors happen when reading
+ // 1.401298464324817e-45.
+ should(
+ () =>
+ node.gain.exponentialRampToValueAtTime(Math.pow(2, -149), 0.1),
+ 'node.gain.exponentialRampToValueAtTime(Math.pow(2, -149), 0.1)')
+ .notThrow();
+ // Math.pow(2, -150) = 7.006492321624085d-46 is the largest double float
+ // value such that conversion to a float produces 0. Any larger value
+ // would produce a non-zero value when converted to a single float.
+ should(
+ () =>
+ node.gain.exponentialRampToValueAtTime(Math.pow(2, -150), 0.1),
+ 'node.gain.exponentialRampToValueAtTime(Math.pow(2, -150), 0.1)')
+ .throw();
+
+ task.done();
+ });
+
+ audit.define('biquad', (task, should) => {
+ // BiquadFilterNode
+ node = context.createBiquadFilter();
+ should(
+ () => node.getFrequencyResponse(
+ new Float32Array(1), new Float32Array(1), new Float32Array(1)),
+ 'node.getFrequencyResponse(new Float32Array(1), new Float32Array(1), new Float32Array(1))')
+ .notThrow();
+ should(
+ () => node.getFrequencyResponse(
+ null, new Float32Array(1), new Float32Array(1)),
+ 'node.getFrequencyResponse(null, new Float32Array(1), new Float32Array(1))')
+ .throw();
+ should(
+ () => node.getFrequencyResponse(
+ new Float32Array(1), null, new Float32Array(1)),
+ 'node.getFrequencyResponse(new Float32Array(1), null, new Float32Array(1))')
+ .throw();
+ should(
+ () => node.getFrequencyResponse(
+ new Float32Array(1), new Float32Array(1), null),
+ 'node.getFrequencyResponse(new Float32Array(1), new Float32Array(1), null)')
+ .throw();
+
+ if (window.SharedArrayBuffer) {
+ let shared_view = new Float32Array(new SharedArrayBuffer(4));
+ let nonshared_view = new Float32Array(1);
+
+ should(
+ () => node.getFrequencyResponse(
+ shared_view, nonshared_view, nonshared_view),
+ 'node.getFrequencyResponse(shared_view, nonshared_view, nonshared_view)')
+ .throw();
+ should(
+ () => node.getFrequencyResponse(
+ nonshared_view, shared_view, nonshared_view),
+ 'node.getFrequencyResponse(nonshared_view, shared_view, nonshared_view)')
+ .throw();
+ should(
+ () => node.getFrequencyResponse(
+ nonshared_view, nonshared_view, shared_view),
+ 'node.getFrequencyResponse(nonshared_view, nonshared_view, shared_view)')
+ .throw();
+ }
+
+ task.done();
+ });
+
+ audit.define('offline-audio-context', (task, should) => {
+ // OfflineAudioContext
+ // Max supported channels
+ should(
+ () => new OfflineAudioContext(32, 100, context.sampleRate),
+ 'new OfflineAudioContext(32, 100, context.sampleRate)')
+ .notThrow();
+ // Invalid number of channels
+ should(
+ () => new OfflineAudioContext(0, 100, context.sampleRate),
+ 'new OfflineAudioContext(0, 100, context.sampleRate)')
+ .throw('NotSupportedError');
+ should(
+ () => new OfflineAudioContext(99, 100, context.sampleRate),
+ 'new OfflineAudioContext(99, 100, context.sampleRate)')
+ .throw('NotSupportedError');
+ // Invalid sample rate.
+ should(
+ () => new OfflineAudioContext(1, 100, 1),
+ 'new OfflineAudioContext(1, 100, 1)')
+ .throw('NotSupportedError');
+ should(
+ () => new OfflineAudioContext(1, 100, 1e6),
+ 'new OfflineAudioContext(1, 100, 1e6)')
+ .throw('NotSupportedError');
+ // Invalid frame length (crbug.com/351277)
+ should(
+ () => new OfflineAudioContext(1, -88200000000000, 44100),
+ 'new OfflineAudioContext(1, -88200000000000, 44100)')
+ .throw('NotSupportedError');
+ should(
+ () => new OfflineAudioContext(1, 0, 44100),
+ 'new OfflineAudioContext(1, 0, 44100)')
+ .throw('NotSupportedError');
+
+ task.done();
+ });
+
+ audit.define('waveshaper', (task, should) => {
+ // WaveShaper types
+ node = context.createWaveShaper();
+ currentOversample = node.oversample;
+ should(() => node.oversample = '9x', 'node.oversample = "9x"')
+ .notThrow();
+ should(node.oversample, 'node.oversample').beEqualTo(currentOversample);
+ should(() => node.curve = {}, 'node.curve = {}').throw();
+ should(
+ () => node.curve = new Float32Array(1),
+ 'node.curve = new Float32Array(1)')
+ .throw();
+ should(node.curve, 'node.curve').beEqualTo(null);
+ should(
+ () => node.curve = new Float32Array(2),
+ 'node.curve = new Float32Array(2)')
+ .notThrow();
+ should(() => node.curve = null, 'node.curve = null').notThrow();
+
+ task.done();
+ });
+
+ audit.define(
+ {
+ label: 'audio-buffer-source',
+ description: 'AudioBufferSource start/stop'
+ },
+ (task, should) => {
+ // Start/stop for AudioBufferSourceNodes
+ buffer = context.createBuffer(1, 1, context.sampleRate);
+ should(
+ () => source = context.createBufferSource(),
+ 'source = context.createBufferSource()')
+ .notThrow();
+ should(() => {source.buffer = buffer}, 'source.buffer = buffer')
+ .notThrow();
+ should(
+ () => source.buffer =
+ context.createBuffer(1, 10, context.sampleRate),
+ 'source.buffer = context.createBuffer(1, 10, context.sampleRate)')
+ .throw();
+ should(() => {source.start(-1)}, 'source.start(-1)').throw();
+ should(() => {source.start(Infinity)}, 'source.start(Infinity)')
+ .throw();
+ should(() => {source.start(-Infinity)}, 'source.start(-Infinity)')
+ .throw();
+ should(() => {source.start(NaN)}, 'source.start(NaN)').throw();
+ should(
+ () => {source.start(1, Infinity)}, 'source.start(1, Infinity)')
+ .throw();
+ should(
+ () => {source.start(1, -Infinity)},
+ 'source.start(1, -Infinity)')
+ .throw();
+ should(() => {source.start(1, NaN)}, 'source.start(1, NaN)')
+ .throw();
+ should(() => {source.start(1, -1)}, 'source.start(1, -1)').throw();
+ should(
+ () => {source.start(1, -Number.MIN_VALUE)},
+ 'source.start(1, -Number.MIN_VALUE)')
+ .throw();
+ should(
+ () => {source.start(1, 1, Infinity)},
+ 'source.start(1, 1, Infinity)')
+ .throw();
+ should(
+ () => {source.start(1, 1, -Infinity)},
+ 'source.start(1, 1, -Infinity)')
+ .throw();
+ should(() => {source.start(1, 1, NaN)}, 'source.start(1, 1, NaN)')
+ .throw();
+ should(() => {source.start(1, 1, -1)}, 'source.start(1, 1, -1)')
+ .throw();
+ should(
+ () => {source.start(1, 1, -Number.MIN_VALUE)},
+ 'source.start(1, 1, -Number.MIN_VALUE)')
+ .throw();
+ should(() => source.start(), 'source.start()').notThrow();
+ should(
+ () => source.stop(-Number.MIN_VALUE),
+ 'source.stop(-Number.MIN_VALUE)')
+ .throw();
+ should(() => source.stop(Infinity), 'source.stop(Infinity)')
+ .throw();
+ should(() => source.stop(-Infinity), 'source.stop(-Infinity)')
+ .throw();
+ should(() => source.stop(NaN), 'source.stop(NaN)').throw();
+ should(() => source.stop(), 'source.stop()').notThrow();
+
+ // Verify that start(0, 0) doesn't signal.
+ let source2;
+ should(
+ () => {source2 = context.createBufferSource()},
+ 'source2 = context.createBufferSource()')
+ .notThrow();
+ should(() => source2.buffer = buffer, 'source2.buffer = buffer')
+ .notThrow();
+ should(() => source2.start(0, 0), 'source2.start(0, 0)').notThrow();
+
+ // Verify that start(0, -0.0) doesn't signal.
+ let source3;
+ should(
+ () => source3 = context.createBufferSource(),
+ 'source3 = context.createBufferSource()')
+ .notThrow();
+ should(() => source3.buffer = buffer, 'source3.buffer = buffer')
+ .notThrow();
+ should(
+ () => source3.start(0, -1 / Infinity),
+ 'source3.start(0, -1/Infinity)')
+ .notThrow();
+
+ // It's not clear from the spec, but I think it's valid to call
+ // start(). The spec is silent on what happens if we call stop()
+ // afterwards, so don't call it.
+ let source4;
+ should(
+ () => source4 = context.createBufferSource(),
+ 'source4 = context.createBufferSource()')
+ .notThrow();
+ should(() => source4.start(), 'source4.start()').notThrow();
+
+ buffer = context.createBuffer(1, 1, context.sampleRate);
+ let source5;
+ should(
+ () => source5 = context.createBufferSource(),
+ 'source5 = context.createBufferSource()')
+ .notThrow();
+ should(() => source5.buffer = buffer, 'source5.buffer = buffer')
+ .notThrow();
+ should(() => source5.stop(), 'source5.stop()').throw();
+
+ buffer = context.createBuffer(1, 1, context.sampleRate);
+ let source6;
+ should(
+ () => source6 = context.createBufferSource(),
+ 'source6 = context.createBufferSource()')
+ .notThrow();
+ should(() => source6.buffer = buffer, 'source6.buffer = buffer')
+ .notThrow();
+ should(() => source6.start(), 'source6.start()').notThrow();
+ should(() => source6.start(), 'source6.start()').throw();
+
+ buffer = context.createBuffer(1, 1, context.sampleRate);
+ let source7;
+ should(
+ () => source7 = context.createBufferSource(),
+ 'source7 = context.createBufferSource()')
+ .notThrow();
+ should(() => source7.buffer = buffer, 'source7.buffer = buffer')
+ .notThrow();
+ should(() => source7.start(), 'source7.start()').notThrow();
+ should(() => source7.stop(), 'source7.stop()').notThrow();
+
+ task.done();
+ });
+
+ audit.define(
+ {label: 'oscillator', description: 'start/stop'}, (task, should) => {
+
+ let source8;
+ // Start/stop for OscillatorNodes
+ should(
+ () => source8 = context.createOscillator(),
+ 'source8 = context.createOscillator()')
+ .notThrow();
+ should(
+ () => source8.start(-Number.MIN_VALUE),
+ 'source8.start(-Number.MIN_VALUE)')
+ .throw();
+ should(() => source8.start(Infinity), 'source8.start(Infinity)')
+ .throw();
+ should(() => source8.start(-Infinity), 'source8.start(-Infinity)')
+ .throw();
+ should(() => source8.start(NaN), 'source8.start(NaN)').throw();
+ should(() => source8.start(), 'source8.start()').notThrow();
+ should(
+ () => source8.stop(-Number.MIN_VALUE),
+ 'source8.stop(-Number.MIN_VALUE)')
+ .throw();
+ should(() => source8.stop(Infinity), 'source8.stop(Infinity)')
+ .throw();
+ should(() => source8.stop(-Infinity), 'source8.stop(-Infinity)')
+ .throw();
+ should(() => source8.stop(NaN), 'source8.stop(NaN)').throw();
+ should(() => source8.stop(), 'source8.stop()').notThrow();
+
+ should(
+ () => osc = context.createOscillator(),
+ 'osc = context.createOscillator()')
+ .notThrow();
+ should(() => osc.stop(), 'osc.stop()').throw();
+ should(
+ () => osc1 = context.createOscillator(),
+ 'osc1 = context.createOscillator()')
+ .notThrow();
+ should(() => osc1.start(), 'osc1.start()').notThrow();
+ should(() => osc1.stop(), 'osc1.stop()').notThrow();
+
+ should(() => osc.setPeriodicWave(null), 'osc.setPeriodicWave(null)')
+ .throw();
+
+
+ task.done();
+ });
+
+ audit.define('convolver', (task, should) => {
+ // Convolver buffer rate must match context rate. Create on offline
+ // context so we specify the context rate exactly, in case the test is
+ // run on platforms with different HW sample rates.
+ should(
+ () => oc = new OfflineAudioContext(1, 44100, 44100),
+ 'oc = new OfflineAudioContext(1, 44100, 44100)')
+ .notThrow();
+ should(() => conv = oc.createConvolver(), 'conv = oc.createConvolver()')
+ .notThrow();
+ should(() => conv.buffer = {}, 'conv.buffer = {}').throw();
+ should(
+ () => conv.buffer = oc.createBuffer(1, 100, 22050),
+ 'conv.buffer = oc.createBuffer(1, 100, 22050)')
+ .throw();
+ // conv.buffer should be unchanged (null) because the above failed.
+ should(conv.buffer, 'conv.buffer').beEqualTo(null);
+
+ task.done();
+ });
+
+ audit.define('panner', (task, should) => {
+ // PannerNode channel count and mode
+ panner = context.createPanner();
+ // Channel count can only be set to 1 or 2.
+ should(() => panner.channelCount = 1, 'panner.channelCount = 1')
+ .notThrow();
+ should(() => panner.channelCount = 2, 'panner.channelCount = 2')
+ .notThrow();
+ shouldThrowAndBeUnchanged(should, panner, 'channelCount', 0);
+ shouldThrowAndBeUnchanged(should, panner, 'channelCount', 3);
+ // It is illegal to set the mode to 'max'
+ shouldThrowAndBeUnchanged(should, panner, 'channelCountMode', 'max');
+ should(
+ () => panner.channelCountMode = 'explicit',
+ 'panner.channelCountMode = "explicit"')
+ .notThrow();
+ should(
+ () => panner.channelCountMode = 'clamped-max',
+ 'panner.channelCountMode = "clamped-max"')
+ .notThrow();
+ should(
+ () => panner.channelCountMode = 'junk',
+ 'panner.channelCountMode = "junk"')
+ .notThrow();
+
+ task.done();
+ });
+
+ audit.define('script-processor', (task, should) => {
+ // Test channel count and mode for a ScriptProcessor.
+ should(
+ () => script = context.createScriptProcessor(256, 3),
+ 'script = context.createScriptProcessor(256, 3)')
+ .notThrow();
+ // Make sure the channelCount and mode are set correctly.
+ should(script.channelCount, 'script.channelCount').beEqualTo(3);
+ should(script.channelCountMode, 'script.channelCountMode')
+ .beEqualTo('explicit');
+ // Cannot change the channelCount or mode to anything else
+ should(() => script.channelCount = 3, 'script.channelCount = 3')
+ .notThrow();
+ shouldThrowAndBeUnchanged(should, script, 'channelCount', 1);
+
+ shouldThrowAndBeUnchanged(should, script, 'channelCount', 7);
+ should(
+ () => script.channelCountMode = 'explicit',
+ 'script.channelCountMode = "explicit"')
+ .notThrow();
+ shouldThrowAndBeUnchanged(should, script, 'channelCountMode', 'max');
+ shouldThrowAndBeUnchanged(
+ should, script, 'channelCountMode', 'clamped-max');
+ should(
+ () => script.channelCountMode = 'junk',
+ 'script.channelCountMode = "junk"')
+ .notThrow();
+
+ task.done();
+ });
+
+ audit.define(
+ {label: 'misc', description: 'Miscellaneous tests'},
+ (task, should) => {
+
+ // noteOn and noteOff don't exist anymore
+ should(osc.noteOn, 'osc.noteOn').beEqualTo(undefined);
+ should(osc.noteOff, 'osc.noteOff').beEqualTo(undefined);
+ should(source.noteOn, 'source.noteOn').beEqualTo(undefined);
+ should(source.noteOff, 'source.noteOff').beEqualTo(undefined);
+
+ task.done();
+ });
+
+ audit.run();
+ </script>
+ </body>
</html>

Powered by Google App Engine
This is Rietveld 408576698