tor-browser

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

stream-safe-creation.any.js (2195B)


      1 // META: global=window,worker
      2 
      3 // These tests verify that stream creation is not affected by changes to
      4 // Object.prototype.
      5 
      6 const creationCases = {
      7  fetch: async () => fetch(location.href),
      8  request: () => new Request(location.href, {method: 'POST', body: 'hi'}),
      9  response: () => new Response('bye'),
     10  consumeEmptyResponse: () => new Response().text(),
     11  consumeNonEmptyResponse: () => new Response(new Uint8Array([64])).text(),
     12  consumeEmptyRequest: () => new Request(location.href).text(),
     13  consumeNonEmptyRequest: () => new Request(location.href,
     14                                            {method: 'POST', body: 'yes'}).arrayBuffer(),
     15 };
     16 
     17 for (const creationCase of Object.keys(creationCases)) {
     18  for (const accessorName of ['start', 'type', 'size', 'highWaterMark']) {
     19    promise_test(async t => {
     20      Object.defineProperty(Object.prototype, accessorName, {
     21        get() { throw Error(`Object.prototype.${accessorName} was accessed`); },
     22        configurable: true
     23      });
     24      t.add_cleanup(() => {
     25        delete Object.prototype[accessorName];
     26        return Promise.resolve();
     27      });
     28      await creationCases[creationCase]();
     29    }, `throwing Object.prototype.${accessorName} accessor should not affect ` +
     30       `stream creation by '${creationCase}'`);
     31 
     32    promise_test(async t => {
     33      // -1 is a convenient value which is invalid, and should cause the
     34      // constructor to throw, for all four fields.
     35      Object.prototype[accessorName] = -1;
     36      t.add_cleanup(() => {
     37        delete Object.prototype[accessorName];
     38        return Promise.resolve();
     39      });
     40      await creationCases[creationCase]();
     41    }, `Object.prototype.${accessorName} accessor returning invalid value ` +
     42       `should not affect stream creation by '${creationCase}'`);
     43  }
     44 
     45  promise_test(async t => {
     46    Object.prototype.start = controller => controller.error(new Error('start'));
     47      t.add_cleanup(() => {
     48        delete Object.prototype.start;
     49        return Promise.resolve();
     50      });
     51      await creationCases[creationCase]();
     52    }, `Object.prototype.start function which errors the stream should not ` +
     53       `affect stream creation by '${creationCase}'`);
     54 }