Udostępnianie modułu WebAssembly między środowiskami w tej samej witrynie będzie ograniczone tylko do źródeł wewnętrznych.
Udostępnianie modułu WebAssembly (Wasm) między środowiskami w tej samej witrynie, ale z różnych domen, zostanie wycofane, aby umożliwić grupom agentów ograniczenie zakresu do pochodzenia na dłuższą metę. Deweloperzy, którzy używają modułów Wasm w taki sposób, muszą upewnić się, że instancje tych modułów są tworzone w tym samym źródle, aby można było ich używać po Chrome 95.
Co to są moduły Wasm i jak działają
Programy WebAssembly są podzielone na moduły, które są jednostką wdrażania, wczytywania i kompilowania.
W poniższym przykładowym kodzie moduł Wasm zaimportowany z poziomu
https://iframe.site.example
jest udostępniany modułowi https://main.site.example
za pomocą
postMessage()
. Zauważ, że te domeny są w tej samej witrynie, ale w różnych domenach.
Moduł Wasm na 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ć ten sam origin. W tym przypadku https://iframe.site.example
musi być równe https://main.site.example
lub odwrotnie.
Dlaczego to jest potrzebne
Chrome wewnętrznie obsługuje różne dokumenty, karty i ramki w klastrach agentów z kluczem strony. Oznacza to, że dokumenty w tej samej witrynie są obsługiwane w ramach tego samego procesu (sposób działania zależy od przeglądarki). Niedawno Chrome zaczęło obsługiwać je w bardziej szczegółowych jednostkach: źródłach. Nazywamy je klastrami agentów ze źródłem jako kluczem. Ponieważ jednak jest to kosztowne, klastry agentów ze źródłem jako kluczem zostały zastosowane tylko do ograniczonej liczby witryn za pomocą heurystyki.
Planujemy, że wszystkie klastry agentów będą domyślnie grupowane ze źródłem jako kluczem. Aby to osiągnąć, musimy ograniczyć funkcje, które wymagają klastrów źródeł z kluczem witryny:
- (dotyczy tylko Chrome) nie możesz już wysyłać obiektów
SharedArrayBuffer
aniWebAssembly.Memory
do innych stron w tej samej domenie, ale w innej witrynie. Ta funkcja działa od wersji 92 Chrome. - Nie możesz już wysyłać obiektów
WebAssembly.Module
do innych stron w tej samej domenie w innej domenie za pomocąpostMessage()
. Poniżej znajdziesz więcej informacji na temat tej zmiany. - Nie możesz już ustawiać opcji
document.domain
. Jest to funkcja starsza, która zwykle pozwala stronom w tej samej witrynie z innych domen na synchroniczny dostęp do interfejsu DOM, ale w grupach agentów z witryną jako kluczem jest wyłączona.
Po wprowadzeniu wszystkich powyższych zmian Chrome będzie domyślnie używać klastrów agentów z kluczem źródła.
Więcej informacji o klastrach agentów ze źródłem jako kluczem znajdziesz w artykule Prośba o izolację skuteczności za pomocą nagłówka Origin-Agent-Cluster.
Zasoby i dalsze kroki
Aby Chrome domyślnie współpracowało z grupami agentów z kluczem źródła, uczynimy document.domain
tylko do odczytu. Zespół Chrome planuje wprowadzić tę zmianę w 2022 r.
Zdjęcie: Markus Winkler na Unsplash