В течение многих лет я думал, что невозможно использовать веб-работников в GM. Конечно, первая идея состояла в том, чтобы использовать URL-адреса данных. Но конструктор Worker
, похоже, не принял их.
Сегодня я попробовал еще раз, и сначала он работал без проблем. Только когда я начал использовать функции GM API, конструктор Worker
перестал работать.
Кажется, в Firefox есть ошибка, которая не позволяет вам получить доступ к Worker
из песочницы с рентгеновским зрением. Даже оценка typeof Worker
вызывает исключение. Таким образом, единственный способ использовать рабочих - это получить развернутую версию из развернутого окна:
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-URL:
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);
}
});
}