Совместное использование модулей WebAssembly в средах одного сайта будет ограничено только одним источником.
Совместное использование модуля WebAssembly (Wasm) в средах, которые относятся к одному сайту, но имеют разные источники, будет прекращено, чтобы в долгосрочной перспективе кластеры агентов могли быть ограничены источниками. Разработчикам, которые используют модули Wasm таким образом, необходимо убедиться, что они создают экземпляры этих модулей в одном источнике, чтобы продолжать использовать их после Chrome 95.
Что такое модули Wasm и как они работают
Программы WebAssembly организованы в модули, которые являются единицей развертывания, загрузки и компиляции.
В примере кода ниже модуль Wasm, импортированный из https://iframe.site.example, передается в https://main.site.example через postMessage(). Обратите внимание, что эти домены относятся к одному сайту, но к разным источникам.
Модуль Wasm на https://iframe.site.example:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
Начиная с Chrome 95, отправитель и получатель должны быть из одного источника. В приведенном выше примере значение https://iframe.site.example должно быть равно https://main.site.example или наоборот.
Зачем это нужно
Chrome обрабатывает разные документы, вкладки и фреймы в кластерах агентов с ключом сайта. Это означает, что документы с одного сайта обрабатываются в рамках одного процесса (точный механизм зависит от браузера). Недавно в Chrome начали обрабатывать их в более мелких единицах: источниках. Мы называем это кластеризацией агентов по источнику. Однако из-за того, что это требует больших ресурсов, кластеризация агентов по источнику применялась только к ограниченному числу сайтов.
В будущем планируется сделать кластеризацию агентов по источнику настройкой по умолчанию. Для этого нам нужно ограничить возможности, требующие кластеров источников с ключом сайта:
- (Только для Chrome.) Вы больше не можете отправлять объекты
SharedArrayBufferилиWebAssembly.Memoryна другие страницы того же сайта, но из разных источников. Это изменение уже действует в Chrome 92. - Вы больше не можете отправлять объекты
WebAssembly.Moduleна другие страницы того же сайта, но из разных источников, с помощьюpostMessage(). Подробная информация об этом изменении приведена ниже. - Вы больше не можете задавать
document.domain. Это устаревшая функция, которая обычно позволяет междоменным страницам одного сайта синхронно получать доступ к DOM друг друга, но в кластерах агентов по источнику она отключена.
После внесения всех перечисленных выше изменений Chrome по умолчанию перейдет на использование кластеров агентов по источнику.
Подробнее о кластеризации агентов по источнику…
Дополнительные сведения
Чтобы Chrome по умолчанию работал с кластерами агентов по источнику, мы сделаем свойство document.domain доступным только для чтения. Команда Chrome планирует внедрить это изменение в 2022 году.