page_download_canceled.html (1879B)
1 <!-- 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 --> 5 <!DOCTYPE HTML> 6 <html> 7 <head> 8 <meta charset="utf-8"> 9 </head> 10 <body> 11 12 <script src="../utils.js"></script> 13 <script type="text/javascript"> 14 function wait_until_controlled() { 15 return new Promise(function(resolve) { 16 if (navigator.serviceWorker.controller) { 17 resolve('controlled'); 18 return; 19 } 20 navigator.serviceWorker.addEventListener('controllerchange', function onController() { 21 if (navigator.serviceWorker.controller) { 22 navigator.serviceWorker.removeEventListener('controllerchange', onController); 23 resolve('controlled'); 24 } 25 }); 26 }); 27 } 28 addEventListener('load', async function(event) { 29 window.controlled = wait_until_controlled(); 30 window.registration = 31 await navigator.serviceWorker.register('sw_download_canceled.js'); 32 let sw = registration.installing || registration.waiting || 33 registration.active; 34 await waitForState(sw, 'activated'); 35 sw.postMessage('claim'); 36 }); 37 38 // Place to hold promises for stream closures reported by the SW. 39 window.streamClosed = {}; 40 41 // The ServiceWorker will postMessage to this BroadcastChannel when the streams 42 // are closed. (Alternately, the SW could have used the clients API to post at 43 // us, but the mechanism by which that operates would be different when this 44 // test is uplifted, and it's desirable to avoid timing changes.) 45 // 46 // The browser test will use this promise to wait on stream shutdown. 47 window.swStreamChannel = new BroadcastChannel("stream-closed"); 48 function trackStreamClosure(path) { 49 let resolve; 50 const promise = new Promise(r => { resolve = r }); 51 window.streamClosed[path] = { promise, resolve }; 52 } 53 window.swStreamChannel.onmessage = ({ data }) => { 54 window.streamClosed[data.what].resolve(data); 55 }; 56 </script> 57 58 </body> 59 </html>