Source code

Revision control

Copy as Markdown

Other Tools

// 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(`
<html>
Promise created by ${url_search}
<script>self.parent.postMessage({ ID:${ID}, source: "${url_search}"
}, '*');</script>
</html>
`, {headers: {'Content-Type': 'text/html'}}
));
}
else if ( request_url.href.endsWith('resolve.fakehtml') ) {
var has_pending = !!pending_resolve_func;
event.respondWith(new Response(`
<html>
Promise settled for ${url_search}
<script>self.parent.postMessage({ ID:${ID}, has_pending: ${has_pending},
source: "${url_search}" }, '*');</script>
</html>
`, {headers: {'Content-Type': 'text/html'}}));
if (has_pending) {
callAndResetResolve();
}
}
}