我试图SharedArrayBuffer
通过设置一个跨域隔离的文档来使用。但是,由于它位于 Google Chrome 扩展程序中并且我需要 WebAssembly,因此我需要在沙盒页面中运行它。
我有一个沙盒页面,在 manifest.json 中定义为这样
{
...
"sandbox": {
"pages": ["sandbox.html"]
},
"content_security_policy": {
"sandbox": "sandbox allow-scripts; script-src 'self' 'wasm-eval'; script-src-elem 'self' 'wasm-eval' blob:; worker-src 'self' blob:"
},
"cross_origin_embedder_policy": {
"value": "require-corp"
},
"cross_origin_opener_policy": {
"value": "same-origin"
},
...
}
而且我还使用 COOP 和 COEP 启用了跨域隔离。
除了使用这个sandbox.html
脚本之外什么都不做:
window.addEventListener('load', () => {
const thing = document.createElement('h1');
thing.innerHTML = self.crossOriginIsolated ? 'GOOD am crossOriginIso' : 'BAD am not crossOriginIso';
document.body.appendChild(thing);
});
然后我有一个outer.html
嵌入sandbox.html
iFrame 的页面。
<iframe src="sandbox.html" allow="cross-origin-isolated"></iframe>
当我打开时outer.html
,我收到消息“BAD am not crossOriginIso”,即sandbox.html
iFrame 内的文档不是跨域隔离的(我不能使用SharedArrayBuffer
)。
有没有办法在内部文档被沙盒化的 iFrame 中使用清单 v3 在 Chrome 扩展中启用跨域隔离(通过manifest.json
)。
也许更具体地说,如何featurePolicy.allowedFeatures()
向沙盒 iFrame 添加更多内容(它是在 Chrome 扩展程序的沙盒中manifest.json
,而不是sandbox
属性)。
我注意到以下几点:
- 没有iFrame直接打开
sandbox.html
,页面是跨域隔离的。 - 删除该
sandbox
属性会manifest.json
导致 iframe 内的文档被跨域隔离。 - 在 iFrame 内执行
document.featurePolicy.allowedFeatures()
会提供非常小的功能列表(并且不包括cross-origin-isolated
)。这个列表比sandbox.html
直接打开时执行相同的命令要小很多。