tor-browser

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

windowclient-navigate.https.html (2479B)


      1 <!DOCTYPE html>
      2 <title>WindowClient.navigate() for prerendered main page</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/get-host-info.sub.js"></script>
      7 <script src="/common/utils.js"></script>
      8 <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
      9 <script src="../resources/utils.js"></script>
     10 <script src="resources/utils.js"></script>
     11 
     12 <body>
     13 <script>
     14 setup(() => assertSpeculationRulesIsSupported());
     15 
     16 const uid = token();
     17 
     18 const PAGE_URL = `resources/prerendered-page.html?uid=${uid}`;
     19 const WORKER_URL = `resources/windowclient-navigate-worker.js?uid=${uid}`;
     20 const SAME_ORIGIN_DESTINATION =
     21    get_host_info()['HTTPS_ORIGIN'] + base_path() + 'resources/empty.html';
     22 
     23 promise_test(async t => {
     24  const registration =
     25    await service_worker_unregister_and_register(t, WORKER_URL, PAGE_URL);
     26  t.add_cleanup(() => registration.unregister());
     27  await wait_for_state(t, get_newest_worker(registration), 'activated');
     28 
     29  const readyChannel = new PrerenderChannel('prerender-channel', uid);
     30  t.add_cleanup(_ => readyChannel.close());
     31 
     32  const readyPromise = new Promise(resolve => {
     33    readyChannel.addEventListener('message', e => {
     34      resolve(e.data);
     35    }, {
     36      once: true
     37    });
     38  });
     39 
     40  startPrerendering(PAGE_URL);
     41 
     42  const prerenderResult = await readyPromise;
     43  assert_equals(prerenderResult, 'prerender success',
     44                'should succeed to prerender a page');
     45 
     46  const resultChannel = new PrerenderChannel('test-channel', uid);
     47  t.add_cleanup(_ => resultChannel.close());
     48 
     49  const navigationPromise = new Promise(resolve => {
     50    resultChannel.addEventListener('message', e => {
     51      resolve(e.data);
     52    }, {
     53      once: true
     54    });
     55  });
     56 
     57  // Asks the service worker to navigate the prerendered page to `navigationUrl`
     58  // via `WindowClient.navigate(url)`.
     59  const bc = new PrerenderChannel('navigation-channel', uid);
     60  bc.postMessage(JSON.stringify({
     61    navigationUrl: SAME_ORIGIN_DESTINATION,
     62    clientUrl: new URL(PAGE_URL, window.location).toString(),
     63    respondTo: 'test-channel',
     64  }));
     65  bc.close();
     66 
     67  const navigationResult = await navigationPromise;
     68  assert_equals(navigationResult, 'navigate() failed with TypeError',
     69      'should fail the navigation with TypeError');
     70 }, 'WindowClient.navigate() for a prerendered main page should throw a' +
     71   'TypeError');
     72 </script>