| <!DOCTYPE html> |
| <html> |
| <head> |
| <title> |
| Test micro task checkpoints in AudioWorkletGlobalScope |
| </title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/webaudio/resources/audit.js"></script> |
| <meta charset=utf-8> |
| </head> |
| <body> |
| <script id="layout-test-code"> |
| promise_test(async () => { |
| const context = new AudioContext(); |
| |
| let filePath = 'processors/promise-processor.js'; |
| |
| await context.audioWorklet.addModule(filePath); |
| await context.suspend(); |
| let node1 = new AudioWorkletNode(context, 'promise-processor'); |
| let node2 = new AudioWorkletNode(context, 'promise-processor'); |
| |
| // Connecting to the destination is not strictly necessary in theory, |
| // but see |
| // https://bugs.chromium.org/p/chromium/issues/detail?id=1045926 |
| // for why it is in practice. |
| node1.connect(node2).connect(context.destination); |
| |
| await context.resume(); |
| |
| // The second node is the one that is going to receive the message, |
| // per spec: it is the second that will be processed, each time. |
| const e = await new Promise((resolve) => { |
| node2.port.onmessage = resolve; |
| }); |
| context.close(); |
| assert_equals(e.data, "ok", |
| `Microtask checkpoints are performed |
| in between render quantum`); |
| }, "test"); |
| </script> |
| </body> |
| </html> |