Недавно решил немного разобраться как расширяется Firefox (навеяло конкурсом от Mozilla). По ходу сделал небольшой конспект - может когда нибудь пригодиться или будет кому-то интересно.
Часть первая. Firefox из нутри.
Firefox предоставляет несколько основных путей для своего расширения, каждый из которых отличается не только по назначению, но и способом создания: плагины (plugins), расширения (extensions), тулзы для поиска (search engines, search plugins). Все вместе это называется add-ons. Плагины - это бинарные компоненты, которые помогают браузеру отображать специфические данные, например, pdf-файлы. В отличие от них, расширения добавляют новую функциональность и позволяют изменять пользовательский интерфейс (например, какой-нибудь хитрый поиск по открытому документу при нажатии большой красной кнопки на статус-баре). Отдельно стоят search plugins -плагины, которые специализируются только на поиске.
Плагины и поисковые тулзы - довольно специфичны, поэтому, в ввиду более вероятного использования, для меня интересны только extensions. Но прежде, мне стало интересно, как работает Firefox и где у него находятся точки входа для всех видов расширений.
Исходя из Conceptual Architecture of Firefox и Firefox Concrete Architecture, браузер состоит из нескольких составных: GUI, Browser Engine (функциональность браузера - инициирование загрузки ULR, refresh, forward, back..), Rendering Engine (отрисовка контента и GUI браузера), Data Persistent (настройки пользователя), Networking (поддержка различных протоколов, кэширование, кодировки, безопасность), JavaScript interpreter, XML parser, Display Backend. Browser Engine и Rendering Engine в Firefox представлены одним модулем - Gecko.
Все, что мы видим, запуская Firefox - результат работы Gecko. Он рендерит не только контент браузера но и GUI. Для поддержки различных диалектов XML и HTML, Gecko использует XML-парсер (Expat). Одним из таких диалектов является XUL (читается "зул") - кроссплатформенный XML-based язык для описания пользовательского интерфейса. С XUL тесно связан XPToolkit - набор XUL-виджетов, таких как тулбары, меню, кнопки и т.д. Если XUL - это совокупность правил, атрибутов, элементов и связей между ними, то XPToolkit - это строительный материал для GUI, выраженный в понятиях XUL. Парсер представляет XUL в виде надмножества DOM - Application Object Model (AOM) - иерархия виджетов (браузер, меню, элемент меню и т.д.). Таким образом, для Gecko не имеет значения, что он получает на входе - XML, XUL или HTML.
Для работы с JavaScript, Gecko использует JavaScript интерпретатор - SpiderMonkey.
Теперь становиться понятно, какое место занимают плагины, а какое - расширения. Плагины занимаются рендерингом, значит должны взаимодействовать непосредственно с Gecko, использовать его API (Gecko Plugin API). Расширения меняют пользовательский интерфейс и добавляют новые фичи, значит должны подсовывать Gecko соответствующие XUL-файлы и JavaScript'ы, соовокупность которых и будет расширением.
Но есть один ньюанс, связанный с безопасностью. Все, что загружается из веба, имеет довольно ограниченные права, например, нельзя читать файлы с диска, нет доступа к данным пользователя. Поэтому, файлы расширений запускаются только с локального диска из директории chrome. Доступ к ним осуществляется при помощи специального URI: chrome://package_name/data_type/file_path,
где
- package_name - имя пакаджа; может быть как именем расширения, так и касаться базовой функциональности (например, chrome://browser/content/browser.xul - xul-файл, описывающий GUI браузера);
- data_type - тип запрашиваемых данных (какие они бывают будет описано дальше);
- file_path - путь к конкретному файлы в chrome.
Загруженные таким образом файлы получают неограниченные права (chrome-privileges). Вообще, chrome, в терминологии Mozilla - это все, что не веб-контент, а именно, GUI и все, с ним связанное (xul, js, css и т.д.). Основные типы chrome:
- content - это, можно сказать, строительный материал для приложения на базе Firefox(xul, js).
- locale - информация, позволяющая автоматизировать использование различных языков в зависимости от текущей локали.
- skin - css-файлы, описывают как будут отображаться виджеты.
Для того, что бы chrome был доступен, его надо зарегестрировать в chrome-реесте в виде plain-текста (файл chrome.manifest). Как это делается и как создать минимальное расширение - в следующем посте.
Ссылки:
Conceptual Architecture of Firefox
Firefox Concrete Architecture
XUL Tools and What They Mean
Mozilla developer center
Read More...
Summary only...