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