У меня есть аддон firefox, который внедряет два скрипта контента на все страницы.
var workers = [];
pageMod.PageMod({
include: "*",
contentScriptFile: [
self.data.url("content/autofill/lib_generic.js"),
self.data.url("content/autofill/lib.js"),
],
// add worker to the list
onAttach: function(worker)
{
workers.push(worker);
var filename = getDomainSpecificFilename(worker.contentURL);
worker.on("detach", function()
{
var index = workers.indexOf(worker);
if (index >= 0)
workers.splice(index, 1);
});
}
});
lib_generic.js
содержит одну функцию с именем apply_forms(...)
(ее описание не важно). Функция вызывается из lib.js
файла. Но эта процедура не работает с несколькими страницами, поэтому для каждой такой страницы у меня есть свой скрипт - эти файлы тоже содержат только одну функцию с именем apply_forms(...)
.
У меня есть функция, которая принимает текущий домен в качестве входных данных и возвращает имя желаемого конкретного скрипта или false
, если следует использовать общий.
Что мне нужно, так это - когда это необходимо - переопределить общий apply_forms
с конкретным apply_forms
.
я пытался использовать
tabs.activeTab.attach({
contentScriptFile: [ filename ]
});
worker.port.emit("apply_forms_loaded");
и в одном из скриптов контента:
вар apply_forms_loaded = ложь;
self.port.on("apply_forms_loaded", function() {
console.log("LOADED");
apply_forms_loaded = true;
});
и вся процедура начинается так:
var timer;
timer = setInterval(function(){
if (apply_forms_loaded) {
clearInterval(timer);
start(); // apply_forms is called somewhere inside this call
}
}, 10);
К сожалению, кажется, что tabs.activeTab.attach
вводит сценарии содержимого в другой контекст, поэтому общая функция вызывается всегда.
Могу ли я что-нибудь сделать, чтобы убедить activeTab
добавить сценарии контента в том же контексте, или я должен сделать это по-другому? (а какой)
Или проблема может быть в том, я не знаю, что сценарий содержимого не полностью внедряется, когда я отправляю сообщение apply_forms_loaded
?
Я пытался переопределить определение функции также для Chrome, и я заставил его работать (ссылка на ТАК вопрос)
Спасибо за совет.