function message_from_port(port) { return new Promise(resolve => { port.onmessage = e => resolve(e.data); }); } promise_test(async t => { const run_result = 'worker_OK_'; const blob_contents = 'self.counter = 0; self.onconnect = e => {++self.counter;' + 'e.source.postMessage("' + run_result + '" + self.counter); };'; const blob = new Blob([blob_contents]); const url = URL.createObjectURL(blob); const worker1 = new SharedWorker(url); const reply1 = await message_from_port(worker1.port); assert_equals(reply1, run_result + '1'); const worker2 = new SharedWorker(url); const reply2 = await message_from_port(worker2.port); assert_equals(reply2, run_result + '2'); }, 'Creating a shared worker from a blob URL works.'); promise_test(async t => { const run_result = 'worker_OK'; const blob_contents = 'self.onconnect = e => { e.source.postMessage("' + run_result + '"); };'; const blob = new Blob([blob_contents]); const url = URL.createObjectURL(blob); const worker = new SharedWorker(url); URL.revokeObjectURL(url); const reply = await message_from_port(worker.port); assert_equals(reply, run_result); }, 'Creating a shared worker from a blob URL works immediately before revoking.'); promise_test(async t => { const run_result = 'worker_OK_'; const blob_contents = 'self.counter = 0; self.onconnect = e => {++self.counter;' + 'e.source.postMessage("' + run_result + '" + self.counter); };'; const blob = new Blob([blob_contents]); const url = URL.createObjectURL(blob); const worker1 = new SharedWorker(url); URL.revokeObjectURL(url); const reply1 = await message_from_port(worker1.port); assert_equals(reply1, run_result + '1'); const worker2 = new SharedWorker(url); const reply2 = await message_from_port(worker2.port); assert_equals(reply2, run_result + '2'); }, 'Connecting to a shared worker on a revoked blob URL works.');