Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.crossOriginIsolated

WorkerGlobalScope.crossOriginIsolated

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob der Worker-Kontext cross-origin-isoliert ist und damit Zugriff auf Funktionen wie <code>SharedArrayBuffer</code> hat.

seit JavaScript Baseline 2021: Chrome 87, Firefox 72, Safari 15.2 Kategorie: webapi

Signatur

WorkerGlobalScope.crossOriginIsolated

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-origin
  • Cross-Origin-Embedder-Policy: require-corp (oder credentialless)

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

Typ
boolean
Beschreibung
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');
}
Worker ist isoliert – SharedArrayBuffer verfügbar

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]);
  }
});
Zähler atomar erhöht

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 });
Hauptthread: true, Worker: true

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;
});
Dauer: 1.234 ms (hohe Auflösung)

// Wichtig · Fallstricke

  • Header sind Pflicht: Ohne Cross-Origin-Opener-Policy: same-origin und Cross-Origin-Embedder-Policy: require-corp/credentialless ist der Wert immer false. Auch das Worker-Skript braucht einen passenden COEP-Header.
  • Nebenwirkungen von COEP: Mit require-corp werden fremde Ressourcen (Bilder, Skripte, iframes) blockiert, wenn sie nicht per CORS oder mit Cross-Origin-Resource-Policy freigegeben sind. Werbe- und Drittanbieter-Einbindungen können dadurch nicht mehr funktionieren.
  • Popups: COOP: same-origin trennt die Verbindung zu fremden Fenstern. window.opener ist dann null, was z. B. OAuth-Popups stören kann.
  • Die Eigenschaft ist nur in sicheren Kontexten (HTTPS bzw. localhost) sinnvoll. Auf http:// ist sie false.
  • 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 mit self.crossOriginIsolated === true prüfen.