2014-03-28 67 views
11

我试图从我的扩展的内容脚本中创建Web Worker,但它被SecurityError(同源策略)阻止。什么是最好的方法来做到这一点?从Chrome扩展内容脚本创建Web Worker

从我的内容脚本:

var workerURL = chrome.extension.getURL("js/searchWorker.js"); 
var lunrWorker = new Worker(workerURL); 

从清单:

"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"] 
    } 
] 

我也试过在我的舱单,这一点,但它并没有帮助:

"content_security_policy": "default-src 'none'; style-src 'self'; script-src 'self';", 

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

回答

15

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

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

参见patch-worker.jsdocumentation)用于执行前面的想法。

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

+0

哦,男人,这是一个无赖这是一个错误。这个脚本非常适合加载我的网络工作者。现在我遇到了importScript不能在worker中工作的问题,我得到了''WorkerGlobalScope'上无法执行'importScripts':URL'lunr.min.js'无效' – CambridgeMike

+0

实际上,它看起来像我需要在eventlistener中执行importScript,并传递chrome.extension.getURL返回的路径。这感觉相当sl,,因为没有保证我的工作人员在importScript完成并执行导入的脚本之前不会开始接收其他消息。或者它会停止执行,因为它是一个单线程? – CambridgeMike

+0

'importScript' /'importScripts'是同步函数,所以不可能在worker脚本的运行时对它们进行填充(任何与worker的通信都是异步的)。理论上讲,这也可以通过首先扫描workerScript字符串for importScript(...)来获取数据并替换内容,然后我接近一个完整的脚本加载器,这是非常多的的工作(并且它不会100%可靠,因为静态分析无法知道在使用'var file ='x.js'; importScript(file)'。时会加载什么内容“(待续) –

相关问题