| /** |
| * AudioWorkletProcessor intended for hosting a ShadowRealm and running a test |
| * inside of that ShadowRealm. |
| */ |
| globalThis.TestRunner = class TestRunner extends AudioWorkletProcessor { |
| constructor() { |
| super(); |
| this.createShadowRealmAndStartTests(); |
| } |
| |
| /** |
| * Fetch adaptor function intended as a drop-in replacement for fetchAdaptor() |
| * (see testharness-shadowrealm-outer.js), but it does not assume fetch() is |
| * present in the realm. Instead, it relies on setupFakeFetchOverMessagePort() |
| * having been called on the port on the other side of this.port's channel. |
| */ |
| fetchOverPortExecutor(resource) { |
| return (resolve, reject) => { |
| const listener = (event) => { |
| if (typeof event.data !== "string" || !event.data.startsWith("fetchResult::")) { |
| return; |
| } |
| |
| const result = event.data.slice("fetchResult::".length); |
| if (result.startsWith("success::")) { |
| resolve(result.slice("success::".length)); |
| } else { |
| reject(result.slice("fail::".length)); |
| } |
| |
| this.port.removeEventListener("message", listener); |
| } |
| this.port.addEventListener("message", listener); |
| this.port.start(); |
| this.port.postMessage(`fetchRequest::${resource}`); |
| } |
| } |
| |
| /** |
| * Async method, which is patched over in |
| * (test).any.audioworklet-shadowrealm.js; see serve.py |
| */ |
| async createShadowRealmAndStartTests() { |
| throw new Error("Forgot to overwrite this method!"); |
| } |
| |
| /** Overrides AudioWorkletProcessor.prototype.process() */ |
| process() { |
| return false; |
| } |
| }; |
| registerProcessor("test-runner", TestRunner); |