将 Wasm 模块共享限制为同源

在同网站环境之间共享 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 将默认使用源键代理集群。

如需详细了解源键代理集群,请参阅使用 Origin-Agent-Cluster 标头请求性能隔离。

后续步骤和资源

为了让 Chrome 默认使用源键代理集群,我们将 document.domain 设为只读。Chrome 团队计划在 2022 年的某个时间点实施这项变更。

照片提供者:Markus Winkler;来源:Unsplash