了解 Firefox 扩展结构



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

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

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

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

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

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

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

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

最新更新