在同网站环境之间共享 WebAssembly 模块时,仅允许同源。
在同网站但跨源环境之间共享 WebAssembly (Wasm) 模块将弃用,以允许代理集群长期限定为源站。以这种方式使用 Wasm 模块的开发者必须确保在同一来源实例化这些模块,以便在 Chrome 95 之后继续使用这些模块。
什么是 Wasm 模块及其工作原理
WebAssembly 程序以模块形式组织,模块是部署、加载和编译的单元。
在以下示例中,从 https://iframe.site.example
导入的 Wasm 模块通过 postMessage()
与 https://main.site.example
共享。请注意,这些网域是同网站但跨源。
https://iframe.site.example
上的 Wasm 模块:
(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 开始就已引入。 - 您无法再通过
postMessage()
将WebAssembly.Module
对象发送到其他同网站跨源网页。下面更详细地介绍了这项变更。 - 您无法再设置
document.domain
。这是一项旧版功能,通常允许同网站跨源网页同步访问彼此的 DOM,但在以源为键的代理集群中,此功能处于停用状态。
解决上述所有更改后,Chrome 将默认改为使用以源为键的代理集群。
如需详细了解以源为键的代理集群,请参阅使用 Origin-Agent-Cluster 标头请求性能隔离。
后续步骤和资源
为了使 Chrome 默认使用以源为键的代理集群,我们会将 document.domain
设为只读。Chrome 团队计划在 2022 年的某个时候落实这项变更。
照片由 Markus Winkler 拍摄,拍摄于 Unsplash 用户