2

У меня есть firefox addon, который вводит два сценария содержания на все страницы.firefox sdk: redefine content-script function

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, если используется общий.

Что мне нужно - при необходимости - redefina generic 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, и я сделал его работу (url to SO question)

Спасибо за советы.

ответ

1

Правильно, скрипты, добавленные через pagemod, находятся в другой песочнице JS из добавленных tabs.attach. Что вы можете сделать, это вставить функции в фактическое окно с помощью новой функции exportFunction() - таким образом, функция находится в реальном окне и всегда будет перезаписана. Затем вы можете вызвать его из unsafeWindow ..