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