| <!DOCTYPE html> | |
| <script> | |
| const service_worker_unregister = async scope => { | |
| const absoluteScope = new URL(scope, window.location).href; | |
| const registration = await navigator.serviceWorker.getRegistration(scope); | |
| if (registration && registration.scope === absoluteScope) { | |
| return registration.unregister(); | |
| } | |
| }; | |
| const service_worker_reregister = async (url, scope) => { | |
| if (!scope || scope.length == 0) { | |
| return Promise.reject(new Error('tests must define a scope')); | |
| } | |
| await service_worker_unregister(scope); | |
| return navigator.serviceWorker.register(url, {'scope': scope}); | |
| }; | |
| const wait_for_state_activated = worker => { | |
| if (worker.state === 'activated') | |
| return Promise.resolve(); | |
| if (worker.state === 'redundant') { | |
| return Promise.reject(new Error('worker is redundant')); | |
| } | |
| return new Promise(function(resolve) { | |
| worker.addEventListener('statechange', () => { | |
| if (worker.state === 'activated') { | |
| resolve(); | |
| } | |
| }); | |
| }); | |
| }; | |
| (async () => { | |
| const script = '/resource-timing/resources/sw.js'; | |
| const scope = '/resource-timing/resources/'; | |
| const registration = await service_worker_reregister(script, scope); | |
| await wait_for_state_activated(registration.installing); | |
| const opener = window.opener; | |
| if (!opener) { | |
| return; | |
| } | |
| opener.postMessage("installed", "*"); | |
| window.addEventListener("message", async e => { | |
| if (e.data === "unregister") { | |
| await registration.unregister(); | |
| opener.postMessage("unregistered", "*"); | |
| } | |
| }); | |
| })(); | |
| </script> |