Помогите мне создать расширение Firefox (Javascript XPCOM Component) - PullRequest
9 голосов
/ 29 января 2011

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

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

Edit:

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

5 голосов
/ 29 января 2011

Насколько я могу судить, весь ваш код входит в ваш компонент.

Вам необходим объект 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;
    }
  }
};
...