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

问题描述 投票:0回答:2

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

来自我的内容脚本:

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 没有被注入到页面中,我不确定这是否是同一问题或不相关问题的症状)

javascript google-chrome-extension web-worker
2个回答
17
投票

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

此问题的解决方法是使用 XMLHttpRequest 加载工作程序脚本,然后 从字符串加载工作程序。当我过去遇到这个问题时,我创建了一个包装器,透明地修改

Worker
构造函数,这样您就可以毫无问题地使用
new Worker(chrome.runtime.getURL('worker.js'))

请参阅

patch-worker.js
文档)了解先前想法的实施。

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


0
投票

这似乎最近已修复。

worker 可以初始化为

const worker = new Worker(chrome.runtime.getURL("/path/to/script.js"));

你的manifest.json(V3)应该包括

"content_scripts": [{
        "matches": ["<all_urls>"],
        "js": [
            "/path/to/script.js"
        ]
    }]
© www.soinside.com 2019 - 2024. All rights reserved.