tor-browser

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

construct-byob-request.any.js (1889B)


      1 // META: global=window,worker,shadowrealm
      2 // META: script=../resources/rs-utils.js
      3 'use strict';
      4 
      5 // Prior to whatwg/stream#870 it was possible to construct a ReadableStreamBYOBRequest directly. This made it possible
      6 // to construct requests that were out-of-sync with the state of the ReadableStream. They could then be used to call
      7 // internal operations, resulting in asserts or bad behaviour. This file contains regression tests for the change.
      8 
      9 function getRealByteStreamController() {
     10  let controller;
     11  new ReadableStream({
     12    start(c) {
     13      controller = c;
     14    },
     15    type: 'bytes'
     16  });
     17  return controller;
     18 }
     19 
     20 // Create an object pretending to have prototype |prototype|, of type |type|. |type| is one of "undefined", "null",
     21 // "fake", or "real". "real" will call the realObjectCreator function to get a real instance of the object.
     22 function createDummyObject(prototype, type, realObjectCreator) {
     23  switch (type) {
     24    case 'undefined':
     25      return undefined;
     26 
     27    case 'null':
     28      return null;
     29 
     30    case 'fake':
     31      return Object.create(prototype);
     32 
     33    case 'real':
     34      return realObjectCreator();
     35  }
     36 
     37  throw new Error('not reached');
     38 }
     39 
     40 const dummyTypes = ['undefined', 'null', 'fake', 'real'];
     41 
     42 for (const controllerType of dummyTypes) {
     43  const controller = createDummyObject(ReadableByteStreamController.prototype, controllerType,
     44                                        getRealByteStreamController);
     45  for (const viewType of dummyTypes) {
     46    const view = createDummyObject(Uint8Array.prototype, viewType, () => new Uint8Array(16));
     47    test(() => {
     48      assert_throws_js(TypeError, () => new ReadableStreamBYOBRequest(controller, view),
     49                        'constructor should throw');
     50    }, `ReadableStreamBYOBRequest constructor should throw when passed a ${controllerType} ` +
     51        `ReadableByteStreamController and a ${viewType} view`);
     52  }
     53 }