了解Firefox扩展结构

时间:2012-06-14 08:41:59

标签: javascript firefox-addon

我正在尝试编写一个Firefox扩展,拦截某个HTTP请求并返回静态内容,而不会将请求发送到实际的服务器(类似于AdBlock)。

我已经查阅了教程,并且我有一个基本的文件布局。我还得出结论,我需要使用nsITraceableChannel API并添加一个观察者来做我想做的事情,并且我有示例代码。

问题是,我在哪里实际放置此代码?我的扩展程序何时实际加载并执行?它是在后台持续和异步运行还是在每页视图中加载?

文档似乎不是很清楚。这个扩展不需要GUI,所以我不需要布局XUL文件(或者我?)。我尝试编写一些XPCOM(我认为我没做对)组件,在chrome.manifest中注册但它似乎没有运行。

任何人都可以确切地解释Firefox扩展如何工作以及我应该在哪里放置我的实际JavaScript代码来监控请求?或者我是否完全了解扩展是错误的?附加组件,扩展程序和插件之间有区别吗?

1 个答案:

答案 0 :(得分:8)

关于加载项,扩展和插件之间的区别,您应该查看this answer。但总的来说,你似乎有正确的想法。

问题是,目前有三种非常不同的扩展类型:

  1. 经典扩展程序(不重启):这些通常会overlay the browser window并从此叠加层运行代码。由于每个窗口有一个覆盖,因此将有与浏览器窗口一样多的代码实例。但是,经典扩展也可以注册XPCOM组件(via chrome.manifest as of Gecko 2.0)。此组件将在首次使用时加载,并在整个浏览会话中保持不变。您可能希望在浏览器启动时加载您的组件,为此您应该在profile-after-change类别中注册它并实现nsIObserver
  2. 无重新启动的扩展,也称为bootstrapped extensions:这些扩展无法注册叠加层,这使得使用浏览器UI变得更加复杂。相反,它们有一个bootstrap.js脚本,在激活扩展时会加载,此上下文将在后台保持不变,直到浏览器关闭或扩展被禁用。您也可以在无重启的扩展中使用XPCOM组件,但您必须手动注册它们(通过nsIComponentRegistrar.registerFactory()nsICategoryManager.addCategoryEntry())。如果关闭扩展,您还必须注意取消注册组件。如果您只需要添加观察者,则不需要这样做,nsIObserverService将采用任何实现nsIObserver的对象,而不仅仅是已注册为XPCOM组件的对象。最大的缺点是:大多数MDN示例都是关于经典扩展的,并没有解释如何在无重启的扩展中执行操作。
  3. 基于Add-on SDK的扩展:这些扩展基于生成无重启扩展的框架。附加组件SDK的own API与您在Firefox扩展程序中的操作非常不同 - 但它很简单,它主要负责关闭扩展程序以便您不必这样做手动。这里的扩展包含许多模块,main.js自动加载,并且可以根据需要加载其他模块。加载后,只要扩展处于活动状态,每个模块都会保持不变。它们运行沙盒,但您仍然可以leave the sandbox直接访问XPCOM。但是,您可能会使用内部observer-service module代替。