| <!DOCTYPE html> |
| <title> |
| Web Bundle fetching and the inner resouirce fetching should skip service |
| worker |
| </title> |
| <link |
| rel="help" |
| href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md" |
| /> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="../resources/test-helpers.js"></script> |
| <body> |
| <script> |
| setup(() => { |
| assert_true(HTMLScriptElement.supports("webbundle")); |
| }); |
| |
| async function registerServiceWorkerAndReturnActiveWorker( |
| t, |
| script, |
| scope |
| ) { |
| const reg = await navigator.serviceWorker.register(script, { |
| scope: scope, |
| }); |
| t.add_cleanup(() => reg.unregister()); |
| if (reg.active) return reg.active; |
| const worker = reg.installing || reg.waiting; |
| await new Promise((resolve) => { |
| worker.addEventListener("statechange", (event) => { |
| if (event.target.state == "activated") resolve(); |
| }); |
| }); |
| return worker; |
| } |
| |
| async function getRequestedUrls(worker) { |
| return new Promise((resolve) => { |
| navigator.serviceWorker.addEventListener( |
| "message", |
| (e) => { |
| resolve(e.data); |
| }, |
| { once: true } |
| ); |
| worker.postMessage(null); |
| }); |
| } |
| |
| promise_test(async (t) => { |
| const iframe_path = "./resources/service-worker-controlled-iframe.html"; |
| const iframe_url = new URL(iframe_path, location).href; |
| |
| // Register a service worker. |
| const worker = await registerServiceWorkerAndReturnActiveWorker( |
| t, |
| "./resources/service-worker-for-request-monitor.js", |
| iframe_path |
| ); |
| |
| // Load an iframe which is controlled by the service worker. |
| const iframe = await new Promise((resolve) => { |
| const frame = document.createElement("iframe"); |
| t.add_cleanup(() => frame.remove()); |
| frame.src = iframe_url; |
| frame.onload = () => { |
| resolve(frame); |
| }; |
| document.body.appendChild(frame); |
| }); |
| // The iframe request should be intercepted by the service worker. |
| assert_array_equals(await getRequestedUrls(worker), [iframe_url]); |
| |
| // Add a web bundle element in the service worker controlled iframe. |
| const script_id = "uuid-in-package:020111b3-437a-4c5c-ae07-adb6bbffb720"; |
| |
| const element = createWebBundleElement( |
| "../../resources/wbn/uuid-in-package.wbn", |
| /*resources=*/ [script_id] |
| ); |
| |
| const element_load_promise = new Promise((resolve) => { |
| element.addEventListener("load", () => { |
| resolve(); |
| }); |
| }); |
| iframe.contentDocument.body.appendChild(element); |
| await element_load_promise; |
| // The web bundle request should not be intercepted by the service worker. |
| assert_array_equals(await getRequestedUrls(worker), []); |
| |
| // Add a uuid-in-package URL script element in the service worker |
| // controlled iframe. |
| const result_promise = new Promise((resolve) => { |
| // window.report_result() method will be called by the injected script. |
| iframe.contentWindow.report_result = resolve; |
| }); |
| const script = iframe.contentDocument.createElement("script"); |
| script.src = script_id; |
| iframe.contentDocument.body.appendChild(script); |
| assert_equals(await result_promise, "OK"); |
| // The urn uuld URL script request should not be intercepted by the |
| // service worker. |
| assert_array_equals(await getRequestedUrls(worker), []); |
| |
| }, "Both Web Bundle request and Subresource fetch requests inside the Web " + "Bundle should skip the service worker."); |
| </script> |
| </body> |