有没有一种方法可以自定义Firefox插件而无需实际触摸插件代码?

问题描述:

我想扩展一个现有的Firefox插件,这对我来说很特别(因此与这个插件的其他用户无关)。 如何在不实际应用对插件代码的更改的情况下覆盖或钩入JavaScript方法? 有没有像一个特殊的地方,可以把附加代码后解释额外的文件?有没有一种方法可以自定义Firefox插件而无需实际触摸插件代码?

修改插件代码本身意味着每次插件更新时我的更改都会丢失。

是否有一个通用的概念来实现这个目标?

编辑了解更多信息:我试图扩展的插件是用于定制domReady上的网站功能和显示信息。我想改变插件的行为来显示更特别的东西。 为此,我需要在插件代码后执行我的代码,但在domReady事件之前,即使用小书签在此情况下不起作用。

最好的问候, 彼得

+0

我相信一般的回答基本上是“不”,但也有许多方式与另一部分互动(通过XPCOM例如,通过捕捉观察者通知可能被发送出去,通过抓住可能暴露的全局变量)。你究竟想要做什么?更多信息可能有帮助。 – 2011-03-07 18:37:59

+0

感谢您的评论 - 只是用更多的信息更新了问题。由于存在可覆盖该方法的全局变量,所以它是一个时间问题而不是访问问题。即在插件代码之后但在domReady事件之前执行。 – 2011-03-07 18:52:49

+0

哦,太棒了,插件的插件!一旦你完成了,我会为你的插件的插件写一个插件! – syockit 2011-03-25 11:45:13

我想补充你的代码,并保持它的备份,以便能够更新后,将其重新添加。

您还可以创建监听时,插件代码运行,可能像

function listener() { 
    setTimeout(function(){ 
    if (document.getElementById('someId').style.prop === 'changed?') { 
     startYourAddon(); 
    } else { 
     listener(); //then there's a timeout, it would more logically fit around this call 
    } 
    }, 5); 
} 
listener(); 

没有通用的解决方案的插件。您需要研究加载项的源代码并检查您要扩展的部分以及如何完成。例如,要扩展的插件可能会定义浏览器窗口覆盖并在其中加载其脚本。它定义了您想要扩展的功能MyExtension.doSomething()。您可以通过定义自己的叠加层并将其应用于叠加层来完成。例如。他们chrome.manifest包含行:

overlay chrome://browser/content/browser.xul chrome://myextension/content/overlay.xul 

您以下添加到您自己的chrome.manifest

overlay chrome://myextension/content/overlay.xul chrome://myextensionaddon/content/overlay.xul 

哪里myextensionaddon是你自己的附加的铬命名空间。和您的覆盖可以运行类似下面的代码的东西:

(function() 
{ 
    // Store original method so that we can call it later 
    var oldMethod = MyExtension.doSomething; 

    // Replace the method by our own 
    MyExtension.doSomething = function() 
    { 
    // Code executed before the original method is called goes here 
    oldMethod.apply(this, arguments); 
    // Code executed after the original method is called goes here 
    }; 
})(); 

这工作,因为所有的叠加脚本在同一个上下文中执行,它们覆盖在窗口即上下文。将覆盖图应用于覆盖图可确保在覆盖图扩展后加载覆盖图。

现在扩展一个方法并不总是可能的。如果绝对没有其他的解决方案,你可以使用一个技巧来操纵他们的一个文件。为此,您在chrome.manifest中使用override instruction。例如,您覆盖附加的script.js文件用自己:

override chrome://myextension/content/script.js chrome://myextensionaddon/content/script.js 

凌驾铬的URL作品进行精确URL匹配只是意味着你仍然能够chrome://myextension/content/script.js?foo下访问原始脚本(不再由于查询刺痛而完全匹配,但查询字符串对您获得的内容没有影响)。你script.js文件可能是这样的:

// Code executed before the original file is loaded goes here 

// Load the original script now 
Components.classes["@mozilla.org/moz/jssubscript-loader;1"] 
      .getService(Components.interfaces.mozIJSSubScriptLoader) 
      .loadSubScript("chrome://myextension/content/script.js?foo"); 

// Code executed after the original file is loaded goes here