| <!DOCTYPE html> |
| <html> |
| <head> |
| <title> |
| Test statechange event |
| </title> |
| <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script src="../resources/audit-util.js"></script> |
| <script src="../resources/audit.js"></script> |
| </head> |
| <body> |
| <script id="layout-test-code"> |
| let audit = Audit.createTaskRunner(); |
| let secondsToRender = 2; |
| let sampleRate = 48000; |
| |
| let stateChangeCount = 0; |
| let context; |
| let contextState; |
| |
| function checkStateChange(e, should) { |
| contextState = e.currentTarget.state; |
| |
| switch (stateChangeCount) { |
| case 0: |
| should(contextState, 'context.state').beEqualTo('running'); |
| break; |
| case 1: |
| should(contextState, 'context.state').beEqualTo('closed'); |
| break; |
| default: |
| should(stateChangeCount, 'Number of state changes') |
| .beLessThanOrEqualTo(2) |
| } |
| ++stateChangeCount; |
| } |
| |
| function finalCheck(should) { |
| // Final check that we got the right number of state changes and the |
| // correct final state. |
| should(stateChangeCount, 'stateChangeCount').beEqualTo(2); |
| should(context.state, 'After rendering context.state') |
| .beEqualTo('closed'); |
| } |
| |
| audit.define( |
| {label: 'test', description: 'Signaling of statechange event'}, |
| (task, should) => { |
| // Create an offline context with a source passing through a |
| // convolver. The convolver is just to waste some time. |
| context = new OfflineAudioContext( |
| 1, secondsToRender * sampleRate, sampleRate); |
| let buffer = createImpulseBuffer(context, sampleRate); |
| let source = context.createBufferSource(); |
| let conv = context.createConvolver(); |
| |
| source.buffer = buffer; |
| conv.normalize = false; |
| conv.buffer = buffer; |
| |
| source.connect(conv); |
| conv.connect(context.destination); |
| |
| source.start(); |
| |
| context.onstatechange = (event) => checkStateChange(event, should); |
| |
| should(context.startRendering(), 'Context rendering').beResolved(); |
| |
| // Don't want to set an oncomplete for the context and don't want to |
| // use the promise because the order of the state change event and |
| // resolving the promise is not specified. Thus, just wait for a |
| // bit and then finish the test. We assume the offline context runs |
| // faster than realtime. |
| setTimeout(() => { |
| finalCheck(should); |
| task.done(); |
| }, secondsToRender * 1000); |
| }); |
| |
| audit.run(); |
| </script> |
| </body> |
| </html> |