Ограничение совместного использования модулей Wasm одним и тем же источником

Совместное использование модуля 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 году.

Фото Маркуса Винклера на Unsplash