blob: 10d8e70f161de28dcccc956cfc602d4e222dacaa [file] [log] [blame]
let serviceWorkerHasReceivedState = false;
let worker = null;
let remainingAttempts = 1000; // We try for 10 seconds before timing out.
navigator.serviceWorker.addEventListener("message", async function(event) {
if (!serviceWorkerHasReceivedState) {
if (!event.data) {
log("FAIL: service worker did not receive the state");
finishSWTest();
return;
}
serviceWorkerHasReceivedState = true;
log("* Simulating Service Worker process crash");
await testRunner.terminateServiceWorkers();
handle = setInterval(function() {
remainingAttempts--;
if (!remainingAttempts) {
log("FAIL: service worker did not respond after process termination");
clearInterval(handle);
finishSWTest();
return;
}
worker.postMessage("HasState");
}, 10);
return;
}
// Worker still has the state, it was not terminated yet.
if (event.data === serviceWorkerHasReceivedState)
return;
log("PASS: service worker lost the state and responded the postMessage after process termination");
clearInterval(handle);
finishSWTest();
});
async function doTest()
{
if (window.testRunner) {
testRunner.setUseSeparateServiceWorkerProcess(true);
await fetch("").then(() => { }, () => { });
}
navigator.serviceWorker.register("resources/postmessage-after-sw-process-crash-worker.js", { }).then(function(registration) {
worker = registration.installing;
log("* Sending State to Service Worker");
worker.postMessage("SetState");
log("* Asking Service Worker if it received the state");
worker.postMessage("HasState");
});
}
doTest();