2

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

我查看了教程,并获得了基本的文件布局。我还发现我需要使用nsITraceableChannel API并添加一个观察者来做我想做的事情,我有示例代码。

问题是,我实际上将这段代码放在哪里?我的扩展程序何时实际加载和执行?它是在后台持续异步运行,还是按页面视图加载?

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

谁能解释一下 Firefox 扩展是如何工作的,我应该把我的实际 JavaScript 代码放在哪里来监控请求?或者我是否完全了解扩展名有什么问题?附加组件、扩展和插件之间有区别吗?

4

1 回答 1

9

关于附加组件、扩展和插件之间的区别,你应该看看这个答案。但总的来说,你似乎有正确的想法。

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

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