Source code
Revision control
Copy as Markdown
Other Tools
<!DOCTYPE html>
<html>
<head>
<title>browser_toolbox_options_enable_serviceworkers_testing.html</title>
<meta charset="UTF-8">
</head>
<body>
<h1>SW-test</h1>
<script>
function register() {
return Promise.resolve().then(function() {
// While ServiceWorkerContainer.register() returns a promise, it's
// still wrapped with a .then() because navigator.serviceWorker is not
// defined in insecure contexts unless service worker testing is
// enabled, so dereferencing it would throw a ReferenceError (which
// is then caught in the .catch() clause).
return window.navigator.serviceWorker.register("serviceworker.js");
}).then(() => {
return {success: true};
}).catch(() => {
return {success: false};
});
}
function unregister() {
return Promise.resolve().then(function() {
return window.navigator.serviceWorker.getRegistration();
}).then(registration => {
return registration.unregister().then(result => {
return {success: !!result};
});
}).catch(_ => {
return {success: false};
});
}
function iframeRegisterAndUnregister() {
var frame = window.document.createElement("iframe");
var promise = new Promise(function(resolve) {
frame.addEventListener("load", function() {
Promise.resolve().then(_ => {
return frame.contentWindow.navigator.serviceWorker.register("serviceworker.js");
}).then(swr => {
return swr.unregister();
}).then(_ => {
frame.remove();
resolve({success: true});
}).catch(() => {
resolve({success: false});
});
}, {once: true});
});
frame.src = "browser_toolbox_options_enabled_serviceworkers_testing.html";
window.document.body.appendChild(frame);
return promise;
}
async function workerRegisterAndUnregister() {
const { promise, resolve } = Promise.withResolvers();
const worker = new Worker(URL.createObjectURL(new Blob([`
onmessage = async (ev) => {
try {
const swr = await navigator.serviceWorker.register(ev.data);
await swr.unregister();
postMessage({ success: true });
} catch (err) {
postMessage({ success: err.message });
}
}
`])));
worker.addEventListener("message", ev => resolve(ev.data), { once: true });
// (A blob worker can't use relative URLs)
worker.postMessage(new URL("serviceworker.js", location.href).toString());
return promise;
}
async function windowOpenAndDeleteCache() {
try {
const cacheName = "devtools-enable-sw";
await caches.open(cacheName);
const success = await caches.delete(cacheName);
return { success };
} catch (err) {
return { success: err.message };
}
}
async function workerOpenAndDeleteCache() {
const { promise, resolve } = Promise.withResolvers();
const worker = new Worker(URL.createObjectURL(new Blob([`
onmessage = async (ev) => {
try {
const cacheName = "devtools-enable-sw";
await caches.open(cacheName);
const success = await caches.delete(cacheName);
postMessage({ success });
} catch (err) {
postMessage({ success: err.message });
}
}
`])));
worker.addEventListener("message", ev => resolve(ev.data), { once: true });
worker.postMessage("start");
return promise;
}
window.addEventListener("message", function(event) {
var response;
switch (event.data) {
case "devtools:sw-test:register": {
response = register();
break;
}
case "devtools:sw-test:unregister": {
response = unregister();
break;
}
case "devtools:sw-test:iframe:register-and-unregister": {
response = iframeRegisterAndUnregister();
break;
}
case "devtools:sw-test:worker:register-and-unregister": {
response = workerRegisterAndUnregister();
break;
}
case "devtools:cache-test:window:open-and-delete": {
response = windowOpenAndDeleteCache();
break;
}
case "devtools:cache-test:worker:open-and-delete": {
response = workerOpenAndDeleteCache();
break;
}
}
response.then(data => {
event.ports[0].postMessage(data);
event.ports[0].close();
});
});
</script>
</body>
</html>