在同一网站环境之间共享 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