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.
Czym są moduły Wasm i jak działają
Programy WebAssembly są podzielone na moduły, które są jednostką wdrażania, wczytywania i kompilacji.
W poniższym przykładowym kodzie moduł Wasm zaimportowany ze strony https://iframe.site.example
jest udostępniany platformie https://main.site.example
przez postMessage()
. Zauważ, że te domeny są w tej samej witrynie, ale pochodzą z różnych źródeł.
Moduł Wasm na urządzeniu 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 różni się w zależności 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 miały źródło jako klucz. 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 jest stosowana od wersji Chrome 92. - Nie możesz już wysyłać obiektów
WebAssembly.Module
do innych stron w tej samej domenie w innej domenie za pomocąpostMessage()
. Ta zmiana została szczegółowo wyjaśniona poniżej. - 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 zamierza wprowadzić tę zmianę
w 2022 roku.
Zdjęcie: Markus Winkler na Unsplash