async_waituntil_worker.js (1332B)
1 var keepAlivePromise; 2 var resolvePromise; 3 var result = "Failed"; 4 5 onactivate = function (event) { 6 event.waitUntil(clients.claim()); 7 }; 8 9 onmessage = function (event) { 10 if (event.data === "Start") { 11 event.waitUntil(Promise.reject()); 12 13 keepAlivePromise = new Promise(function (resolve, reject) { 14 resolvePromise = resolve; 15 }); 16 17 result = "Success"; 18 event.waitUntil(keepAlivePromise); 19 event.source.postMessage("Started"); 20 } else if (event.data === "Result") { 21 event.source.postMessage(result); 22 if (resolvePromise !== undefined) { 23 resolvePromise(); 24 } 25 } 26 }; 27 28 addEventListener("fetch", e => { 29 let respondWithPromise = new Promise(function (res, rej) { 30 setTimeout(() => { 31 res(new Response("ok")); 32 }, 0); 33 }); 34 e.respondWith(respondWithPromise); 35 // Test that waitUntil can be called in the promise handler of the existing 36 // lifetime extension promise. 37 respondWithPromise.then(() => { 38 e.waitUntil( 39 clients.matchAll().then(cls => { 40 dump(`matchAll returned ${cls.length} client(s) with URLs:\n`); 41 cls.forEach(cl => { 42 dump(`${cl.url}\n`); 43 }); 44 45 if (cls.length != 1) { 46 dump("ERROR: no controlled clients.\n"); 47 } 48 client = cls[0]; 49 client.postMessage("Done"); 50 }) 51 ); 52 }); 53 });