我想使用Firefox 3.5中引入的Web Worker工具来增强我正在处理的Greasemonkey脚本。
这甚至可能吗?
我做了一些实验,但我无法解决从任意域加载工作脚本的问题。
例如,这不起作用:
var myWorker = new Worker("http://dl.getdropbox.com/u/93604/js/worker.js");
此代码在我的Firebug控制台中生成错误消息:
无法加载脚本: http://dl.getdropbox.com/u/93604/js/worker.js (nsresult = 0x805303f4)
显然存在一个限制,它不允许您从与调用脚本的基本URL无关的URL启动工作程序。你可以在这样的相对URL上加载一个工作者脚本:
var myWorker = new Worker("worker.js");
但是我无法在用户的文件系统上获取工作脚本,以便它可以位于相对于调用脚本的路径上。
我搞砸了吗?我是否应该放弃尝试在Greasemonkey脚本中使用工作人员?答案 0 :(得分:8)
多年来我一直认为在通用汽车中使用网络工作者是不可能的。当然,第一个想法是使用data-urls。但是Worker
构造函数似乎并没有接受它们。
今天我再次尝试了它,一开始没有任何问题。只有当我开始使用GM API的功能时,Worker
构造函数才会停止工作。
看起来Firefox有一个错误,阻止您从具有X射线视觉的沙箱访问Worker
。即使评估typeof Worker
也会引发异常。所以使用worker的唯一方法是从unwrapped窗口中获取展开的版本:
var echoWorker = new unsafeWindow.Worker("data:text/javascript," +
"self.onmessage = function(e) {\n" +
" self.postMessage(e.data);\n" +
"};"
);
当然,你必须小心特殊字符。使用base64编写脚本更好:
var dataURL = 'data:text/javascript;base64,' + btoa(script);
var worker = unsafeWindow.Worker(dataURL);
或者您也可以使用blob-urls:
var blob = new Blob([script], {type: 'text/javascript'});
var blobURL = URL.createObjectURL(blob);
var worker = new unsafeWindow.Worker(blobURL);
URL.revokeObjectURL(blobURL);
如果您确实想要使用托管在其他域上的脚本,这不是问题,因为相同的源政策不适用于GM_xmlhttpRequest
:
function createWorkerFromExternalURL(url, callback) {
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
var script, dataURL, worker = null;
if (response.status === 200) {
script = response.responseText;
dataURL = 'data:text/javascript;base64,' + btoa(script);
worker = new unsafeWindow.Worker(dataURL);
}
callback(worker);
},
onerror: function() {
callback(null);
}
});
}
答案 1 :(得分:3)
答案 2 :(得分:1)
到现在(10年后),可以将Web Workers与Firefox 77和Tampermonkey一起使用。我已经使用内联工作程序成功测试了
var blob = new Blob(["onmessage = function(e){postMessage('whats up?');console.log(e.data)}"], {type: 'text/javascript'})
var url = URL.createObjectURL(blob)
var worker = new Worker(url)
worker.onmessage = function(e){
console.log(e.data)
}
worker.postMessage('hey there!')
使用Chrome或Greasemonkey或Violentmonkey等其他扩展程序时,由于CSP worker-src而无法正常工作(请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/worker-src上的违规案例)。这就是为什么无法使用HTTP URL或字符串作为Worker构造函数的参数,而在这种非常特殊的情况下,仅适用于Blob URL的原因。
不过,关于“工人”的上下文仍然存在一些问题。他们无法访问DOM,窗口,文档或父对象(请参见https://www.html5rocks.com/en/tutorials/workers/basics/上可供工作者使用的功能)。