Do You Know How To: «Preferences» и «Install Location» в FireFox 4 betas?

Здравствуй хабр.

Являясь разработчиком дополнения к FireFox решил написать свои мысли по мотивам недавней статьи «Совместимость дополнений с Firefox 4...» от одного известного автора.

В мыслях меня интересовало то, что вынесено в заголовок, а именно объект Preferences и как получить путь к «Install Location».

Под катом код и описание к нему.



Как нетрудно догадаться большая часть уже написана и в той статье, а конкретно стоило, конечно обратить внимание на это.

Тем не менее, не все сразу ясно и понятно, поэтому проведя ревизию своего дополнения я решил рассказать Вам, ну, вдруг кому-нибудь будет интересно?

Мое дополнение активно работает с Preferences и файловой системой, конкретно с папкой, в которой само и лежит, там хранится библиотека книг. Поэтому, когда я пару недель назад узнал, что в 4й версии ничего не работает, я решил заняться этим на досуге. Досуг случился сегодня, и вот что мне открылось.

Сразу оговорюсь об используемых мной сокращениях:

var CI = Components.interfaces;
var CC = Components.classes;
var pref = "ветка вашего дополнения в preferences " // у меня "extensions.kbtrainerff."
var ext_id = "id вашего дополнения" // у меня "kbtrainerff@gmail.com"



Теперь, пожалуй, начнем.

Preferences :



Было:

preferences_object = CC["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefService).getBranch(pref);


Стало:

var CU = Components.utils
CU.import("resource://gre/modules/Services.jsm");
preferences_object = Services.prefs.getBranch(pref);


Определение пути к папке дополнения:



Тождественно равно к вашему [addon | extension | «приложению»].

Было:

preferences_object = CC["@mozilla.org/extensions/manager;1"].getService(CI.nsIExtensionManager).getInstallLocation(ext_id);


Стало:

Это была проблема, но, как оказалось, порывшись в объектной модели и в «document.location = about:config» – она вполне решаема.
Решение, спорное, но имеющееся:

var CU = Components.utils
CU.import("resource://gre/modules/Services.jsm");
var ic = Services.prefs.getBranch("extensions.");
var ics = eval(ic.getCharPref("installCache"));

for(var i = 0; i < ics.length; i++){
    var obj = ics[i];
    if(obj.name == "app-profile"){
        if(obj["addons"] != undefined){
            if(obj["addons"][ext_id] != undefined){
                if(obj["addons"][ext_id]["descriptor"] != undefined){
                    extdir = obj["addons"][ext_id]["descriptor"];
                    break;
                }
            }
        }
    }
}

alert(extdir);


Делаем это файлом.

var theFile = CC[@mozilla.org/file/local;1"].createInstance(CI.nsILocalFile);
Install_Location = theFile.initWithPath(extdir);


На этом всё :)

Наслаждайтесь!

* This source code was highlighted with Source Code Highlighter.

UPD : свежий kbTrainer 0.1.2 for FireFox
+3
23 июля 2010, 17:37
3
wentout 16,1

комментарии (4)

+1
vmb #
Странно. У меня в 4.0b3pre работает вариант с nsIPrefService. Откуда информация, что его удаляют?
0
wentout #
У меня в 4.0b1pre не заработало, как раз из-за того, что не было nsIPrefService
0
wentout #
Хотя, прошу прощения, ошибся, nsIPrefService как раз остался.

Extension Manager — вот кого не будет. Это в самом конце https://developer.mozilla.org/en/Firefox_4_for_developers

Собственно, получается, что важен только второй пункт из того, что я написал, sorry, ups.
0
vmb #
Ничего, хорошо что нет теперь недоумений.
Удачи в разработке.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.