firefox-sdk:重新定义内容脚本函数

firefox sdk: redefine content-script function

本文关键字:脚本 函数 定义 新定义 firefox-sdk      更新时间:2023-09-26

我有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");

并且在其中一个内容脚本中:

var apply_forms_loaded=false;

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似乎在不同的上下文中注入了内容脚本,所以通用函数被称为allways。

我能做些什么来说服activeTab在相同的上下文中添加内容脚本吗?还是应该用不同的方式?(然后是哪一个)

或者问题可能是——我不知道——当我发送apply_forms_loaded消息时,内容脚本并没有完全注入?

我一直在尝试为Chrome重新定义函数定义,并使其发挥作用(url到SO问题)

谢谢你的建议。

没错,通过pagemod添加的脚本与通过tabs.attach添加的脚本位于不同的JS沙盒中。您可以使用新的exportFunction()函数将函数注入实际窗口中,这样函数就在实际窗口中并且总是被覆盖。然后您可以从unsafeWindow调用它。。