2014-03-28 91 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)'。時會加載什麼內容「(待續) –

相關問題