tor-browser

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

workers.https.html (4839B)


      1 <!DOCTYPE html>
      2 <title>Construction of Web Workers is deferred</title>
      3 <meta name="timeout" content="long">
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src="/common/utils.js"></script>
      7 <script src="/common/dispatcher/dispatcher.js"></script>
      8 <script src="../resources/utils.js"></script>
      9 <script src="resources/utils.js"></script>
     10 
     11 <body>
     12 <script>
     13 setup(() => assertSpeculationRulesIsSupported());
     14 
     15 promise_test(async t => {
     16  const {exec, activate} = await create_prerendered_page(t);
     17  const workerURL = new URL('resources/worker-post-timeOrigin.js', location.href).toString();
     18  await exec(workerURL => {
     19    window.worker = new Worker(workerURL);
     20    window.waitForWorker = new Promise(resolve => worker.addEventListener('message', e => {
     21        resolve({
     22          prerendering: document.prerendering,
     23          activationStart: performance.getEntriesByType('navigation')[0].activationStart,
     24          workerLoad: performance.getEntriesByName(workerURL)[0].startTime,
     25          workerStart: e.data});
     26    }), workerURL);
     27  }, [workerURL]);
     28 
     29  // We want to prevent false success by waiting for enough time to make sure the worker is not
     30  // yet initialized
     31  await new Promise(resolve => t.step_timeout(resolve, 500));
     32  await activate();
     33  const {workerStart, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker);
     34  assert_false(prerendering, "DedicatedWorker should be suspended until activated");
     35  assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed");
     36  assert_greater_than(workerStart, activationStart, "Starting the worker should be delayed");
     37 }, "Dedicated workers should be loaded in suspended state until activated");
     38 
     39 promise_test(async t => {
     40  const {exec, activate} = await create_prerendered_page(t);
     41  const workerURL = new URL(`resources/shared-worker.py?id=${token()}`, location.href).toString();
     42  await exec(workerURL => {
     43    window.worker = new SharedWorker(workerURL, 'dummy');
     44    window.worker.port.start();
     45    window.waitForSharedWorkerLoadingReport =
     46      fetch(workerURL + "&check=true")
     47        .then(r => t.text())
     48        .then(text => text === 'ok' && document.prerendering);
     49    window.waitForWorker = new Promise(resolve => worker.port.addEventListener('message', e => {
     50        resolve({
     51          prerendering: document.prerendering,
     52          activationStart: performance.getEntriesByType('navigation')[0].activationStart,
     53          workerLoad: performance.getEntriesByName(workerURL)[0]?.startTime,
     54          workerStart: e.data});
     55    }), workerURL);
     56  }, [workerURL]);
     57 
     58  await new Promise(resolve => t.step_timeout(resolve, 300));
     59  await activate();
     60  const {workerStart, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker);
     61  assert_false(prerendering, "SharedWorker should be suspended until activated");
     62  assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed");
     63  assert_greater_than(workerStart, activationStart, "Starting the worker should be delayed");
     64 }, "Shared workers should be loaded in suspended state until activated");
     65 
     66 promise_test(async t => {
     67  const {exec, activate} = await create_prerendered_page(t);
     68  const workerURL = new URL(`resources/shared-worker.py?id=${token()}`, location.href).toString();
     69  const workerStartTime1 = await new Promise(resolve => {
     70    const worker = new SharedWorker(workerURL, 'worker');
     71    worker.port.start();
     72    worker.port.addEventListener('message', e => resolve(e.data));
     73  });
     74 
     75  await exec(workerURL => {
     76    window.worker = new SharedWorker(workerURL, 'worker');
     77    window.worker.port.start();
     78    window.waitForWorker = new Promise(resolve => worker.port.addEventListener('message', e => {
     79        resolve({
     80          prerendering: document.prerendering,
     81          activationStart: performance.getEntriesByType('navigation')[0].activationStart,
     82          workerLoad: performance.getEntriesByName(workerURL)[0]?.startTime,
     83          workerStartTime2: e.data});
     84    }), workerURL);
     85  }, [workerURL]);
     86 
     87  await new Promise(resolve => t.step_timeout(resolve, 300));
     88  await activate();
     89  const {workerStartTime2, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker);
     90  assert_true(prerendering, "An existing SharedWorker should be accessible while prerendering");
     91  assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed");
     92  assert_equals(workerStartTime1, workerStartTime2, "The prerendered page should connect to the existing worker");
     93  assert_greater_than(activationStart, workerStartTime2, "Starting the worker should be done before activation");
     94 }, "Existing shared workers should be accessible before activation");
     95 </script>