tor-browser

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

service-worker-client-postmessage.https.html (2582B)


      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  await storeClients(t, registration.active);
     42 
     43  // Navigate to `urlB`.
     44  await pageA.execute_script(
     45    (url) => prepareNavigation(() => {
     46      location.href = url;
     47    }),
     48    [urlB]);
     49  await pageB.execute_script(waitForPageShow);
     50 
     51  // Posting a message to a client should evict it from the bfcache.
     52  await postMessageToStoredClients(t, registration.active);
     53 
     54  // Back navigate and check whether the page is restored from BFCache.
     55  await pageB.execute_script(
     56    () => {
     57      prepareNavigation(() => { history.back(); });
     58    }
     59  );
     60  await pageA.execute_script(waitForPageShow);
     61  await assert_not_bfcached(pageA);
     62 
     63  await pageA.execute_script(() => navigator.serviceWorker.ready);
     64 
     65  assert_true(
     66    await pageA.execute_script(
     67        () => (navigator.serviceWorker.controller !== null)),
     68    'pageA should be controlled after history navigation');
     69 
     70 }, 'Client.postMessage while a controlled page is in BFCache');
     71 </script>