Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE html>
<title>
Web Bundle fetching and the inner resouirce fetching should skip service
worker
</title>
<link
rel="help"
/>
<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>