mirror of
https://github.com/servo/servo.git
synced 2025-06-27 02:23:41 +01:00
138 lines
4.8 KiB
HTML
138 lines
4.8 KiB
HTML
<!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 frame_id = "uuid-in-package:429fcc4e-0696-4bad-b099-ee9175f023ae";
|
|
const script_id = "uuid-in-package:020111b3-437a-4c5c-ae07-adb6bbffb720";
|
|
|
|
const element = createWebBundleElement(
|
|
"../../resources/wbn/uuid-in-package.wbn",
|
|
/*resources=*/ [frame_id, 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), []);
|
|
|
|
// Add a uuid-in-package URL iframe element in the service worker controlled
|
|
// iframe.
|
|
const inner_iframe = iframe.contentDocument.createElement("iframe");
|
|
inner_iframe.src = frame_id;
|
|
const load_promise = new Promise((resolve) => {
|
|
inner_iframe.addEventListener("load", () => {
|
|
resolve();
|
|
});
|
|
});
|
|
iframe.contentDocument.body.appendChild(inner_iframe);
|
|
await load_promise;
|
|
// The urn uuld URL iframe request should not intercepted by the service
|
|
// worker.
|
|
assert_array_equals(await getRequestedUrls(worker), []);
|
|
|
|
// Check if the uuid-in-package URL iframe element is loaded correctly.
|
|
const message_promise = new Promise((resolve) => {
|
|
window.addEventListener(
|
|
"message",
|
|
(e) => {
|
|
resolve(e.data);
|
|
},
|
|
{ once: true }
|
|
);
|
|
});
|
|
// location.href is evaluated in the uuid-in-package URL iframe element.
|
|
inner_iframe.contentWindow.postMessage("location.href", "*");
|
|
assert_equals(await message_promise, frame_id);
|
|
}, "Both Web Bundle request and Subresource fetch requests inside the Web " + "Bundle should skip the service worker.");
|
|
</script>
|
|
</body>
|