| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /*! 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 {
- (() => {
- // You can customize the behavior of this script through a global `coi` variable.
- const coi = {
- shouldRegister: () => true,
- shouldDeregister: () => false,
- //coepCredentialless: () => (window.chrome !== undefined || window.netscape !== undefined),
- coepCredentialless: () => navigator.userAgentData?.brands?.some((b) => b.brand == "Chromium"),
- doReload: () => window.location.reload(),
- quiet: false,
- ...window.coi
- };
- const n = navigator;
- if (n.serviceWorker && n.serviceWorker.controller) {
- n.serviceWorker.controller.postMessage({
- type: "coepCredentialless",
- value: coi.coepCredentialless(),
- });
- 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. Chrome incognito mode) this won't be available
- if (n.serviceWorker) {
- 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.");
- 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.");
- coi.doReload();
- }
- },
- (err) => {
- !coi.quiet && console.error("COOP/COEP Service Worker failed to register:", err);
- }
- );
- }
- })();
- }
|