Signatur
Beschreibung
window.crossOriginIsolated ist ein schreibgeschützter boolescher Wert. Er ist true, wenn das Dokument in einem Cross-Origin-isolierten Kontext läuft. Dafür muss der Server das Hauptdokument mit zwei HTTP-Headern ausliefern: Cross-Origin-Opener-Policy: same-origin (COOP) und Cross-Origin-Embedder-Policy: require-corp oder credentialless (COEP).
Die Isolation schützt vor Seitenkanal-Angriffen wie Spectre. Erst mit ihr gibt der Browser leistungsstarke, aber sicherheitskritische Funktionen frei, vor allem SharedArrayBuffer (also geteilter Speicher zwischen Workern, z. B. für WebAssembly-Threads), performance.measureUserAgentSpecificMemory() und genauere Zeitmessungen mit performance.now().
In der Praxis prüft man mit der Eigenschaft zur Laufzeit, ob diese Funktionen verfügbar sind. Je nach Ergebnis lädt man dann z. B. eine WebAssembly-Variante mit mehreren Threads oder weicht auf eine Variante mit nur einem Thread aus. Die Eigenschaft gibt es auch in Workern als self.crossOriginIsolated (WorkerGlobalScope).
Rückgabewert
true, wenn das Dokument Cross-Origin-isoliert ist (COOP und COEP korrekt gesetzt, sicherer Kontext), sonst false.Beispiele
Isolationsstatus prüfen
if (window.crossOriginIsolated) {
console.log('Isoliert: SharedArrayBuffer ist verfügbar');
} else {
console.log('Nicht isoliert: COOP/COEP-Header fehlen');
}
SharedArrayBuffer mit Ausweichlösung für Worker
const worker = new Worker('rechner.js');
if (crossOriginIsolated) {
// Geteilter Speicher: Worker und Hauptthread sehen dieselben Daten
const shared = new SharedArrayBuffer(1024);
const view = new Int32Array(shared);
worker.postMessage({ buffer: shared });
Atomics.store(view, 0, 42);
} else {
// Ausweichlösung: Daten kopieren bzw. übertragen
const buffer = new ArrayBuffer(1024);
worker.postMessage({ buffer }, [buffer]);
}
Passende WebAssembly-Variante laden
const loadWasm = async () => {
const url = crossOriginIsolated
? '/wasm/engine-threads.wasm'
: '/wasm/engine-single.wasm';
const { instance } = await WebAssembly.instantiateStreaming(fetch(url));
console.log(`Geladen: ${url}`);
return instance;
};
loadWasm();
Server-Header setzen (Node.js/Express)
import express from 'express';
const app = express();
app.use((req, res, next) => {
res.set('Cross-Origin-Opener-Policy', 'same-origin');
res.set('Cross-Origin-Embedder-Policy', 'require-corp');
next();
});
app.use(express.static('public'));
app.listen(3000, () => console.log('Server läuft auf http://localhost:3000'));
// Wichtig · Fallstricke
- Nebenwirkungen von COEP: Mit
require-corpmüssen alle Ressourcen von fremden Ursprüngen (Bilder, Skripte, iframes) entweder per CORS geladen werden oder den HeaderCross-Origin-Resource-Policysenden. Sonst blockiert der Browser sie. Werbe- und Analyse-Skripte oder CDNs funktionieren dann oft nicht mehr. Ein Ausweg istcredentialless; Safari unterstützt diesen Wert aber erst seit kurzem bzw. nur eingeschränkt. - Nebenwirkungen von COOP:
same-origintrennt die Verbindung zu Pop-ups von fremden Ursprüngen.window.openerist dannnull, was z. B. OAuth- oder Zahlungs-Pop-ups stören kann. - Die Isolation funktioniert nur in sicheren Kontexten (HTTPS oder
localhost). - In iframes muss das eingebettete Dokument die Isolation ebenfalls erfüllen, und der Einbettende muss sie per
allow=\"cross-origin-isolated\"(Permissions Policy) erlauben. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung hat keine Wirkung; man kann die Isolation nur über Server-Header steuern, nicht per JavaScript.
- Ältere Browser kennen die Eigenschaft nicht. Dann ist sie
undefined; eine einfache Wahrheitsprüfung behandelt das korrekt als „nicht isoliert“.