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