tor-browser

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

worker-client-id.https.html (2057B)


      1 <!DOCTYPE html>
      2 <title>Service Worker: Workers should have their own unique client Id</title>
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="resources/test-helpers.sub.js"></script>
      6 <body>
      7 <script>
      8 
      9 // Get the iframe client ID by calling postMessage() on its controlling
     10 // worker.  This will cause the service worker to post back the
     11 // MessageEvent.source.id value.
     12 function getFrameClientId(frame) {
     13  return new Promise(resolve => {
     14    let mc = new MessageChannel();
     15    frame.contentWindow.navigator.serviceWorker.controller.postMessage(
     16      'echo-client-id', [mc.port2]);
     17    mc.port1.onmessage = evt => {
     18      resolve(evt.data);
     19    };
     20  });
     21 }
     22 
     23 // Get the worker client ID by creating a worker that performs an intercepted
     24 // fetch().  The synthetic fetch() response will contain the FetchEvent.clientId
     25 // value.  This is then posted back to here.
     26 function getWorkerClientId(frame) {
     27  return new Promise(resolve => {
     28    let w = new frame.contentWindow.Worker('worker-echo-client-id.js');
     29    w.onmessage = evt => {
     30      resolve(evt.data);
     31    };
     32  });
     33 }
     34 
     35 promise_test(async function(t) {
     36  const script = './resources/worker-client-id-worker.js';
     37  const scope = './resources/worker-client-id';
     38  const frame = scope + '/frame.html';
     39 
     40  let reg = await navigator.serviceWorker.register(script, { scope });
     41  t.add_cleanup(async _ => await reg.unregister());
     42  await wait_for_state(t, reg.installing, 'activated');
     43 
     44  let f = await with_iframe(frame);
     45  t.add_cleanup(_ => f.remove());
     46 
     47  let frameClientId = await getFrameClientId(f);
     48  assert_not_equals(frameClientId, null, 'frame client id should exist');
     49 
     50  let workerClientId = await getWorkerClientId(f);
     51  assert_not_equals(workerClientId, null, 'worker client id should exist');
     52 
     53  assert_not_equals(frameClientId, workerClientId,
     54                    'frame and worker client ids should be different');
     55 }, 'Verify workers have a unique client id separate from their owning documents window');
     56 
     57 </script>
     58 </body>