从Chrome扩展程序内容脚本创建Web Worker

Cam*_*ike 11 javascript web-worker google-chrome-extension

我正在尝试从我的扩展程序的内容脚本创建一个Web Worker,但它被SecurityError(相同的源策略)阻止.最好的方法是什么?

从我的内容脚本:

var workerURL = chrome.extension.getURL("js/searchWorker.js");
var lunrWorker = new Worker(workerURL);
Run Code Online (Sandbox Code Playgroud)

从清单:

"content_scripts": [
   {
     "matches": ["http://localhost:8000/*"],
     "js": ["js/jquery.min.js", "js/jquery.highlight.js", "js/index.js"],
     "css": ["css/bootstrap.css", "css/styles.css"]
   }
 ]
Run Code Online (Sandbox Code Playgroud)

我也尝试在我的清单中设置它,但它没有帮助:

"content_security_policy": "default-src 'none'; style-src 'self'; script-src 'self';",
Run Code Online (Sandbox Code Playgroud)

(旁注:CSS没有被注入页面,我不确定这是否是同一问题的症状或无关)

Rob*_*b W 16

http://crbug.com/357664是关于无法将扩展脚本作为Web工作者加载的错误报告.

此问题的解决方法是使用XMLHttpRequest加载工作程序脚本,然后从字符串加载工作程序.当我在过去遇到这个问题时,我创建了一个透明地修改Worker构造函数的包装器,因此您可以new Worker(chrome.runtime.getURL('worker.js'))毫无问题地使用它.

请参阅patch-worker.js(文档)以了解先前构思的实现.

patch-worker.js有一些限制(例如importScripts,没有按预期工作),主要与它不在chrome-extension:-origin中运行的事实有关.为了解决这些问题,我创建了另一个使用iframe创建Worker的库.有关worker_proxy源代码和文档,请参阅.