在同一网站环境之间共享 WebAssembly 模块将被限制为仅限同源。
在同网站但跨源环境之间共享 WebAssembly (Wasm) 模块 已废弃,以允许代理集群 从长远来看,将范围限定为源站。使用 Wasm 模块 一种方式必须确保在同源实例化这些模块才能继续 在 Chrome 95 之后使用这些版本。
什么是 Wasm 模块及其工作原理
WebAssembly 程序会整理成模块,这些模块是 部署、加载和编译。
在下面的示例代码中,从
https://iframe.site.example
是通过以下途径与 https://main.site.example
共享的:
postMessage()
。请注意,这些网域是同网站但跨源的。
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 起便已采用。 - 您无法再发送
WebAssembly.Module
对象通过postMessage()
传递给其他同网站跨源网页。此更改 下文进行了更详细的说明。 - 您无法再设置
document.domain
。 这是一项旧版功能,通常允许同网站跨源网页 可以同步访问彼此的 DOM,但在以源为键的代理集群中, 已停用。
解决上述所有变更后,Chrome 将改为使用以源为键的代理 集群。
如需详细了解以源为键的代理集群,请参阅使用 Origin-Agent-Cluster 标头请求性能隔离。
后续步骤和资源
为了让 Chrome 默认使用以源为键的代理集群,
将 document.domain
设为只读。Chrome 团队力求实现这一变更
。
摄影:Markus Winkler 已开启 不启动