sw-install.html (1550B)
1 <!DOCTYPE html> 2 <script> 3 const service_worker_unregister = async scope => { 4 const absoluteScope = new URL(scope, window.location).href; 5 const registration = await navigator.serviceWorker.getRegistration(scope); 6 if (registration && registration.scope === absoluteScope) { 7 return registration.unregister(); 8 } 9 }; 10 11 const service_worker_reregister = async (url, scope) => { 12 if (!scope || scope.length == 0) { 13 return Promise.reject(new Error('tests must define a scope')); 14 } 15 16 await service_worker_unregister(scope); 17 return navigator.serviceWorker.register(url, {'scope': scope}); 18 }; 19 20 const wait_for_state_activated = worker => { 21 if (worker.state === 'activated') 22 return Promise.resolve(); 23 24 if (worker.state === 'redundant') { 25 return Promise.reject(new Error('worker is redundant')); 26 } 27 28 return new Promise(function(resolve) { 29 worker.addEventListener('statechange', () => { 30 if (worker.state === 'activated') { 31 resolve(); 32 } 33 }); 34 }); 35 }; 36 37 (async () => { 38 const script = '/resource-timing/resources/sw.js'; 39 const scope = '/resource-timing/resources/'; 40 const registration = await service_worker_reregister(script, scope); 41 await wait_for_state_activated(registration.installing); 42 43 const opener = window.opener; 44 if (!opener) { 45 return; 46 } 47 48 opener.postMessage("installed", "*"); 49 window.addEventListener("message", async e => { 50 if (e.data === "unregister") { 51 await registration.unregister(); 52 opener.postMessage("unregistered", "*"); 53 } 54 }); 55 56 })(); 57 58 </script>