tor-browser

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

service-worker-unregister.https.html (2437B)


      1 <!doctype html>
      2 <meta name="timeout" content="long">
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="/common/utils.js"></script>
      6 <script src="/common/dispatcher/dispatcher.js"></script>
      7 <script src="resources/helper.sub.js"></script>
      8 <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
      9 <script>
     10 // When a service worker is unregistered when a controlled page is in BFCache,
     11 // the page can be still restored from BFCache and remain controlled by the
     12 // service worker.
     13 promise_test(async t => {
     14  // Register a service worker and make this page controlled.
     15  const workerUrl =
     16      'resources/service-worker.js?pipe=header(Service-Worker-Allowed,../)';
     17  const registration =
     18      await service_worker_unregister_and_register(t, workerUrl, './');
     19  t.add_cleanup(_ => registration.unregister());
     20  await wait_for_state(t, registration.installing, 'activated');
     21  const controllerChanged = new Promise(
     22      resolve => navigator.serviceWorker.oncontrollerchange = resolve);
     23  await claim(t, registration.active);
     24  await controllerChanged;
     25 
     26  const pageA = new RemoteContext(token());
     27  const pageB = new RemoteContext(token());
     28 
     29  const urlA = location.origin + executorPath + pageA.context_id;
     30  const urlB = originCrossSite + executorPath + pageB.context_id;
     31 
     32  // Open `urlA`.
     33  window.open(urlA, '_blank', 'noopener');
     34  await pageA.execute_script(waitForPageShow);
     35 
     36  assert_true(
     37    await pageA.execute_script(
     38        () => (navigator.serviceWorker.controller !== null)),
     39    'pageA should be controlled before navigation');
     40 
     41  // Navigate to `urlB`.
     42  await pageA.execute_script(
     43    (url) => prepareNavigation(() => {
     44      location.href = url;
     45    }),
     46    [urlB]);
     47  await pageB.execute_script(waitForPageShow);
     48 
     49  // Unregister the service worker when the controlled `pageA` is in BFCache.
     50  await registration.unregister();
     51 
     52  // Back navigate and check whether the page is restored from BFCache.
     53  await pageB.execute_script(
     54    () => {
     55      prepareNavigation(() => { history.back(); });
     56    }
     57  );
     58  await pageA.execute_script(waitForPageShow);
     59  await assert_not_bfcached(pageA);
     60 
     61  assert_true(
     62    await pageA.execute_script(
     63        () => (navigator.serviceWorker.controller === null)),
     64    'pageA should not be controlled');
     65 
     66 }, 'Unregister service worker while a controlled page is in BFCache');
     67 </script>