| <!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> |