我正在尝试编写一个Firefox扩展,拦截某个HTTP请求并返回静态内容,而不会将请求发送到实际的服务器(类似于AdBlock)。
我已经查阅了教程,并且我有一个基本的文件布局。我还得出结论,我需要使用nsITraceableChannel API并添加一个观察者来做我想做的事情,并且我有示例代码。
问题是,我在哪里实际放置此代码?我的扩展程序何时实际加载并执行?它是在后台持续和异步运行还是在每页视图中加载?
文档似乎不是很清楚。这个扩展不需要GUI,所以我不需要布局XUL文件(或者我?)。我尝试编写一些XPCOM(我认为我没做对)组件,在chrome.manifest
中注册但它似乎没有运行。
任何人都可以确切地解释Firefox扩展如何工作以及我应该在哪里放置我的实际JavaScript代码来监控请求?或者我是否完全了解扩展是错误的?附加组件,扩展程序和插件之间有区别吗?
答案 0 :(得分:8)
关于加载项,扩展和插件之间的区别,您应该查看this answer。但总的来说,你似乎有正确的想法。
问题是,目前有三种非常不同的扩展类型:
chrome.manifest
as of Gecko 2.0)。此组件将在首次使用时加载,并在整个浏览会话中保持不变。您可能希望在浏览器启动时加载您的组件,为此您应该在profile-after-change
类别中注册它并实现nsIObserver
。bootstrap.js
脚本,在激活扩展时会加载,此上下文将在后台保持不变,直到浏览器关闭或扩展被禁用。您也可以在无重启的扩展中使用XPCOM组件,但您必须手动注册它们(通过nsIComponentRegistrar.registerFactory()和nsICategoryManager.addCategoryEntry())。如果关闭扩展,您还必须注意取消注册组件。如果您只需要添加观察者,则不需要这样做,nsIObserverService将采用任何实现nsIObserver
的对象,而不仅仅是已注册为XPCOM组件的对象。最大的缺点是:大多数MDN示例都是关于经典扩展的,并没有解释如何在无重启的扩展中执行操作。main.js
自动加载,并且可以根据需要加载其他模块。加载后,只要扩展处于活动状态,每个模块都会保持不变。它们运行沙盒,但您仍然可以leave the sandbox直接访问XPCOM。但是,您可能会使用内部observer-service
module代替。