tor-browser

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

shared-worker-from-blob-url.window.js (2508B)


      1 function message_from_port(port) {
      2  return new Promise(resolve => {
      3    port.onmessage = e => resolve(e.data);
      4  });
      5 }
      6 
      7 promise_test(async t => {
      8  const run_result = 'worker_OK_';
      9  const blob_contents =
     10    'self.counter = 0; self.onconnect = e => {++self.counter;' +
     11    'e.source.postMessage("' + run_result + '" + self.counter); };';
     12  const blob = new Blob([blob_contents]);
     13  const url = URL.createObjectURL(blob);
     14 
     15  const worker1 = new SharedWorker(url);
     16  const reply1 = await message_from_port(worker1.port);
     17  assert_equals(reply1, run_result + '1');
     18  const worker2 = new SharedWorker(url);
     19  const reply2 = await message_from_port(worker2.port);
     20  assert_equals(reply2, run_result + '2');
     21 }, 'Creating a shared worker from a blob URL works.');
     22 
     23 promise_test(async t => {
     24  const run_result = 'worker_OK';
     25  const blob_contents =
     26    'self.onconnect = e => { e.source.postMessage("' + run_result + '"); };';
     27  const blob = new Blob([blob_contents]);
     28  const url = URL.createObjectURL(blob);
     29 
     30  const worker = new SharedWorker(url);
     31  URL.revokeObjectURL(url);
     32 
     33  const reply = await message_from_port(worker.port);
     34  assert_equals(reply, run_result);
     35 }, 'Creating a shared worker from a blob URL works immediately before revoking.');
     36 
     37 promise_test(async t => {
     38  const run_result = 'worker_OK_';
     39  const blob_contents =
     40    'self.counter = 0; self.onconnect = e => {++self.counter;' +
     41    'e.source.postMessage("' + run_result + '" + self.counter); };';
     42  const blob = new Blob([blob_contents]);
     43  const url = URL.createObjectURL(blob);
     44 
     45  const worker1 = new SharedWorker(url);
     46  URL.revokeObjectURL(url);
     47 
     48  const reply1 = await message_from_port(worker1.port);
     49  assert_equals(reply1, run_result + '1');
     50  const worker2 = new SharedWorker(url);
     51  const reply2 = await message_from_port(worker2.port);
     52  assert_equals(reply2, run_result + '2');
     53 }, 'Connecting to a shared worker on a revoked blob URL works.');
     54 
     55 promise_test(async t => {
     56  const run_result = false;
     57  const blob_contents = `
     58 let constructedRequest = false;
     59 try {
     60  new Request("./file.js");
     61  constructedRequest = true;
     62 } catch (e) {}
     63 self.postMessage(constructedRequest);
     64 `;
     65  const blob = new Blob([blob_contents]);
     66  const url = URL.createObjectURL(blob);
     67 
     68  const worker = new SharedWorker(url);
     69  const reply = await message_from_port(worker);
     70  assert_equals(reply, run_result, "Should not be able to resolve request with relative file path in blob");
     71 }, 'Blob URLs should not resolve relative to document base URL.');