| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="resources/helpers.js"></script> | |
| <script src="../resources/test-utils.js"></script> | |
| <script> | |
| 'use strict'; | |
| promise_test(t => { | |
| const orig = createOriginalReadableStream(); | |
| const w = new Worker('resources/receiving-worker.js'); | |
| t.add_cleanup(() => { | |
| w.terminate(); | |
| }); | |
| const promise = new Promise((resolve, reject) => { | |
| checkTestResults(w).then(resolve, reject); | |
| w.onerror = () => reject('error in worker'); | |
| }); | |
| w.postMessage(orig, [orig]); | |
| assert_true(orig.locked, 'the original stream should be locked'); | |
| return promise; | |
| }, 'worker.postMessage should be able to transfer a ReadableStream'); | |
| promise_test(t => { | |
| const w = new Worker('resources/sending-worker.js'); | |
| t.add_cleanup(() => { | |
| w.terminate(); | |
| }); | |
| return new Promise((resolve, reject) => { | |
| testMessageEvent(w).then(resolve, reject); | |
| w.onerror = () => reject('error in worker'); | |
| }); | |
| }, 'postMessage in a worker should be able to transfer a ReadableStream'); | |
| promise_test(async t => { | |
| const w = new Worker('resources/echo-worker.js'); | |
| let controller; | |
| const orig = new ReadableStream({ | |
| start(c) { | |
| controller = c; | |
| } | |
| }); | |
| const targetStream = await new Promise((resolve, reject) => { | |
| w.onmessage = evt => resolve(evt.data); | |
| w.onerror = () => reject('error in worker'); | |
| w.postMessage(orig, [orig]); | |
| }); | |
| const reader = targetStream.getReader(); | |
| const reads = []; | |
| // Place a lot of chunks "in transit". This should increase the likelihood | |
| // that they is a chunk at each relevant step when the worker is terminated. | |
| for (let i = 0; i < 50; ++i) { | |
| await delay(0); | |
| controller.enqueue(i); | |
| const expected = i; | |
| reads.push(reader.read().then(({value, done}) => { | |
| assert_false(done, 'we should not be done'); | |
| assert_equals(value, expected, 'value should match expectation'); | |
| })); | |
| } | |
| w.terminate(); | |
| for (let i = 50; i < 60; ++i) { | |
| controller.enqueue(i); | |
| reads.push( | |
| reader.read().then(t.unreached_func('read() should not resolve'))); | |
| await delay(0); | |
| } | |
| // We don't expect every read() to complete, but we want to give them a chance | |
| // to reject if they're going to. | |
| return Promise.race([ | |
| Promise.all(reads), | |
| flushAsyncEvents() | |
| ]); | |
| }, 'terminating a worker should not error the stream'); | |
| </script> |