tor-browser

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

clients-matchall-blob-url-worker.https.html (2782B)


      1 <!DOCTYPE html>
      2 <title>Service Worker: Clients.matchAll with a blob URL worker client</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 <script>
      7 const SCRIPT = 'resources/clients-matchall-worker.js';
      8 
      9 promise_test(async (t) => {
     10  const scope = 'resources/clients-matchall-blob-url-worker.html';
     11 
     12  const reg = await service_worker_unregister_and_register(t, SCRIPT, scope);
     13  t.add_cleanup(_ => reg.unregister());
     14  await wait_for_state(t, reg.installing, 'activated');
     15 
     16  const frame = await with_iframe(scope);
     17  t.add_cleanup(_ => frame.remove());
     18 
     19  {
     20    const message = await frame.contentWindow.waitForWorker();
     21    assert_equals(message.data, 'Worker is ready.',
     22                  'Worker should reply to the message.');
     23  }
     24 
     25  const channel = new MessageChannel();
     26  const message = await new Promise(resolve => {
     27    channel.port1.onmessage = resolve;
     28    frame.contentWindow.navigator.serviceWorker.controller.postMessage(
     29      {port: channel.port2, options: {type: 'worker'}}, [channel.port2]);
     30  });
     31 
     32  checkMessageEvent(message);
     33 
     34 }, 'Test Clients.matchAll() with a blob URL worker client.');
     35 
     36 promise_test(async (t) => {
     37  const scope = 'resources/blank.html';
     38 
     39  const reg = await service_worker_unregister_and_register(t, SCRIPT, scope);
     40  t.add_cleanup(_ => reg.unregister());
     41  await wait_for_state(t, reg.installing, 'activated');
     42 
     43  const workerScript = `
     44    self.onmessage = (e) => {
     45      self.postMessage("Worker is ready.");
     46    };
     47  `;
     48  const blob = new Blob([workerScript], { type: 'text/javascript' });
     49  const blobUrl = URL.createObjectURL(blob);
     50  const worker = new Worker(blobUrl);
     51 
     52  {
     53    const message = await new Promise(resolve => {
     54      worker.onmessage = resolve;
     55      worker.postMessage("Ping to worker.");
     56    });
     57    assert_equals(message.data, 'Worker is ready.',
     58                  'Worker should reply to the message.');
     59  }
     60 
     61  const channel = new MessageChannel();
     62  const message = await new Promise(resolve => {
     63    channel.port1.onmessage = resolve;
     64    reg.active.postMessage(
     65      {port: channel.port2,
     66       options: {includeUncontrolled: true, type: 'worker'}},
     67      [channel.port2]
     68    );
     69  });
     70 
     71  checkMessageEvent(message);
     72 
     73 }, 'Test Clients.matchAll() with an uncontrolled blob URL worker client.');
     74 
     75 function checkMessageEvent(e) {
     76  assert_equals(e.data.length, 1);
     77 
     78  const workerClient = e.data[0];
     79  assert_equals(workerClient[0], undefined); // visibilityState
     80  assert_equals(workerClient[1], undefined); // focused
     81  assert_true(workerClient[2].includes('blob:')); // url
     82  assert_equals(workerClient[3], 'worker'); // type
     83  assert_equals(workerClient[4], 'none'); // frameType
     84 }
     85 </script>