1<!DOCTYPE html> 2<meta charset="utf-8"> 3<script src="/resources/testharness.js"></script> 4<script src="/resources/testharnessreport.js"></script> 5<script src="resources/helpers.js"></script> 6<script src="../resources/test-utils.js"></script> 7<script> 8'use strict'; 9 10promise_test(t => { 11 const orig = createOriginalReadableStream(); 12 const w = new Worker('resources/receiving-worker.js'); 13 t.add_cleanup(() => { 14 w.terminate(); 15 }); 16 const promise = new Promise((resolve, reject) => { 17 checkTestResults(w).then(resolve, reject); 18 w.onerror = () => reject('error in worker'); 19 }); 20 w.postMessage(orig, [orig]); 21 assert_true(orig.locked, 'the original stream should be locked'); 22 return promise; 23}, 'worker.postMessage should be able to transfer a ReadableStream'); 24 25promise_test(t => { 26 const w = new Worker('resources/sending-worker.js'); 27 t.add_cleanup(() => { 28 w.terminate(); 29 }); 30 return new Promise((resolve, reject) => { 31 testMessageEvent(w).then(resolve, reject); 32 w.onerror = () => reject('error in worker'); 33 }); 34}, 'postMessage in a worker should be able to transfer a ReadableStream'); 35 36promise_test(async t => { 37 const w = new Worker('resources/echo-worker.js'); 38 let controller; 39 const orig = new ReadableStream({ 40 start(c) { 41 controller = c; 42 } 43 }); 44 const targetStream = await new Promise((resolve, reject) => { 45 w.onmessage = evt => resolve(evt.data); 46 w.onerror = () => reject('error in worker'); 47 w.postMessage(orig, [orig]); 48 }); 49 const reader = targetStream.getReader(); 50 const reads = []; 51 // Place a lot of chunks "in transit". This should increase the likelihood 52 // that they is a chunk at each relevant step when the worker is terminated. 53 for (let i = 0; i < 50; ++i) { 54 await delay(0); 55 controller.enqueue(i); 56 const expected = i; 57 reads.push(reader.read().then(({value, done}) => { 58 assert_false(done, 'we should not be done'); 59 assert_equals(value, expected, 'value should match expectation'); 60 })); 61 } 62 w.terminate(); 63 for (let i = 50; i < 60; ++i) { 64 controller.enqueue(i); 65 reads.push( 66 reader.read().then(t.unreached_func('read() should not resolve'))); 67 await delay(0); 68 } 69 // We don't expect every read() to complete, but we want to give them a chance 70 // to reject if they're going to. 71 return Promise.race([ 72 Promise.all(reads), 73 flushAsyncEvents() 74 ]); 75}, 'terminating a worker should not error the stream'); 76</script> 77