使用CSP在Web Worker中启用"新功能"

pim*_*vdb 6 javascript google-chrome web-worker function-constructor content-security-policy

我无法new Function在Web Worker中工作.我有一个HTML页面,它产生了一个Web Worker.此Web Worker通过执行代码new Function(str).我正在尝试在打包的Chrome应用中使用此功能,这需要使用类似eval代码的页面在清单中明确列为沙盒页面.

现在,有两种选择:

  • 列出该网页被沙盒.如果我这样做,我可以使用new Function,但我无法生成Web Worker,因为我无法发出任何请求(沙盒页面具有唯一的来源).new Worker(...)抛出一个SECURITY_ERR.
    • new Function 适用于沙箱
    • new Worker 由于独特的起源而在沙盒中失败
  • 不要列出要沙箱的页面.如果我这样做,我可以生成一个Web Worker,但是worker不能使用,new Function因为它不是沙箱.new Function(...)抛出一个EvalError关于它的使用抱怨.
    • new Function未能在非沙箱由于是eval
    • new Worker 适用于非沙箱

我的CSP如下:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self'
Run Code Online (Sandbox Code Playgroud)

如何new Function在Web Worker中工作?

mol*_*arg 5

有一种称为内联工的技术,我建议使用它.

  • 创建一个包含worker的源代码的Blob对象
  • 将其转换为"dataurl"
  • 使用此dataurl实例化worker

这是在他们的WebWorkers教程中的HTML5 rock网站上的示例代码中描述的.这样,您可以将网站列为沙盒,但由于不需要执行外部请求,因此它也应该在沙盒模式下工作.