| <!DOCTYPE html> |
| <title>Test the behaviour when start() is called on a node</title> |
| <script src='../../resources/testharness.js'></script> |
| <script src='../../resources/testharnessreport.js'></script> |
| <script> |
| function activateDocument(t) { |
| return new Promise((resolve, reject) => { |
| chrome.gpuBenchmarking.pointerActionSequence([ |
| { |
| source: 'mouse', |
| actions: [ |
| { name: 'pointerDown', x: 1, y: 1 }, |
| { name: 'pointerUp' }, |
| ], |
| } |
| ], t.step_func(resolve)); |
| }); |
| } |
| |
| function createNode(context) { |
| const oscillator = context.createOscillator(); |
| oscillator.connect(context.destination); |
| return oscillator; |
| } |
| |
| function setup(t) { |
| const autoplayIgnoresWebAudioEnabled = |
| internals.runtimeFlags.autoplayIgnoresWebAudioEnabled; |
| |
| internals.runtimeFlags.autoplayIgnoresWebAudioEnabled = false; |
| internals.settings.setAutoplayPolicy('document-user-activation-required'); |
| |
| t.add_cleanup(() => { |
| internals.runtimeFlags.autoplayIgnoresWebAudioEnabled = |
| autoplayIgnoresWebAudioEnabled; |
| internals.settings.setAutoplayPolicy('no-user-gesture-required'); |
| }); |
| } |
| |
| promise_test(t => { |
| setup(t); |
| |
| return new Promise((resolve) => { |
| const context = new AudioContext(); |
| assert_equals(context.state, 'suspended'); |
| |
| // Possibly, this wouldn't run before the end of the test even if it was |
| // failing. |
| context.addEventListener('statechange', t.unreached_func()); |
| |
| const node = createNode(context); |
| node.start(); |
| |
| assert_equals(context.state, 'suspended'); |
| |
| resolve(); |
| }); |
| }, 'Calling start() on a node on an unactivated document does not resume the context.'); |
| |
| promise_test(t => { |
| setup(t); |
| |
| return new Promise(async (resolve) => { |
| const context = new AudioContext(); |
| assert_equals(context.state, 'suspended'); |
| |
| const node = createNode(context); |
| |
| // resume() will be resolved when the playback will start. |
| context.resume().then(t.step_func(() => { |
| resolve(); |
| })); |
| |
| await activateDocument(t); |
| |
| node.start(); |
| }); |
| }, 'Calling start() on a node on an activated document is a no-op.'); |
| </script> |