Сегодня я хотел бы рассказать о том, как можно реализовать систему настроек для своего расширения. Начиная с определения опций и заканчивая добавлением в ваше расширение возможности менять настройки с помощью созданных вами диалоговых окон.
Первую статью, надеюсь из будущего цикла моих статей, можно найти здесь.
Система настроек расширений в Firefox имеет очень простую структуру. Наберите в адресной строке about:config, и вы увидите все настройки не только самого браузера, но и всех установленных расширений. Тут же их можно изменить под свои нужды.
Чтобы ваше расширение имело собственный набор настроек, нужно создать каталог defaults/preferences
(если он ранее не был создан) и поместить туда .js-файл с настройками. Вот пример такого файла.
- pref("extensions.sample.username", "Joe");
- pref("extensions.sample.sort", 2);
- pref("extensions.sample.showAdvanced", true);
* This source code was highlighted with Source Code Highlighter.
Таким образом, мы создали набор настроек по-умолчанию. Перезапустите Firefox. Теперь просмотреть, а также изменить значения этих параметров можно на странице about:config
.
Чтение настроек
Следующий отрывок кода показывает, как получить доступ к настройкам:
- init : function()
- {
- this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService)
- .getBranch("extensions.sample.");
- this.prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
- this.prefs.addObserver("", this, false);
- }
* This source code was highlighted with Source Code Highlighter.
Последняя строка функции init
указывает, что все события, связанные с изменением настроек, должны посылаться нашему объекту.
Итак, теперь переменная this.prefs
ссылается на объект с интерфейсом nsIPrefBranch. Прочитать значения какой либо опции можно следующим образом:
- this.prefs.getCharPref("username");
* This source code was highlighted with Source Code Highlighter.
Т.к. при инициализации объекта настроек мы указали в качестве пространства имен extensions.sample.
, то будет прочитана опция extensions.sample.username
, которую мы создали ранее.
Дополнительно о методах предоставляемых интерфейсом nsIPrefBranch
можно прочитать тут.
Изменение настроек
Для изменения настроек вашего расширения есть возможность создать диалоговое окно, в котором можно будет отобразить нужные вам опции, и пользователь сможет менять их значения на нужные ему.
Создайте файл options.xul
в каталоге chrome/content
и добавьте в него следующее содержимое:
- <?xml version="1.0"?>
- <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
- <prefwindow id="test-prefs"
- title="Test options"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
- <prefpane id="test-pane" label="Test Settings">
- <preferences>
- <preference id="pref_username" name="extensions.sample.username" type="string"/>
- </preferences>
- <hbox align="center">
- <label control="username" value="Username: "/>
- <textbox preference="pref_username" id="username" maxlength="24"/>
- </hbox>
- </prefpane>
- </prefwindow>
* This source code was highlighted with Source Code Highlighter.
Теперь по порядку:
<prefpane>
— является контейнером для элементов управления диалогового окна, также этот элемент содержит ссылки на настройки компонента<preferences>
— содержит ссылки на опции вашего компонента<preference>
— ссылка на опцию. В параметреname
указывается имя опции, в параметреtype
тип этой опции (string
,int
илиboolean
), параметрid
задает идентификатор настройки внутри диалогового окна, по которому уже элементы управления будут сами считывать и записывать значения настроек (посмотрите на атрибутpreference
элементаtextbox
)- Далее следуют элементы управления диалогового окна, с помощью которых можно изменить опции вашего расширения
Если вы создали этот файл для уже установленного расширения, то необходимо это расширение удалить и установить заново, чтобы кнопка «Настройка» стала доступной.
И последнее, о чем я хотел рассказать — это реакция расширения на какие-либо изменения его настроек. В самом начале мы указали, что хотим обрабатывать все сообщения, связанные с изменением настроек. Вот пример функции, которая может с этим справиться:
- observe: function(subject, topic, data)
- {
- if (topic != "nsPref:changed")
- {
- return;
- }
- switch(data)
- {
- case "username":
- alert(this.getUserName());
- break;
- }
- }
* This source code was highlighted with Source Code Highlighter.
Коротко о входных параметрах:
subject
— ссылка на измененный объект или событие (подробней тут)topic
— указывает на тип события, нас в данном случае интересует «nsPref:changed»data
— это данные, передаваемые вместе с событием, в нашем случае это будет имя опции, которую изменили
Это необходимый минимум для работы с настройками расширений, более подробно можно об этом узнать по предоставленным мною ссылкам или на сайте developer.mozilla.org.
Исходники примера можно взять здесь.