blob: 3822312aaee7748aee467d0f56e4e9de37d7c545 [file] [log] [blame]
<html>
<head>
<title>Service Worker Fetch Modules Fragment of import.meta.url</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
const scope = "resources/module-meta-url-fragment.html";
let registration;
function withFrame(url)
{
return new Promise((resolve, reject) => {
let frame = document.createElement('iframe');
let counter = 0;
function next() {
if (++counter === 2)
resolve(frame);
}
window.addEventListener('message', function(ev) {
try {
if (ev.origin !== document.location.origin)
return;
let metaURLs = JSON.parse(ev.data);
assert_equals(metaURLs.length, 4);
// We are reusing Response#url from ServiceWorker directly without considering fragment propagation.
assert_equals(metaURLs[0], `https://localhost:9443/WebKit/service-workers/resources/module-meta-url.js#fragment`);
assert_equals(metaURLs[1], `https://localhost:9443/WebKit/service-workers/resources/module-meta-url.js#fragment`);
assert_equals(metaURLs[2], `https://localhost:9443/WebKit/service-workers/resources/module-meta-url.js#fragment`);
assert_equals(metaURLs[3], `https://localhost:9443/WebKit/service-workers/resources/module-meta-url.js#fragment`);
next();
} catch (error) {
reject(error);
}
}, false);
frame.onload = () => { next(); };
frame.src = url;
document.body.appendChild(frame);
});
}
async function registerServiceWorker(scope)
{
let registration = await navigator.serviceWorker.register("module-meta-url-fragment-worker.js", { scope : scope });
let activeWorker = registration.active;
if (activeWorker)
return;
activeWorker = registration.installing;
return new Promise(resolve => {
activeWorker.addEventListener('statechange', () => {
if (activeWorker.state === "activated")
resolve(registration);
});
});
}
promise_test(async (test) => {
registration = await registerServiceWorker(scope);
}, "Setup worker");
promise_test(async (test) => {
let frame = await withFrame(scope);
assert_true(frame.contentWindow.navigator.serviceWorker.controller !== null);
frame.remove();
}, "Frame to a registered scope");
promise_test(async (test) => {
registration.unregister();
}, "Clean-up");
</script>
</body>
</html>