Signatur
Beschreibung
Die schreibgeschützte Eigenschaft crossOriginIsolated des globalen Worker-Objekts (self in Dedicated, Shared und Service Workern) gibt true zurück, wenn der Worker in einem cross-origin-isolierten Kontext läuft. Andernfalls ist der Wert false. Sie ist das Gegenstück zu window.crossOriginIsolated im Hauptthread.
Cross-Origin-Isolation schützt vor Seitenkanal-Angriffen wie Spectre. Erst in einem isolierten Kontext stehen leistungsfähige Funktionen zur Verfügung, darunter SharedArrayBuffer (inklusive postMessage-Übergabe zwischen Threads), Atomics.wait() auf geteiltem Speicher, hochauflösende Timer in performance.now() und performance.measureUserAgentSpecificMemory().
Damit ein Dokument und seine Worker isoliert sind, muss das Dokument mit diesen HTTP-Headern ausgeliefert werden:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp(odercredentialless)
Dedicated Worker übernehmen die Isolation vom erzeugenden Dokument. Das Worker-Skript selbst muss aber ebenfalls mit einem passenden Cross-Origin-Embedder-Policy-Header ausgeliefert werden. Die Eigenschaft eignet sich vor allem für eine Laufzeitprüfung: Damit kann man vor dem Einsatz von SharedArrayBuffer feststellen, ob die Funktion zur Verfügung steht, und bei Bedarf auf einen Ausweichpfad wechseln.
Rückgabewert
true, wenn der Worker-Kontext cross-origin-isoliert ist, sonst false.Beispiele
Isolation im Worker prüfen
// worker.js
if (self.crossOriginIsolated) {
console.log('Worker ist isoliert – SharedArrayBuffer verfügbar');
} else {
console.log('Nicht isoliert – COOP/COEP-Header prüfen');
}
Geteilten Speicher nutzen, mit Ausweichpfad
// worker.js
self.addEventListener('message', ({ data }) => {
if (self.crossOriginIsolated && data instanceof SharedArrayBuffer) {
const counter = new Int32Array(data);
Atomics.add(counter, 0, 1);
Atomics.notify(counter, 0);
self.postMessage('Zähler atomar erhöht');
} else {
// Ausweichpfad: Daten per Kopie zurückschicken
const copy = new Int32Array(data);
copy[0] += 1;
self.postMessage(copy.buffer, [copy.buffer]);
}
});
Status an den Hauptthread melden
// main.js
const worker = new Worker('status-worker.js');
worker.addEventListener('message', ({ data }) => {
console.log(`Hauptthread: ${window.crossOriginIsolated}, Worker: ${data.isolated}`);
});
// status-worker.js
self.postMessage({ isolated: self.crossOriginIsolated });
Hochauflösende Zeitmessung nur bei Isolation
// worker.js
const messen = (fn) => {
const start = performance.now();
fn();
const dauer = performance.now() - start;
const hinweis = self.crossOriginIsolated ? 'hohe Auflösung' : 'grobe Auflösung (~100 µs+)';
console.log(`Dauer: ${dauer.toFixed(3)} ms (${hinweis})`);
};
messen(() => {
let summe = 0;
for (let i = 0; i < 1e6; i++) summe += i;
});
// Wichtig · Fallstricke
- Header sind Pflicht: Ohne
Cross-Origin-Opener-Policy: same-originundCross-Origin-Embedder-Policy: require-corp/credentiallessist der Wert immerfalse. Auch das Worker-Skript braucht einen passenden COEP-Header. - Nebenwirkungen von COEP: Mit
require-corpwerden fremde Ressourcen (Bilder, Skripte, iframes) blockiert, wenn sie nicht per CORS oder mitCross-Origin-Resource-Policyfreigegeben sind. Werbe- und Drittanbieter-Einbindungen können dadurch nicht mehr funktionieren. - Popups:
COOP: same-origintrennt die Verbindung zu fremden Fenstern.window.openerist dannnull, was z. B. OAuth-Popups stören kann. - Die Eigenschaft ist nur in sicheren Kontexten (HTTPS bzw.
localhost) sinnvoll. Aufhttp://ist siefalse. - Bei Service Workern hängt der Wert von den Headern des Service-Worker-Skripts ab, nicht von einer bestimmten Seite. Die Unterstützung ist je nach Browser uneinheitlich.
- In älteren Browsern ohne Unterstützung ist die Eigenschaft
undefined. Deshalb besser mitself.crossOriginIsolated === trueprüfen.