Ograniczenie udostępniania modułu Wasm do tej samej domeny

Udostępnianie modułu WebAssembly między środowiskami w tej samej witrynie będzie ograniczone tylko do tego samego źródła.

Udostępnianie modułu WebAssembly (Wasm) między środowiskami w tej samej witrynie, ale współdzielenie zostanie wycofane, aby umożliwić długoterminowe przypisywanie klastrów agentów do źródeł. Deweloperzy, którzy używają modułów Wasm w ten sposób, muszą upewnić się, że tworzą instancje tych modułów w tej samej domenie, aby móc nadal z nich korzystać w wersjach nowszych niż Chrome 95.

Czym są moduły Wasm i jak działają

Programy WebAssembly są podzielone na moduły, które są jednostkami wdrażania, wczytywania i kompilacji.

W poniższym przykładowym kodzie moduł Wasm zaimportowany z https://iframe.site.example jest udostępniany https://main.site.example za pomocą postMessage(). Zauważ, że te domeny są w tej samej witrynie, ale mają różne źródła.

Moduł Wasm na platformie https://iframe.site.example:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

Od wersji Chrome 95 nadawca i odbiorca muszą mieć to samo źródło. W powyższym przypadku https://iframe.site.example musi być https://main.site.example lub odwrotnie.

Dlaczego jest to potrzebne

Chrome wewnętrznie obsługuje różne dokumenty, karty i ramki w klastrach agentów z kluczem witryny. Oznacza to, że dokumenty z tej samej witryny są obsługiwane w ramach tego samego procesu (dokładny sposób działania zależy od przeglądarki). Niedawno Chrome zaczął obsługiwać je w bardziej szczegółowych jednostkach: źródłach. Nazywamy to grupowaniem agentów ze źródłem jako kluczem. Ponieważ jednak wymaga to dużej ilości zasobów, grupowanie agentów ze źródłem jako kluczem było stosowane heurystycznie tylko w przypadku niektórych witryn.

Planujemy domyślnie ustawić wszystkie klastry agentów jako klucze źródłowe. Aby to osiągnąć, musimy ograniczyć możliwości, które wymagają klastrów pochodzenia z kluczem witryny:

  • (Tylko w Chrome) Nie możesz już wysyłać obiektów SharedArrayBuffer ani WebAssembly.Memory do innych stron w tej samej witrynie, ale w innej domenie. Ta funkcja jest dostępna od wersji Chrome 92.
  • Nie możesz już wysyłać obiektów WebAssembly.Module do innych stron w tej samej witrynie, ale w innej domenie, za pomocą postMessage(). Więcej informacji o tej zmianie znajdziesz poniżej.
  • Nie możesz już ustawić document.domain. Jest to starsza funkcja, która zwykle umożliwia stronom z tej samej witryny i z innej domeny synchroniczny dostęp do modelu DOM, ale w grupach agentów ze źródłem jako kluczem jest ona wyłączona.

Po wprowadzeniu wszystkich powyższych zmian Chrome domyślnie przejdzie na grupowanie agentów ze źródłem jako kluczem.

Więcej informacji o grupowaniu agentów ze źródłem jako kluczem znajdziesz w artykule Żądanie izolacji wydajności za pomocą nagłówka Origin-Agent-Cluster (w języku angielskim).

Zasoby i dalsze kroki

Aby Chrome domyślnie działał z grupowaniem agentów ze źródłem jako kluczem, ustawimy document.domain jako tylko do odczytu. Zespół Chrome planuje wprowadzić tę zmianę w 2022 r.

Zdjęcie: Markus Winkler, Unsplash