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
SharedArrayBufferaniWebAssembly.Memorydo 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.Moduledo 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.
- Wyjaśnienie dotyczące klastrów agentów ze źródłem jako kluczem
- Izolacja domyślna
- Wycofanie
document.domain
Zdjęcie: Markus Winkler, Unsplash