帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)
Posted
技术标签:
【中文标题】帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)【英文标题】:Help me create a Firefox extension (Javascript XPCOM Component) 【发布时间】:2011-01-29 02:06:54 【问题描述】:我一直在看不同的教程,我知道我已经接近了,但我迷失在实现细节上,因为其中一些有点过时了,而且自 Firefox 3 以来有一些事情发生了变化。我已经@ 987654321@,现在我要把它做成一个XPCOM组件。
这是我需要的功能:
我的 javascript 文件很简单,我有两个函数 startServer()
和 stopServer
。我需要在浏览器启动时运行startServer()
,在firefox 退出时运行stopServer()
。
编辑:
我已使用可行的解决方案更新了我的代码(感谢 Neil)。以下在MyExtension/components/myextension.js
。
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
const CI = Components.interfaces, CC = Components.classes, CR = Components.results;
// class declaration
function MyExtension()
MyExtension.prototype =
classDescription: "My Firefox Extension",
classID: Components.ID("xxxx-xxxx-xxx-xxxxx"),
contractID: "@example.com/MyExtension;1",
QueryInterface: XPCOMUtils.generateQI([CI.nsIObserver]),
// add to category manager
_xpcom_categories: [
category: "profile-after-change"
],
// start socket server
startServer: function () /* socket initialization code */ ,
// stop socket server
stopServer: function () /* stop server */ ,
observe: function(aSubject, aTopic, aData)
var obs = CC["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService);
switch (aTopic)
case "quit-application":
this.stopServer();
obs.removeObserver(this, "quit-application");
break;
case "profile-after-change":
this.startServer();
obs.addObserver(this, "quit-application", false);
break;
default:
throw Components.Exception("Unknown topic: " + aTopic);
;
var components = [MyExtension];
function NSGetModule(compMgr, fileSpec)
return XPCOMUtils.generateModule(components);
【问题讨论】:
【参考方案1】:据我所知,您的所有代码都进入了您的组件。
您需要一个表示您的组件的 JavaScript 对象并将其注册到组件注册器。 (它可以是一个新对象,或者您可以对现有对象进行多任务处理。)执行此操作的方式取决于您的目标是 Firefox 3.x 还是 Firefox 4。
您需要使用类别管理器注册profile-after-change
通知。执行此操作的方式还取决于您的目标是 Firefox 3、Firefox 3.5/6 还是 Firefox 4。
当 profile-after-change 通知触发时,您的组件将被创建并调用 observe 方法。这是您启动服务器并要求观察退出应用程序通知的地方。请注意,这也调用了观察方法,因此它必须检查它收到的通知。
function myExt()
myExt.prototype =
observe: function(aSubject, aTopic, aData)
switch (aTopic)
case "quit-application":
stopServer();
obs.removeObserver(this, "quit-application");
break;
case "profile-after-change":
startServer();
obs.addObserver(this, "quit-application", false);
break;
;
【讨论】:
到目前为止,我已经用我的更改更新了我的代码。该组件已在 compreg.dat 中注册,但未调用 observe: 函数。 那么,compreg.dat 在 a) [COMPONENTS] b) [CLASSIDS] c) [CONTRACTIDS] d) [CATEGORIES] 下是否有您的组件条目? 是的,通过不使用 XPCOMUtils 模块进行查询接口和 XPCOM 注册,我终于让它工作了。我不得不编写更多代码,但我仍然很好奇为什么我使用该模块时它不起作用。 感谢您的更新,这让我意识到您的 QueryInterface 宣传了错误的接口,您需要将 nsIObserver 宣传为您的接口之一。 感谢您的关注。那是我的问题。以上是关于帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)的主要内容,如果未能解决你的问题,请参考以下文章
Firefox 4 扩展文件。创建唯一异常:NS_ERROR_FAILURE
Firefox扩展程序,用于创建新图标或替换位置/地址栏中的现有图标
Firefox 84.0 正在更改下载文件的自定义文件扩展名