Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android' OR true
- Manifest: dom/serviceworkers/test/chrome-dFPI.toml includes dom/serviceworkers/test/chrome-common.toml
- Manifest: dom/serviceworkers/test/chrome.toml includes dom/serviceworkers/test/chrome-common.toml
<?xml version="1.0"?>
<!--
Any copyright is dedicated to the Public Domain.
-->
<window title="Test for ServiceWorkerInfo"
onload="test();">
<script type="application/javascript" src="chrome_helpers.js"/>
<script type="application/javascript">
<![CDATA[
let IFRAME_URL = EXAMPLE_URL + "serviceworkerinfo_iframe.html";
function wait_for_active_worker(registration) {
ok(registration, "Registration is valid.");
return new Promise(function(res, rej) {
if (registration.activeWorker) {
res(registration);
return;
}
let listener = {
onChange() {
if (registration.activeWorker) {
registration.removeListener(listener);
res(registration);
}
}
}
registration.addListener(listener);
});
}
function test() {
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({'set': [
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.idle_extended_timeout", 1000000],
["dom.serviceWorkers.idle_timeout", 0],
["dom.serviceWorkers.testing.enabled", true],
]}, function () {
(async function() {
let iframe = $("iframe");
let promise = new Promise(function (resolve) {
iframe.onload = function () {
resolve();
};
});
iframe.src = IFRAME_URL;
await promise;
info("Check that a service worker eventually shuts down.");
promise = Promise.all([
waitForRegister(EXAMPLE_URL),
waitForServiceWorkerShutdown()
]);
iframe.contentWindow.postMessage("register", "*");
let [registration] = await promise;
// Make sure the worker is active.
registration = await wait_for_active_worker(registration);
let activeWorker = registration.activeWorker;
ok(activeWorker !== null, "Worker is not active!");
ok(activeWorker.debugger === null);
info("Attach a debugger to the service worker, and check that the " +
"service worker is restarted.");
activeWorker.attachDebugger();
let workerDebugger = activeWorker.debugger;
ok(workerDebugger !== null);
// Verify debugger properties
ok(workerDebugger.principal instanceof Ci.nsIPrincipal);
is(workerDebugger.url, EXAMPLE_URL + "worker.js");
info("Verify that getRegistrationByPrincipal return the same " +
"nsIServiceWorkerRegistrationInfo");
let reg = swm.getRegistrationByPrincipal(workerDebugger.principal,
workerDebugger.url);
is(reg, registration);
info("Check that getWorkerByID returns the same nsIWorkerDebugger");
is(activeWorker, reg.getWorkerByID(workerDebugger.serviceWorkerID));
info("Detach the debugger from the service worker, and check that " +
"the service worker eventually shuts down again.");
promise = waitForServiceWorkerShutdown();
activeWorker.detachDebugger();
await promise;
ok(activeWorker.debugger === null);
promise = waitForUnregister(EXAMPLE_URL);
iframe.contentWindow.postMessage("unregister", "*");
registration = await promise;
SimpleTest.finish();
})();
});
}
]]>
</script>
<p id="display"></p>
<div id="content" style="display:none;"></div>
<pre id="test"></pre>
<iframe id="iframe"></iframe>
</body>
<label id="test-result"/>
</window>