Как самому сделать любимый браузер еще лучше

Создание расширений к Mozilla Firefox

Итак, мы с вами обсудили некоторые достаточно важные моменты в плане создания расширений для Mozilla Firefox, и теперь движемся дальше, к светлому будущему - то есть, в нашем случае, к готовому расширению.

В прошлый раз мы закончили разговор на XUL'е - поговорили о том, что именно скрывается за данной аббревиатурой и какое отношение она имеет к созданию расширений для Mozilla Firefox. И сейчас будем заниматься XUL'ом, так сказать, с практической, а не с теоретической стороны. Собственно, именно в этом занятии и состоит едва ли не самая важная часть всего процесса создания расширения для Mozilla Firefox.


XUL-слои

Поскольку записывать все сведения об интерфейсе браузера в одном XUL-файле, скажем так, не слишком удобно (да и, говоря откровенно, вряд ли бы мы с вами тогда вообще говорили о каких бы то ни было расширениях для Firefox'а). Поэтому в браузере используется несколько иной подход - интерфейс представлен в виде так называемых XUL-слоев, разнесенных по разным файлам. Это как раз и обеспечивает ту гибкость и расширяемость, которые сделали Firefox знаменитым.

Как выглядит типичный XUL-слой, можно увидеть в листинге к данной статье. В целом, думаю, данный документ не вызовет много вопросов, однако после того, как вы ознакомитесь с ним, я дам некоторые пояснения.

<?xml version="1.0"?>
<overlay id="sample"
 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <statusbar id="status-bar">
 <statusbarpanel id="my-panel" label="Hello, World" />
 </statusbar>
</overlay>

С первой строчкой, думаю, все совершенно понятно - она стандартна для всех XML-документов, и XUL-файлы, как вы сами можете убедиться, также не являются исключением из их числа. Корневой тег, overlay, дает возможность браузеру "узнать" в данном XML-файле XUL-документ. Кстати, обратите внимание на то, как именно записан URL в строке за overlay'ем. Как известно, разработчики Mozilla Firefox - те ещё шутники. Название же XUL по-английски должно произноситься примерно как "зуул" (zuul). Этот URL отсылает нас к известной комедии "Охотники за привидениями", где встречается одноименный персонаж. Фраза "There is no Dana, only Zuul" из фильма, закодированная в этом URL'е (в котором, кстати говоря, можно также увидеть ещё две отсылки к тому же фильму - "ключника" и "привратника", т.е. keymaster и gatekeeper), стала основой для девиза команды разработчиков, работающих над XUL: "There is no data, there is only XUL".

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

Тег statusbar обозначает "точку соединения" нового виджета с уже имеющимся интерфейсом. В данном случае такой точкой, как видите, является панель состояния браузера (status bar). То, что заключено внутрь данного тега - и есть, собственно говоря, виджет, который мы добавляем на нашу "точку соединения". В данном случае таким виджетом является дополнительная панель, на которой будет написано "Hello, World!".

У многих наших читателей наверняка возникнет совершенно резонный вопрос: а как же, собственно говоря, можно узнать, какие виды виджетов вообще доступны разработчику. Такой список есть на портале Mozilla для разработчиков, и располагается он по адресу https://developer.mozilla.org/en/XUL_controls. Все виджеты там расписаны более чем подробно.

Стоит, пожалуй, отдельно остановиться на вопросе добавления пунктов в контекстное меню браузера с помощью XUL-слоев, поскольку эта задача будет встречаться достаточно часто - ведь подавляющее большинство расширений для Mozilla Firefox так или иначе затрагивают контекстное меню этого браузера. Выглядит же XUL-код для добавления собственных пунктов в контекстное меню Firefox'а таким образом, как показано в листинге.

<popup id="contentAreaContextMenu">
 <menuitem id="context-item1" label="Item 1" oncommand="alert('Item1');"/>
 <menuitem id="context-item2" label="Item 2" oncommand="alert('Item2');"/>
</popup>

Собственно, код этого листинга достаточно прост: мы указываем, к чему "подключаемся" - в данном случае таким компонентом браузерного интерфейса является контекстное меню. В него мы добавляем два элемента, которые будут выглядеть на экране как "Item 1" и "Item 2". При нажатии на эти элементы будет выводиться окно с сообщениями, тексты которых совпадают с названиями пунктов меню. Вполне понятно, что в реальных расширениях, добавляющих собственные пункты в контекстное меню Mozilla Firefox, вместо кода, отвечающего за отображение малоинформативных сообщений, вставляют реальный рабочий код, выполняющий реальные же задачи. Впрочем, о коде сейчас ещё говорить несколько преждевременно - мы еще не до конца разобрались с XUL'ом...


Chrome URI

Каким именно образом Firefox обнаруживает элементы интерфейса, записанные в XUL-файлах? Логично было бы предположить, что для этого используются пути к файлам, в которых содержатся XUL-слои. В общем-то, так оно и есть. Только для записи таких путей в форме URI используется не привычное всем "file://", а "chrome://".

Здесь наверняка возникнет вопрос: какое отношение этот Chrome имеет к браузеру Google Chrome? В общем-то, никакого, это, можно сказать, "однофамильцы". Дело в том, что браузеры Mozilla Firefox и Google Chrome, как вам, должно быть, известно, основываются на двух разных "движках" и имеют, соответственно, достаточно рознящееся друг от друга внутреннее устройство. Что касается названия Chrome в случае с Firefox'ом, то оно исторически появилось раньше названия гугловского браузера, но теперь вместо Mozilla Chrome говорят более емкое и короткое определение - просто XUL, которое к тому же лучше отображает сущность этой технологии. В терминологии Mozilla сейчас принято следующее определение: "Chrome is the set of user interface elements of the application window that are outside of a window's content area". То есть, в Chrome включаются все те части интерфейса, которые не содержат в себе непосредственно контента web-страницы, то есть, различные панели инструментов, меню, "прогресс-бары" и т.п.

А вообще, название Chrome не такое уж редкое в мировой ИТ-индустрии. Так называется и разработанная для платформы .NET версия языка Object Pascal, и достаточно известный игровой движок, и даже серия видеокарт от S3. Так что если вдруг придется искать название для какой-нибудь своей разработки, смело называйте её "Хромом" - все поймут и не удивятся.

Но вернемся, собственно, к Chrome URI. Каким образом они вообще выглядят и используются? А вот каким: chrome://browser/content/browser.xul. Попробуйте ввести этот URI в адресной строке Firefox, и вы увидите, что именно скрывается за этим адресом. Собственно, префикс "chrome://", с которого начинается URI, нужен, по большей части, именно для того, чтобы отделять XUL-слои от web-страниц, файлов на жестком диске, папок на FTP-сервере и т.д. За этим префиксом следует название пакета, которое должно быть, по возможности, уникальным, за этим названием идет тип ресурса. Всего разработчикам доступно три различных типа ресурсов: content (сюда входят XUL, JavaScript, XBL биндинги... - собственно, то, что является формой поведения UI приложения) locale (DTD, .properties-файлы и другие вещи, которые содержат в себе строки локализации интерфейса браузера) и skin (CSS и изображения, которые составляют часть темы UI браузера). Как видите, все эти три типа ресурсов достаточно сильно отличаются друг от друга, а потому вряд ли может возникнуть такая ситуация, когда вы спутаете случайно один с другим. Что касается дальнейшей части URI, то это, собственно, путь к ресурсу - то есть, к нашему XUL-файлу. Для преобразования Chrome URI в реальный путь к файлу на диске (в том числе и находящемуся внутри какого-либо архива) браузер использует так называемый Chrome Registry (реестр Chrome). Собственно, лично нам в данном случае нужно от Chrome Registry совсем немного - а именно, чтобы туда попали URI, которые имеют непосредственное отношение к содержимому нашего расширения для браузера.

Для этой цели в Mozilla Firefox (да и в других продуктах Mozilla) существуют специальные средства - файлы, называемые Chrome Manifest'ами. Именно в них содержится информация, которая, скажем так, способствует тому, чтобы Firefox начал адекватно использовать URI вашего расширения в Chrome Registry. Но, к сожалению, поскольку объем газетной статьи не безграничен, продолжим разговор о Chrome Manifest'ах в одном из следующих номеров "Компьютерных вестей".

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

14 за 2010 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!