Помогите мне создать расширение Firefox (Javascript XPCOM Component)

Я просматривал различные учебные пособия и знаю, что я близок, но теряюсь в деталях реализации, потому что некоторые из них немного устарели, а некоторые вещи изменились после Firefox 3. Я уже написал javascript для расширение Firefox, теперь мне нужно превратить его в компонент XPCOM.

Это функциональность, которая мне нужна: мой файл Javascript прост, у меня есть две функции startServer() а также stopServer, Мне нужно бежать startServer() когда браузер запускается и stopServer() когда Firefox выходит.

Редактировать:

Я обновил свой код рабочим решением (спасибо Нейлу). Следующее в 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.

Когда срабатывает уведомление о профиле после изменения, ваш компонент создается и вызывается метод наблюдения. Здесь вы запускаете свой сервер и также просите соблюдать уведомление о выходе из приложения. Обратите внимание, что это также вызывает метод наблюдения, поэтому он должен проверить, какое уведомление он получает.

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;
    }
  }
};
Другие вопросы по тегам