Пишем дополнение к Firefox

Как всегда принцип рассмотрим на примере приложения Hello world! Мы слава богу русский знаем лучше английского, так что будем им пользоваться))) Напишем «Привет мир!». Сразу покажу как это будет выглядеть:

Как видите следом за меню «Справка» добавлен новый пункт 😉 Итак начнём!

Дополнения Firefox имеют расширение XPI. Произносится на удивления «зиппи». Не пугайтесь это просто завуалированный зип архив. Вот архив с рассматриваем дополнением. Предлагаю его скачать и рассмотреть.

Распакуйте любой удобной вам утилитой.. Вы увидите каталог «chrome» и два файла — chrome.manifest и install.rdf
Такая структура будет сохранятся в любых ваших приложениях.

Рассмотрим файл install.rdf. Он написан в формате RDF (таком себе переделанном XML). Чтобы дать браузеру понять что это файл в правильном формате необходимо указывать такие строки:

<?xml version=»1.0″?>

<RDF xmlns=»https://www.w3.org/1999/02/22-rdf-syntax-ns#«

  xmlns:em=»https://www.mozilla.org/2004/em-rdf#«>

После них слудуют строки определяющие id приложения.
Откроем секцию   <Description about=»urn:mozilla:install-manifest»> и начнём её заполнять:

Укажем id приложения:

<em:id>helloworld@how2.org.ua</em:id>

ID может задаваться разными форматами. Я задал в формате <приложение>@<домен>. Другим методом может быть генерация uuid. Если вы пользователь Linux вы можете воспользоваться утилитой uuidgen. В других ОС есть подобны…

Теперь оприделим название дополнение:

<em:name>XUL Привет мир!</em:name>

Его описание:

<em:description>Описание «Привет мир!»</em:description>

версию:

<em:version>0.1</em:version>

Домашнюю страницу:

<em:homepageURL>«>https://how2.org.ua/</em:homepageURL>

Тип дополнения:

<em:type>2</em:type>

2 — аддоны
4 — темы
8 — локализации
32 — темы иконок

Теперь необходимо оприделить, что дополнение будет для браузера Firefox и указать поддерживаемые версии:

<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>3.0</em:minVersion>
<em:maxVersion>3.6.*</em:maxVersion>
</Description>
</em:targetApplication>

Таким  образом мы указали, что данное дополнение для версий Firefox 3.0 и 3,6,* . id Firefox неизменен и служит для определения приложения (у mozilla ведь не только одни браузер).

Теперь приступим к файлу chrome.manifest. Он содержит сведения о файлах дополнения.

content   xulschoolhello                     jar:chrome/xulschoolhello.jar!/content/

skin      xulschoolhello   classic/1.0    jar:chrome/xulschoolhello.jar!/skin/

locale    xulschoolhello    ru               jar:chrome/xulschoolhello.jar!/locale/ru/

overlay chrome://browser/content/browser.xul  chrome://xulschoolhello/content/browserOverlay.xul

Первое слово сообщает Firefox о предмете декларирования (content, locale и skin). Второе — имя пакета. skin и locale имеют третье ключевое слово, которое указывает какую локализацию или скин они улучшают. Последний столбец указывает в какой папке искать контент. jar: указывает что данные необходимо искать в jar файле.

Последняя строка даёт браузеру понять, что ему необходимо добавить данные из файла browserOverlay.xul в файл браузера browser.xul
Файлы XUL определяют внешний вид браузера.

Перейдём к обзору каталога chrome там вы найдёте jar архив. Распакуем его. Внутри указанные нами каталоги.
Рассмотрим browserOverlay.xul. Первые несколько строк указывают тип файла, пропустим их..

Оприделим главный элемент у нас это overlay вы также можете использовать window или dialog:

<overlay id=»xulschoolhello-browser-overlay»
xmlns=»https://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul«>

id — должен быть уникален везде в XUL. Второй параметр указывает что этот и все дочерние элементы — XUL

Подключим необходимые файлы:

<script type=»application/x-javascript»
src=»chrome://xulschoolhello/content/browserOverlay.js» />

Правда похоже на html ?

Теперь приступим непосредственно к добавлению нового пункта меню — «Привет мир!».

<menubar id=»main-menubar»>
<menu id=»xulschoolhello-hello-menu» label=»&xulschoolhello.hello.label;»
accesskey=»&xulschoolhello.helloMenu.accesskey;» insertafter=»helpMenu»>
<menupopup>
<menuitem id=»xulschoolhello-hello-menu-item»
label=»&xulschoolhello.hello.label;»
accesskey=»&xulschoolhello.helloItem.accesskey;»
oncommand=»XULSchoolChrome.BrowserOverlay.sayHello(event);» />
</menupopup>
</menu>
</menubar>

Для написания этого кода необходимы некоторые знания XUL. main-menubar — главное меню браузера.
Добавляем наш пункт в меню после меню «Справка»:

insertafter=»helpMenu»

При нажатии вызываем сообщение:

oncommand=»XULSchoolChrome.BrowserOverlay.sayHello(event);»

Эта команда — событие javascript. Наступает при нажатии любым способом.

Оприделим имя элемента:

label=»&xulschoolhello.hello.label;

И клавиши доступа к нему:

accesskey=»&xulschoolhello.helloItem.accesskey;»

Теперь рассмотрим browserOverlay.js:

if («undefined» == typeof(XULSchoolChrome)) {
var XULSchoolChrome = {};
};

Эта конструкция создаёт объект XULSchoolChrome. Это сделано именно так, чтобы обеспечить «бесконфликтность» дополнения с другими имеющимися. Учтите что все объекты и переменные, которые мы создаём глобальны и доступны другим дополнениям и браузеру. Мы создаём объект, толькое если таковой не задан.

Теперь зададим действия дополнения. Оприделим обект BrowserOverlay и функцию вывода сообщения sayHello внутри него:

XULSchoolChrome.BrowserOverlay = {
sayHello : function(aEvent) {
let stringBundle = document.getElementById(«xulschoolhello-string-bundle»);
let message = stringBundle.getString(«xulschoolhello.greeting.label»);
window.alert(message);
}
};

Текст сообщения выбирается из файла который мы рассмотрим позже. Сначала выбирается «пузырь» со строкой при помощи DOM, а затем уже из него выбирается строка.

Перейдём к папке locale. В ней находятся папки локализаций. Русская локаль — ru, или ru_RU..

browserOverlay.dtd:

<!ENTITY xulschoolhello.hello.label            «Привет мир!»>

<!ENTITY xulschoolhello.helloMenu.accesskey    «l»>

<!ENTITY xulschoolhello.helloItem.accesskey    «H»>

В этом файле определяются текстовые значения всех необходимых переменных в соответствии с локалью. Грубо говоря мы наполняем значениями необходимые нам переменные.

browserOverlay.properties:

xulschoolhello.greeting.label = Привет! Ты там?

Выполняет тоже значение, но имеет другое назначение. Именно тут определяется тот самый «пузырь».

В папке skin находятся необходимые css файлы. Рассматривать их я не буду..

Вот собственно и всё.. Вот что получилось:

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий