Firefox SDK: переопределить функцию content-script

У меня есть аддон 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, и я заставил его работать (ссылка на ТАК вопрос)

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


person dakov    schedule 09.09.2014    source источник


Ответы (1)


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

person therealjeffg    schedule 14.09.2014