tor-browser

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

transform-stream.html (3939B)


      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/test-utils.js"></script>
      6 <script>
      7 'use strict';
      8 
      9 promise_test(t => {
     10  const orig = new TransformStream();
     11  const promise = new Promise(resolve => {
     12    addEventListener('message', t.step_func(evt => {
     13      const transferred = evt.data;
     14      assert_equals(transferred.constructor, TransformStream,
     15                    'transferred should be a TransformStream in this realm');
     16      assert_true(transferred instanceof TransformStream,
     17                  'instanceof check should pass');
     18 
     19      // Perform a brand-check on |transferred|.
     20      const readableGetter = Object.getOwnPropertyDescriptor(
     21        TransformStream.prototype, 'readable').get;
     22      assert_true(readableGetter.call(transferred) instanceof ReadableStream,
     23                 'brand check should pass and readable stream should result');
     24      const writableGetter = Object.getOwnPropertyDescriptor(
     25        TransformStream.prototype, 'writable').get;
     26      assert_true(writableGetter.call(transferred) instanceof WritableStream,
     27                 'brand check should pass and writable stream should result');
     28      resolve();
     29    }), {once: true});
     30  });
     31  postMessage(orig, '*', [orig]);
     32  assert_true(orig.readable.locked, 'the readable side should be locked');
     33  assert_true(orig.writable.locked, 'the writable side should be locked');
     34  return promise;
     35 }, 'window.postMessage should be able to transfer a TransformStream');
     36 
     37 test(() => {
     38  const ts = new TransformStream();
     39  const writer = ts.writable.getWriter();
     40  assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]),
     41                    'postMessage should throw');
     42  assert_false(ts.readable.locked, 'readable side should not get locked');
     43 }, 'a TransformStream with a locked writable should not be transferable');
     44 
     45 test(() => {
     46  const ts = new TransformStream();
     47  const reader = ts.readable.getReader();
     48  assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]),
     49                    'postMessage should throw');
     50  assert_false(ts.writable.locked, 'writable side should not get locked');
     51 }, 'a TransformStream with a locked readable should not be transferable');
     52 
     53 test(() => {
     54  const ts = new TransformStream();
     55  const reader = ts.readable.getReader();
     56  const writer = ts.writable.getWriter();
     57  assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]),
     58                    'postMessage should throw');
     59 }, 'a TransformStream with both sides locked should not be transferable');
     60 
     61 promise_test(t => {
     62  const source = new ReadableStream({
     63    start(controller) {
     64      controller.enqueue('hello ');
     65      controller.enqueue('there ');
     66      controller.close();
     67    }
     68  });
     69  let resolve;
     70  const ready = new Promise(r => resolve = r);
     71  let result = '';
     72  const sink = new WritableStream({
     73    write(chunk) {
     74      if (result) {
     75        resolve();
     76      }
     77      result += chunk;
     78    }
     79  });
     80  const transform1 = new TransformStream({
     81    transform(chunk, controller) {
     82      controller.enqueue(chunk.toUpperCase());
     83    }
     84  });
     85  const transform2 = new TransformStream({
     86    transform(chunk, controller) {
     87      controller.enqueue(chunk + chunk);
     88    }
     89  });
     90  const promise = new Promise(resolve => {
     91    addEventListener('message', t.step_func(evt => {
     92      const data = evt.data;
     93      resolve(data.source
     94                .pipeThrough(data.transform1)
     95                .pipeThrough(data.transform2)
     96                .pipeTo(data.sink));
     97    }));
     98  });
     99  postMessage({source, sink, transform1, transform2}, '*',
    100              [source, transform1, sink, transform2]);
    101  return ready
    102    .then(() => {
    103      assert_equals(result, 'HELLO HELLO THERE THERE ',
    104                    'transforms should have been applied');
    105    });
    106 }, 'piping through transferred transforms should work');
    107 
    108 </script>