/*! coi-serviceworker v0.1.7 - Guido Zuidhof and contributors, licensed under MIT */ let coepCredentialless = false; if (typeof window === 'undefined') { self.addEventListener("install", () => self.skipWaiting()); self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim())); self.addEventListener("message", (ev) => { if (!ev.data) { return; } else if (ev.data.type === "deregister") { self.registration .unregister() .then(() => { return self.clients.matchAll(); }) .then(clients => { clients.forEach((client) => client.navigate(client.url)); }); } else if (ev.data.type === "coepCredentialless") { coepCredentialless = ev.data.value; } }); self.addEventListener("fetch", function (event) { const r = event.request; if (r.cache === "only-if-cached" && r.mode !== "same-origin") { return; } const request = (coepCredentialless && r.mode === "no-cors") ? new Request(r, { credentials: "omit", }) : r; event.respondWith( fetch(request) .then((response) => { if (response.status === 0) { return response; } const newHeaders = new Headers(response.headers); newHeaders.set("Cross-Origin-Embedder-Policy", coepCredentialless ? "credentialless" : "require-corp" ); if (!coepCredentialless) { newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin"); } newHeaders.set("Cross-Origin-Opener-Policy", "same-origin"); return new Response(response.body, { status: response.status, statusText: response.statusText, headers: newHeaders, }); }) .catch((e) => console.error(e)) ); }); } else { (() => { const reloadedBySelf = window.sessionStorage.getItem("coiReloadedBySelf"); window.sessionStorage.removeItem("coiReloadedBySelf"); const coepDegrading = (reloadedBySelf == "coepdegrade"); // You can customize the behavior of this script through a global `coi` variable. const coi = { shouldRegister: () => !reloadedBySelf, shouldDeregister: () => false, coepCredentialless: () => true, coepDegrade: () => true, doReload: () => window.location.reload(), quiet: false, ...window.coi }; const n = navigator; const controlling = n.serviceWorker && n.serviceWorker.controller; // Record the failure if the page is served by serviceWorker. if (controlling && !window.crossOriginIsolated) { window.sessionStorage.setItem("coiCoepHasFailed", "true"); } const coepHasFailed = window.sessionStorage.getItem("coiCoepHasFailed"); if (controlling) { // Reload only on the first failure. const reloadToDegrade = coi.coepDegrade() && !( coepDegrading || window.crossOriginIsolated ); n.serviceWorker.controller.postMessage({ type: "coepCredentialless", value: (reloadToDegrade || coepHasFailed && coi.coepDegrade()) ? false : coi.coepCredentialless(), }); if (reloadToDegrade) { !coi.quiet && console.log("Reloading page to degrade COEP."); window.sessionStorage.setItem("coiReloadedBySelf", "coepdegrade"); coi.doReload("coepdegrade"); } if (coi.shouldDeregister()) { n.serviceWorker.controller.postMessage({ type: "deregister" }); } } // If we're already coi: do nothing. Perhaps it's due to this script doing its job, or COOP/COEP are // already set from the origin server. Also if the browser has no notion of crossOriginIsolated, just give up here. if (window.crossOriginIsolated !== false || !coi.shouldRegister()) return; if (!window.isSecureContext) { !coi.quiet && console.log("COOP/COEP Service Worker not registered, a secure context is required."); return; } // In some environments (e.g. Firefox private mode) this won't be available if (!n.serviceWorker) { !coi.quiet && console.error("COOP/COEP Service Worker not registered, perhaps due to private mode."); return; } n.serviceWorker.register(window.document.currentScript.src).then( (registration) => { !coi.quiet && console.log("COOP/COEP Service Worker registered", registration.scope); registration.addEventListener("updatefound", () => { !coi.quiet && console.log("Reloading page to make use of updated COOP/COEP Service Worker."); window.sessionStorage.setItem("coiReloadedBySelf", "updatefound"); coi.doReload(); }); // If the registration is active, but it's not controlling the page if (registration.active && !n.serviceWorker.controller) { !coi.quiet && console.log("Reloading page to make use of COOP/COEP Service Worker."); window.sessionStorage.setItem("coiReloadedBySelf", "notcontrolling"); coi.doReload(); } }, (err) => { !coi.quiet && console.error("COOP/COEP Service Worker failed to register:", err); } ); })(); }