tor-browser

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

cross-partition-worker-creation.https.html (4503B)


      1 <!DOCTYPE html>
      2 <meta charset=utf-8>
      3 <meta name="timeout" content="long">
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src="/common/get-host-info.sub.js"></script>
      7 <script src="/common/utils.js"></script>
      8 <script src="/common/dispatcher/dispatcher.js"></script>
      9 <!-- Pull in executor_path needed by newPopup / newIframe -->
     10 <script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script>
     11 <!-- Pull in importScript / newPopup / newIframe -->
     12 <script src="/html/anonymous-iframe/resources/common.js"></script>
     13 <script src="resources/common.js"></script>
     14 <body>
     15 <script>
     16 
     17 const create_worker_unsuccessful = "Worker creation failed.";
     18 const create_worker_successful = "Worker creation succeeded.";
     19 
     20 const can_create_blob_url_shared_worker_js = (blob_url, response_queue_name) => `
     21  const worker = new SharedWorker("${blob_url}");
     22  worker.onerror = (e) => {
     23    send("${response_queue_name}", "${create_worker_unsuccessful}");
     24  };
     25  worker.port.onmessage = (e) => {
     26    send("${response_queue_name}", "${create_worker_successful}");
     27  };
     28 `;
     29 
     30 // Tests cross-partition Shared Worker creation from blob URL.
     31 promise_test(t => {
     32  return new Promise(async (resolve, reject) => {
     33    try {
     34      const response_queue_uuid = token();
     35 
     36      const [cross_site_iframe_uuid, same_site_iframe_uuid] =
     37        await create_test_iframes(t, response_queue_uuid);
     38 
     39      const worker_js = `
     40        onconnect = function(e) {
     41          e.ports[0].postMessage('ping');
     42          self.close();
     43        };
     44      `;
     45 
     46      const blob = new Blob([worker_js], {type : "text/javascript"});
     47      const blob_url = window.URL.createObjectURL(blob);
     48      t.add_cleanup(() => window.URL.revokeObjectURL(blob_url));
     49 
     50      // Create a shared worker in the cross-top-level-site iframe.
     51      await send(cross_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid));
     52      const response_1 = await receive(response_queue_uuid);
     53      if (response_1 !== create_worker_unsuccessful) {
     54        reject(`Shared worker was created in not-same-top-level-site iframe`);
     55      }
     56 
     57      // Create a shared worker in the same-top-level-site iframe.
     58      await send(same_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid));
     59      const response_2 = await receive(response_queue_uuid);
     60      if (response_2 !== create_worker_successful) {
     61        reject(`Shared worker wasn't created in same-top-level-site iframe`);
     62      }
     63 
     64      resolve();
     65    } catch (e) {
     66      reject(e);
     67    }
     68  });
     69 }, "Cross-partition Shared worker shouldn't be created from blob URL.");
     70 
     71 const can_create_blob_url_dedicated_worker_js = (blob_url, response_queue_name) => `
     72  const worker = new Worker("${blob_url}");
     73  worker.onerror = (e) => {
     74    send("${response_queue_name}", "${create_worker_unsuccessful}");
     75  };
     76  worker.onmessage = (e) => {
     77    send("${response_queue_name}", "${create_worker_successful}");
     78    worker.terminate();
     79  };
     80 `;
     81 
     82 // Tests cross-partition Dedicated Worker creation from blob URL.
     83 promise_test(t => {
     84  return new Promise(async (resolve, reject) => {
     85    try {
     86      const response_queue_uuid = token();
     87 
     88      const [cross_site_iframe_uuid, same_site_iframe_uuid] =
     89        await create_test_iframes(t, response_queue_uuid);
     90 
     91      const blob = new Blob(["postMessage('ping');"], {type : "text/javascript"});
     92      const blob_url = window.URL.createObjectURL(blob);
     93      t.add_cleanup(() => window.URL.revokeObjectURL(blob_url));
     94 
     95      // Create a dedicated worker in the cross-top-level-site iframe.
     96      await send(cross_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid));
     97      const response_1 = await receive(response_queue_uuid);
     98      if (response_1 !== create_worker_unsuccessful) {
     99        reject(`Dedicated worker was created in not-same-top-level-site iframe`);
    100      }
    101 
    102      // Create a dedicated worker in the same-top-level-site iframe.
    103      await send(same_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid));
    104      const response_2 = await receive(response_queue_uuid);
    105      if (response_2 !== create_worker_successful) {
    106        reject(`Dedicated worker wasn't created in same-top-level-site iframe`);
    107      }
    108 
    109      resolve();
    110    } catch (e) {
    111      reject(e);
    112    }
    113  });
    114 }, "Cross-partition Dedicated worker shouldn't be created from blob URL.");
    115 
    116 </script>
    117 </body>