Совместное использование модуля 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 начал обрабатывать их в более мелких единицах: источниках. Мы называем это кластерами агентов с ключом источника . Однако, поскольку это требует больших затрат ресурсов, кластеры агентов с ключом источника применялись только к ограниченному числу веб-сайтов эвристически.
План состоит в том, чтобы сделать все кластеры агентов origin-keyed по умолчанию. Чтобы достичь этого, нам нужно ограничить возможности, которые требуют site-keyed origin clusters:
- (Только для Chrome) Вы больше не можете отправлять объекты
SharedArrayBuffer
илиWebAssembly.Memory
на другие страницы с кросс-источниками на том же сайте. Это уже работает с Chrome 92 . - Вы больше не можете отправлять объекты
WebAssembly.Module
на другие страницы с кросс-источниками того же сайта черезpostMessage()
. Это изменение более подробно описано ниже.. - Вы больше не можете задать
document.domain
. Это устаревшая функция, которая обычно позволяет страницам с кросс-источниками на одном сайте синхронно получать доступ к DOM друг друга, но в кластерах агентов с ключом источника она отключена.
Решив все вышеперечисленные изменения, Chrome по умолчанию перейдет к использованию кластеров агентов с ключом источника.
Дополнительную информацию о кластерах агентов с ключом источника см. в разделе Запрос изоляции производительности с помощью заголовка Origin-Agent-Cluster .
Дальнейшие шаги и ресурсы
Чтобы Chrome работал с кластерами агентов с ключом origin по умолчанию, мы сделаем document.domain
доступным только для чтения. Команда Chrome намерена внедрить это изменение где-то в 2022 году.
- Объяснение кластеров агентов с ключом происхождения
- Изоляция по умолчанию
- Устаревание
document.domain
Фото Маркуса Винклера на Unsplash