tor-browser

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

service-worker-clients-matchall.https.html (3064B)


      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 promise_test(async t => {
     11  // Register a service worker and make this page controlled.
     12  const workerUrl =
     13      'resources/service-worker.js?pipe=header(Service-Worker-Allowed,../)';
     14  const registration =
     15      await service_worker_unregister_and_register(t, workerUrl, './');
     16  t.add_cleanup(_ => registration.unregister());
     17  await wait_for_state(t, registration.installing, 'activated');
     18  const controllerChanged = new Promise(
     19      resolve => navigator.serviceWorker.oncontrollerchange = resolve);
     20  await claim(t, registration.active);
     21  await controllerChanged;
     22 
     23  const pageA = new RemoteContext(token());
     24  const pageB = new RemoteContext(token());
     25 
     26  const urlA = location.origin + executorPath + pageA.context_id;
     27  const urlB = originCrossSite + executorPath + pageB.context_id;
     28 
     29  // Open `urlA`.
     30  window.open(urlA, '_blank', 'noopener');
     31  await pageA.execute_script(waitForPageShow);
     32 
     33  // Get Clients.matchAll() and check whether `pageA` is controlled.
     34  // Actual `assert_*()` is called after `assert_bfcached()` below.
     35  const clients1 = await (await fetch('/get-clients-matchall')).json();
     36  const controlled1 = await pageA.execute_script(
     37      () => (navigator.serviceWorker.controller !== null));
     38 
     39  // Navigate to `urlB` and get Clients.matchAll() when `urlA` is in BFCache.
     40  await pageA.execute_script(
     41    (url) => prepareNavigation(() => {
     42      location.href = url;
     43    }),
     44    [urlB]);
     45  await pageB.execute_script(waitForPageShow);
     46  const clients2 = await (await fetch('/get-clients-matchall')).json();
     47 
     48  // Back navigate and check whether the page is restored from BFCache.
     49  await pageB.execute_script(
     50    () => {
     51      prepareNavigation(() => { history.back(); });
     52    }
     53  );
     54  await pageA.execute_script(waitForPageShow);
     55  await assert_bfcached(pageA);
     56 
     57  // Get Clients.matchAll() and check whether `pageA` is controlled.
     58  const clients3 = await (await fetch('/get-clients-matchall')).json();
     59  const controlled3 = await pageA.execute_script(
     60      () => (navigator.serviceWorker.controller !== null));
     61 
     62  // Clients.matchAll() should not list `urlA` when it is in BFCache.
     63  assert_true(clients1.indexOf(urlA) >= 0,
     64      '1: matchAll() before navigation');
     65  assert_true(clients2.indexOf(urlA) < 0,
     66      '2: matchAll() before back navigation');
     67  assert_true(clients3.indexOf(urlA) >= 0,
     68      '3: matchAll() after back navigation');
     69 
     70  // `pageA` should be controlled before/after BFCached.
     71  assert_true(controlled1,
     72    'pageA should be controlled before BFCached');
     73  assert_true(controlled3,
     74    'pageA should be controlled after restored');
     75 }, 'Clients.matchAll() should not list pages in BFCache');
     76 </script>