Source code

Revision control

Copy as Markdown

Other Tools

importScripts('/common/get-host-info.sub.js');
const text = 'worker loading intercepted by service worker';
const dedicated_worker_script = `postMessage('${text}');`;
const shared_worker_script =
`onconnect = evt => evt.ports[0].postMessage('${text}');`;
let source;
let resolveDone;
let done = new Promise(resolve => resolveDone = resolve);
// The page messages this worker to ask for the result. Keep the worker alive
// via waitUntil() until the result is sent.
self.addEventListener('message', event => {
source = event.data.port;
source.postMessage({id: event.source.id});
source.onmessage = resolveDone;
event.waitUntil(done);
});
self.onfetch = event => {
const url = event.request.url;
const destination = event.request.destination;
if (source)
source.postMessage({clientId:event.clientId, resultingClientId: event.resultingClientId});
// Request handler for a synthesized response.
if (url.indexOf('synthesized') != -1) {
let script_headers = new Headers({ "Content-Type": "text/javascript" });
if (destination === 'worker')
event.respondWith(new Response(dedicated_worker_script, { 'headers': script_headers }));
else if (destination === 'sharedworker')
event.respondWith(new Response(shared_worker_script, { 'headers': script_headers }));
else
event.respondWith(new Response('Unexpected request! ' + destination));
return;
}
// Request handler for a same-origin response.
if (url.indexOf('same-origin') != -1) {
event.respondWith(fetch('postmessage-on-load-worker.js'));
return;
}
// Request handler for a cross-origin response.
if (url.indexOf('cors') != -1) {
const filename = 'postmessage-on-load-worker.js';
const path = (new URL(filename, self.location)).pathname;
let new_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + path;
let mode;
if (url.indexOf('no-cors') != -1) {
// Test no-cors mode.
mode = 'no-cors';
} else {
// Test cors mode.
new_url += '?pipe=header(Access-Control-Allow-Origin,*)';
mode = 'cors';
}
event.respondWith(fetch(new_url, { mode: mode }));
}
};