Я просматривал разные руководства и знаю, что близок к этому, но я теряюсь в деталях реализации, потому что некоторые из них немного устарели, а некоторые вещи изменились по сравнению с Firefox 3. У меня уже есть написал javascript для расширения Firefox, теперь мне нужно превратить его в компонент XPCOM.
Это функциональность, которая мне нужна: мой файл Javascript простой, у меня есть две функции startServer()
и stopServer
. Мне нужно запустить startServer()
при запуске браузера и stopServer()
при закрытии браузера.
Редактировать:
Я обновил свой код рабочим решением (спасибо Нилу). Следующее находится в 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);
}