tor-browser

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

service-worker-controlled.https.tentative.html (3750B)


      1 <!DOCTYPE html>
      2 <title>
      3  Web Bundle fetching and the inner resouirce fetching should skip service
      4  worker
      5 </title>
      6 <link
      7  rel="help"
      8  href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md"
      9 />
     10 <script src="/resources/testharness.js"></script>
     11 <script src="/resources/testharnessreport.js"></script>
     12 <script src="../resources/test-helpers.js"></script>
     13 <body>
     14  <script>
     15    setup(() => {
     16      assert_true(HTMLScriptElement.supports("webbundle"));
     17    });
     18 
     19    async function registerServiceWorkerAndReturnActiveWorker(
     20      t,
     21      script,
     22      scope
     23    ) {
     24      const reg = await navigator.serviceWorker.register(script, {
     25        scope: scope,
     26      });
     27      t.add_cleanup(() => reg.unregister());
     28      if (reg.active) return reg.active;
     29      const worker = reg.installing || reg.waiting;
     30      await new Promise((resolve) => {
     31        worker.addEventListener("statechange", (event) => {
     32          if (event.target.state == "activated") resolve();
     33        });
     34      });
     35      return worker;
     36    }
     37 
     38    async function getRequestedUrls(worker) {
     39      return new Promise((resolve) => {
     40        navigator.serviceWorker.addEventListener(
     41          "message",
     42          (e) => {
     43            resolve(e.data);
     44          },
     45          { once: true }
     46        );
     47        worker.postMessage(null);
     48      });
     49    }
     50 
     51    promise_test(async (t) => {
     52      const iframe_path = "./resources/service-worker-controlled-iframe.html";
     53      const iframe_url = new URL(iframe_path, location).href;
     54 
     55      // Register a service worker.
     56      const worker = await registerServiceWorkerAndReturnActiveWorker(
     57        t,
     58        "./resources/service-worker-for-request-monitor.js",
     59        iframe_path
     60      );
     61 
     62      // Load an iframe which is controlled by the service worker.
     63      const iframe = await new Promise((resolve) => {
     64        const frame = document.createElement("iframe");
     65        t.add_cleanup(() => frame.remove());
     66        frame.src = iframe_url;
     67        frame.onload = () => {
     68          resolve(frame);
     69        };
     70        document.body.appendChild(frame);
     71      });
     72      // The iframe request should be intercepted by the service worker.
     73      assert_array_equals(await getRequestedUrls(worker), [iframe_url]);
     74 
     75      // Add a web bundle element in the service worker controlled iframe.
     76      const script_id = "uuid-in-package:020111b3-437a-4c5c-ae07-adb6bbffb720";
     77 
     78      const element = createWebBundleElement(
     79        "../../resources/wbn/uuid-in-package.wbn",
     80        /*resources=*/ [script_id]
     81      );
     82 
     83      const element_load_promise = new Promise((resolve) => {
     84        element.addEventListener("load", () => {
     85          resolve();
     86        });
     87      });
     88      iframe.contentDocument.body.appendChild(element);
     89      await element_load_promise;
     90      // The web bundle request should not be intercepted by the service worker.
     91      assert_array_equals(await getRequestedUrls(worker), []);
     92 
     93      // Add a uuid-in-package URL script element in the service worker
     94      // controlled iframe.
     95      const result_promise = new Promise((resolve) => {
     96        // window.report_result() method will be called by the injected script.
     97        iframe.contentWindow.report_result = resolve;
     98      });
     99      const script = iframe.contentDocument.createElement("script");
    100      script.src = script_id;
    101      iframe.contentDocument.body.appendChild(script);
    102      assert_equals(await result_promise, "OK");
    103      // The urn uuld URL script request should not be intercepted by the
    104      // service worker.
    105      assert_array_equals(await getRequestedUrls(worker), []);
    106 
    107    }, "Both Web Bundle request and Subresource fetch requests inside the Web " + "Bundle should skip the service worker.");
    108  </script>
    109 </body>