我试图通过设置一个跨源隔离的文档来使用SharedArrayBuffer
。然而,因为它是在一个谷歌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 not crossOriginIso",即iFrame内的sandbox.html
文档不是交叉起源隔离的(我不能使用SharedArrayBuffer
)。
是否有一种方法可以在一个iFrame中的manifest v3 Chrome扩展中启用跨域隔离,其中内部文档是沙盒(通过manifest.json
)。
也许更具体地说,如何添加更多的featurePolicy.allowedFeatures()
沙盒iFrame(这是在Chrome扩展的manifest.json
沙盒,而不是sandbox
属性)。
我注意到了以下几点:
- 直接打开
sandbox.html
而不使用iFrame,页面被跨域隔离。 - 删除
manifest.json
中的sandbox
属性会导致iframe内的文档被跨域隔离。 - 在iFrame内执行
document.featurePolicy.allowedFeatures()
给出了一个非常小的功能列表(不包括cross-origin-isolated
)。这个列表比直接打开sandbox.html
执行相同的命令要小得多。
在chrome 103, manifest v3,工作良好
"content_security_policy": {
"extension_pages": "default-src 'self' 'wasm-unsafe-eval';style-src 'unsafe-inline' 'self' "
},
"cross_origin_embedder_policy": {
"value": "require-corp"
},
"cross_origin_opener_policy": {
"value": "same-origin"
},
不要使用沙箱来运行ffmpeg。wasm, SharedArrayBuffer在沙箱中不可用