tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

worker.html (2470B)


      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 
     10 promise_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 
     25 promise_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 
     36 promise_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>