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


我正在尝试从我的扩展程序的内容脚本创建一个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没有被注入页面,我不确定这是同一问题的症状还是无关的)


10874
2018-03-28 15:53


起源



答案:


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

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

看到 patch-worker.js (文件)用于执行先前的想法。

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


15
2018-03-28 17:42



哦,伙计,这是一个无聊的错误。此脚本非常适合加载我的Web worker。现在我遇到了importScript在worker中不起作用的问题,我明白了 Failed to execute 'importScripts' on 'WorkerGlobalScope': The URL 'lunr.min.js' is invalid - CambridgeMike
实际上,看起来我需要在eventlistener中执行importScript,并传递chrome.extension.getURL返回的路径。这感觉非常草率,因为无法保证我的工作人员在importScript完成并执行导入的脚本之前不会开始接收其他消息。或者它会暂停执行,因为它是一个单独的线程? - CambridgeMike
importScript / importScripts 是同步函数,因此无法在运行时在工作程序脚本中对这些函数进行填充(与工作程序的任何通信都是异步的)。理论上,这也可以通过首先扫描工作字符串来进行填充 importScript(...),获取数据并替换内容,但后来我正在接近一个完整的脚本加载器,这是相当多的工作(并且它不是100%可靠,因为静态分析无法分辨将要加载什么当你使用 var file = 'x.js';importScript(file)。 (未完待续) - Rob W
我建议编写/使用内联的build / shell脚本 importScript 调用,因此可以将工作者加载到单个“网络”请求中。虽然 chrome-extension:// 资源具有很少的网络延迟,不得不加载它们的负载确实会影响性能。我亲自用 r.js 在部署基于contentcript的扩展之前将我的JS模块合并为一个。 - Rob W
@CambridgeMike FYI,我添加了另一个允许使用的补丁 importScripts 在内容脚本中 Worker秒。 - Rob W


答案:


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

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

看到 patch-worker.js (文件)用于执行先前的想法。

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


15
2018-03-28 17:42



哦,伙计,这是一个无聊的错误。此脚本非常适合加载我的Web worker。现在我遇到了importScript在worker中不起作用的问题,我明白了 Failed to execute 'importScripts' on 'WorkerGlobalScope': The URL 'lunr.min.js' is invalid - CambridgeMike
实际上,看起来我需要在eventlistener中执行importScript,并传递chrome.extension.getURL返回的路径。这感觉非常草率,因为无法保证我的工作人员在importScript完成并执行导入的脚本之前不会开始接收其他消息。或者它会暂停执行,因为它是一个单独的线程? - CambridgeMike
importScript / importScripts 是同步函数,因此无法在运行时在工作程序脚本中对这些函数进行填充(与工作程序的任何通信都是异步的)。理论上,这也可以通过首先扫描工作字符串来进行填充 importScript(...),获取数据并替换内容,但后来我正在接近一个完整的脚本加载器,这是相当多的工作(并且它不是100%可靠,因为静态分析无法分辨将要加载什么当你使用 var file = 'x.js';importScript(file)。 (未完待续) - Rob W
我建议编写/使用内联的build / shell脚本 importScript 调用,因此可以将工作者加载到单个“网络”请求中。虽然 chrome-extension:// 资源具有很少的网络延迟,不得不加载它们的负载确实会影响性能。我亲自用 r.js 在部署基于contentcript的扩展之前将我的JS模块合并为一个。 - Rob W
@CambridgeMike FYI,我添加了另一个允许使用的补丁 importScripts 在内容脚本中 Worker秒。 - Rob W