我正在尝试从扩展程序的内容脚本创建 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 没有被注入到页面中,我不确定这是否是同一问题或不相关问题的症状)
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
了解源代码和文档。
这似乎最近已修复。
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"
]
}]