// Holds the promise that the "resolve.fakehtml" call attempts to resolve. // This is "the SW's promise" that other parts of the test refer to. var promise; // Stores the resolve funcution for the current promise. var pending_resolve_func = null; // Unique ID to determine which service worker is being used. const ID = Math.random(); function callAndResetResolve() { var local_resolve = pending_resolve_func; pending_resolve_func = null; local_resolve(); } self.addEventListener('fetch', function(event) { fetchEventHandler(event); }) self.addEventListener('message', (event) => { event.waitUntil(async function() { if(!event.data) return; if (event.data.type === "get-id") { event.source.postMessage({ID: ID}); } else if(event.data.type === "get-match-all") { clients.matchAll({includeUncontrolled: true}).then(clients_list => { const url_list = clients_list.map(item => item.url); event.source.postMessage({urls_list: url_list}); }); } else if(event.data.type === "claim") { await clients.claim(); } }()); }); async function fetchEventHandler(event){ var request_url = new URL(event.request.url); var url_search = request_url.search.substr(1); request_url.search = ""; if ( request_url.href.endsWith('waitUntilResolved.fakehtml') ) { if (pending_resolve_func != null) { // Respond with an error if there is already a pending promise event.respondWith(Response.error()); return; } // Create the new promise. promise = new Promise(function(resolve) { pending_resolve_func = resolve; }); event.waitUntil(promise); event.respondWith(new Response(` Promise created by ${url_search} `, {headers: {'Content-Type': 'text/html'}} )); } else if ( request_url.href.endsWith('resolve.fakehtml') ) { var has_pending = !!pending_resolve_func; event.respondWith(new Response(` Promise settled for ${url_search} `, {headers: {'Content-Type': 'text/html'}})); if (has_pending) { callAndResetResolve(); } } }