Создание расширения
Введение
Этот краткий курс касается построения простейшего расширения для Firefox, которое будет добавлять в строку статуса надпись «Hello, World!».
Что нужно знать для начала работы
Система разработки расширений спроектирована таким образом, что для начала разработки собственного расширения не требуется быть профессиональным программистом. Как бы то ни было, это программирование, поэтому желательно иметь некое представление о принципах работы компьютерных программ вообще и, в частности, быть знакомым с XML. Вообще желательно знание также JavaScript и CSS, однако в этой статье оно вам не понадобится.
Создание проекта расширения
Расширения состоят из нескольких файлов и для корректной его работы необходимо придерживаться определенных правил их расположения в директориях. Вот структура типичного расширения:
Впрочем, в вашем расширении необязательно должны быть все эти папки. Сейчас мы создадим схожий каркас для нашего расширения. Для начала создадим папку для его хранения (напр. C:\extensions\my_extension\ для Windows или
/extensions/my_extension/ для Unix/Linux ). Эта папка будет корневой. Создайте в ней подпапку chrome, а в последней — папку content.
Теперь создайте в корневой папке 2 пустых файла: chrome.manifest и install.rdf.
Итак, сейчас мы имеем такую структуру расширения:
Для облегчения дальнейшей разработки и тестирования рекомендуем настроить Firefox для разработки расширения.
Создание скрипта («манифеста») установки
Откройте файл install.rdf в текстовом редакторе и поместите в него следующее:
Как видите, этот файл имеет вид XML-файла. Полное описание необходимых и возможных параметров есть здесь, сейчас же отметим лишь, что этот файл предназначен для общего описания расширения, например, уникальный идентификатор расширения, его версию, имя, автора, информацию о совместимости и т.п. Назначение многих параметров понятно из их названия. Что необходимо знать сейчас:
- sample@example.net — уникальный идентификатор вашего расширения. Это может быть адрес электронной почты (как здесь) или GUID. Обратите внимание, что адрес может быть несуществующим, главное, чтобы он был уникальным.
- 2 — указывает, что это именно расширение (связано с тем, что такие же манифесты создаются для тем и плагинов).
- — идентификатор Firefox’а (конечно, он одинаковый для всех расширений).
- 1.5 — минимальная версия Firefox, с которой будет работать ваше приложение. Обратите внимание, что указать здесь какой-либо номер не значит автоматически сделать расширение работающим с этой версией. Это лишь означает, что вы, как разработчик, утверждаете, что расширение будет работать с ней, а вот будет ли так, зависит только от вас.
- 2.0.0.* — максимальный номер версии Firefox. * означает, что включаются все версии, имеющие вид 2.0.0.x, где x — любое число.
Расширение браузера с помощью XUL
Интерфейс Firefox написан на XUL и JavaScript. XUL — это язык, основанный на XML. Он отвечает за визуальную часть интерфейса. JavaScript реализует функциональность через привязку к действиям пользователя.
Так как визуально браузер строится на XUL, то, следовательно, он весь представляется в виде XML-файла. Вы можете посмотреть на него (это будет полезно для четкого понимания своих дальнейших действий). Зайдите в папку установки Firefox, откройте там папку chrome. В ней будет browser.jar . Несмотря на расширение, этот файл — обычный zip-архив. Внутри него вы найдете файл content/browser/browser.xul . Открыв его, можно полюбоваться на общую структуру визуальной части браузера. Пусть вас не смущает большое количество непонятных пока строк — во всем разберетесь позже. Собственно, корневым узлом этого XML-файла являетcя элемент window , содержащиеся в нем узлы — это отдельные элементы интерфейса. Например, вы можете найти кнопку обновления страницы (поищите узел с id=»reload-button» ) или пункт меню «Правка» ( id=»edit-menu» ).
Так вот, суть расширения интерфейса браузера состоит в том, что мы берем некий узел из браузера, описываем его в своем файле с необходимыми нам изменениями, например, добавляя к нему новые дочерние узлы. Таким образом можно добавить новые кнопки в панель инструментов (или создать новую панель и поместить ее в нужное место), добавить новый пункт меню (как рядом со «Справкой» так и в подменю, скажем, «Инструменты» (Tools)). Это технология называется en:XUL Overlays.
В нашем случае мы добавим новый элемент в строку статуса. В файле browser.xul можно найти узел с id=»status-bar» . Это и есть строка статуса. В этом узле есть несколько дочерних узлов. Добавим к ним наш, который будет описывать новую панель. Создайте файл, назовите его, скажем, sample.xul и поместите в папку chrome/content . Внесите туда такой код:
Здесь с id=»status-bar» является «точкой склейки» (merge point), т.е. узлом, который мы намереваемся изменить. — новый виджет, который мы добавляем в .
URI Chrome
XUL-файлы (вроде того, который мы только что создали) загружаются через URI протокола chrome://. Вместо того, чтобы каждый раз определять место установки Firefox’а и загружать файлы через file:// , можно загружать их через chrome:// , не беспокоясь об их истинном положении на диске.
Так, окно браузера, которое мы недавно просматривали, находится по адресу chrome://browser/content/browser.xul . Можете попробовать ввести его в адресную строку и посмотреть на результат.
URI хрома состоит из нескольких частей:
- протокол chrome говорит, что необходимо классифицировать и обработать содежимое файла как хром.
- название пакета (в данном случае, это browser ), указывающий на «сверток» (bundle) компонентов интерфейса. Это название уникально для каждого приложения/расширения.
- тип запрашиваемых данных. Есть три типа: content (XUL, JavaScript, XBL Bindings и др., т.е. компоненты, формирующие вид и поведение интерфейса), locale (DTD, файлы propeties и т.п., производящие локализацию интерфейса) и skin (CSS и изображения для формирования темы интерфейса).
- файл для загрузки.
Так, например, chrome://foo/skin/bar.png загружает файл bar.png из секции skin пакета foo .
Создание манифеста chrome
Для хорошего понимания манифеста просмотрите статью en:Chrome Manifest
Откройте chrome.manifest , созданный нами ранее и добавьте в него следующее:
Не забудьте завершающий слеш.
- тип данных в пакете chrome,
- название пакета (используйте лишь строчные буквы),
- путь к файлам пакета.
Таким образом, здесь мы говорим, что файлы типа content для пакета sample можно найти в chrome/content (путь относительно местоположения chrome.manifest ).
Сохраните файл. Позже, при запуске Firefox, пакет chrome вашего расширения будет зарегистрирован с помощью этого файла.
Регистрация оверлея
Для того, чтобы Firefox понял, что у нас есть оверлей и мы хотим наложить его на окно браузера, необходимо зарегистрировать оверлей через все тот же chrome.manifest. Добавляем в него строку
Это говорит Firefox’у, что нужно объединить sample.xul и browser.xul
Тестирование
Для начала необходимо уведомить Firefox о нашем расширении. Раньше (еще во времена Firefox 1.0) необходимо было упаковать расширение как en:XPI и установить через интерфейс браузера. Теперь же достаточно просто указать Firefox’у, где находится папка с вашим расширением — и он будет подключать его каждый раз при загрузке.
- Найдите папку с вашим профилем. Если вы не создавали его специально, браузер использует профиль по умолчанию.
Как найти папку с профилем. - Откройте папку extensions . Если ее нет, создайте ее.
- Создайте новый текстовый файл и поместите в него лишь путь к вашему расширению (напр., C:\extensions\my_extension\ для Windows или
/extensions/my_extension/ для Unix/Linux). Сохраните файл под именем, одинаковым с id вашего расширения.
- Не забудьте завершающий слеш.
- Возможно возникновение проблем из-за знаков нижнего подчеркивания в названии; если так вышло измените его.
Теперь вы готовы к тестированию вашего расширения. Запустите Firefox. Он увидит ссылку к вашему расширению и установит его. Если все прошло успешно, вы увидите надпись «Hello, World!» в строке статуса справа. Для внесения изменений достаточно править xul -файлы и перезапустить Firefox.
Упаковка расширения
Теперь можно упаковать расширение для его дальнейшего распространиения и установки.
Создайте zip-архив из содержания корневой папки вашего расширения (но не архивируйте саму папку). Переименуйте файл, чтобы он имел расширение «.xpi» . Вот и все. Для установки достаточно перетащить файл на окно браузера.
Установка с веб-страницы
Есть несколько способов это сделать. Можно разместить прямую ссылку на xpi -файл. Однако предпочтительным является InstallTrigger method, как более удобный для пользователей.
Сайт расширений addons.mozilla.org
Сайт расширений Mozilla (http://addons.mozilla.org) является местом, где вы можете бесплатно разместить свое расширение. Сайт является надежным и удобным местом для распространения своих расширений: достаточно лишь зарегистрироваться — и вы сможете загружать свои файлы на сервер.
Регистрирование расширения в реестре Windows
В Windows информация о расширении может быть добавлена в реестр. Это дает дополнительный возможности при установке расширений. Поробнее об этом читайте здесь.
Узнайте больше об оверлеях XUL
В настоящем руководстве была затронута лишь крохотная часть всех возможностей модифицирования интерфейса с помощью XUL. Чтобы узнать больше, смотрите документацию XUL.
Локализация
Для поддержки более чем одного языка необходимо отделить локализуемые строки от основного содержания с помощью сущностей (entities) и «свертков строк» (string bundles). Гораздо проще делать это в течение разработки расширения, чем после.
Информация о локализации хранится в подпапке locale папки chrome (т.е. рядос с папкой content ). В этой папке необходимо разместить столько папок, сколько локализаций вы намерены сделать. Обычной практикой является называть папки стандартными названиями локалей: скажем, папку с английской локализацией — en-US , русской — ru-RU и т.п., что, впрочем, не является обязательным. Теперь создайте в каждой из папок файл somename.ent (или anothername.dtd ) (имя одинаково во всех папках локализаций) и заполните его соответствующим образом (показано ниже).
Локализуем наше расширение на русский и английский языки. После создания 2 папок (назовем их ru-RU и en-US ), создаем в каждой из них файл (пусть myStatusBar.ent ) Поместите в тот файл, который в папке с английской локализацией, следующую строку:
А в тот, который будет локализовать на русский язык, соответственно
Сохраните оба файла. Теперь необходимо зарегистрировать локализации. Для этого добавим в chrome.manifest следующие строки:
Теперь для использования локализации достаточно добавить в начало (однако после xml -объявления) xul -файла строку
где window — это названия корневого элемента xul -документа (в нашем случае это overlay ).
Для использования сущностей измените ваш xul -файл так, чтобы атрибут label у новой statusbarpanel был равен «&statusbarpanel.label;» .
Исследование браузера
Гораздо более простым (и эффективным) способом исследования браузера является использование DOM Inspector’а. Он позволяет полностью изучить структуру документа, загруженного в браузер. Так, например, можно загрузить вышеописанным способом browser.xul , просмотреть все его узлы и найти подходящий для наложения оверлея. Или же можно просматривать структуру своего расширения.
Отладка расширений
Инструменты для анализа расширений
Источник статьи: http://developer.mozilla.org/ru/docs/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F
Создание расширения FireFox для начинающих
В данной статье представлена пошаговая инструкция по разработке простейшего расширения для FireFox.
Это частичный перевод оригинальной статьи.
Это не моя статья, а моего друга (его мыльце: templar8@gmail.com). Он очень хочет попасть на Хабр. У меня самого не хватает кармы для инвайта.
Вступление
Это руководство — пошаговая инструкция по созданию простейшего расширения. Мы попробуем добавить в строку состояния еще одну небольшую панельку с фразой «Hello, World!».
Подготовка окружения
Расширения упаковываются и распространяются в виде zip-файлов или пакетов с расширением XPI.
Вот пример типичной внутренней структуры XPI-файла:
exampleExt.xpi:
/install.rdf
/components/*
/components/cmdline.js
/defaults/
/defaults/preferences/*.js
/plugins/*
/chrome.manifest
/chrome/icons/default/*
/chrome/
/chrome/content/
Нам нужно создать структуру каталогов, похожую на эту. Для начала создайте корневую директорию расширения (например, C:\extensions\my_extension\ или
/extensions/my_extension/ ). Внутри этого каталога создайте каталог chrome , в котором создайте каталог content .
В корневом каталоге расширения создайте два пустых текстовых файла с именами chrome.manifest и install.rdf . В итоге должна получиться структура каталогов следующего вида:
\
install.rdf
chrome.manifest
chrome\
content\
Дополнительная информация о настройке окружения находится по этой ссылке.
Сценарий установки
Откройте файл install.rdf и добавьте в него следующий текст:
- xml version =»1.0″ ? >
- RDF xmlns =»http://www.w3.org/1999/02/22-rdf-syntax-ns#»
- xmlns:em =»http://www.mozilla.org/2004/em-rdf#» >
- Description about =»urn:mozilla:install-manifest» >
- em:id > sample@example.net em:id >
- em:version > 1.0 em:version >
- em:type > 2 em:type >
- with minimum and maximum supported versions. —>
- em:targetApplication >
- Description >
- em:id >
em:id > - em:minVersion > 1.5 em:minVersion >
- em:maxVersion > 3.0.* em:maxVersion >
- Description >
- em:targetApplication >
- em:name > sample em:name >
- em:description > A test extension em:description >
- em:creator > Your Name Here em:creator >
- em:homepageURL > www.example.com em:homepageURL >
- Description >
- RDF >
* This source code was highlighted with Source Code Highlighter .
- sample@example.net — ID расширения. Это значение записывается формате email-адреса и необходимо для идентификации расширения (оно не должно быть вашим email-адресом). Сделайте его уникальным. Вы также можете использовать GUID. ПРИМЕЧАНИЕ: Хотя этот параметр и записывается в формате email-адреса, он не обязательно должен быть валидным. (example.example.example)
- Параметр 2 — 2 указывает на то, что это будет расширение. Допустим, для тем оформления это значение должно быть установлено в 4 (все коды типов можно посмотреть тут).
- — ID Firefox’а (прим. пер. – видимо, для Thunderbird будет другое значение).
- 1.5 — номер минимально необходимой для работы расширения версии Firefox. Никогда не используйте символ * для указания minVersion, это может привести к неожиданным результатам.
- 3.0.* — максимальный номер версии Firefox с которой будет работать расширение. Это значение должно быть не новее самой последней на данный момент версии браузера! В данном случае «3.0.*» указывает на то, что расширение будет работать с Firefox 3.0 и версиями 3.0.x.
(Если вы получили сообщение, что install.rdf неверен, полезным будет загрузить этот файл в Firefox (Файл->Открыть файл…), после чего браузер покажет вам xml ошибки. В моем случае был пробел перед « browser.xul ( $FIREFOX_INSTALL_DIR/chrome/browser.jar содержит content/browser/browser.xul ) В browser.xul мы можем найти описание строки состояния, которое выглядит приблизительно так:
- statusbar id =»status-bar» >
- . statusbarpanel > .
- statusbar >
* This source code was highlighted with Source Code Highlighter .
— это «связующая точка» XUL-слоя.
XUL-слои
XUL-слои — это способ добавления виджетов в XUL-документ. XUL-слой — это .xul-файл, который определяет XUL-фрагменты, описывающие связующие точки в «основном» документе. Эти фрагменты могут указывать на виджеты, которые будут добавлены, удалены или изменены.
Пример документа 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 >
* This source code was highlighted with Source Code Highlighter .
Тег с id, равным « status-bar » указывает на виджет браузера в который мы хотим добавить наш элемент.
Тег — это новый виджет, который мы хотим добавить.
Сохраните этот код в файле sample.xul каталога chrome/content .
Chrome URIs
XUL-файлы – это часть т.н. «Chrome Packages» — пакетов элементов пользовательского интерфейса, загружаемых через URI вида chrome:// . Вместо того, чтобы загружать интерфейс, используя URI вида file:// (тем более, расположение Firefox может быть различным в зависимости от платформы и систем), разработчики Mozilla пришли к решению создать новый вид URI, используя который все установленные приложения будут иметь доступ к содержимому XUL.
URI для окна браузера – это chrome://browser/content/browser.xul . Попробуйте ввести этот URL в адресной строке Firefox.
Chrome URI состоит из нескольких частей:
- 1-я — протокол ( chrome ), которая сообщает сетевой библиотеке Firefox, что это Chrome URI.
- 2-я — название пакета (в данном примере, browser ), который указывает на набор компонентов пользовательского интерфейса. Для вашего приложения эта часть должна быть уникальной, во избежание конфликтов с другими расширениями.
- 3-я — тип запрашиваемых данных. Бывает трех типов: content (XUL, JavaScript, XBL связи и другие составляющие пользовательского интерфейса приложения), locale (DTD, файлы .properties, в которых могут быть и другие файлы, содержащие строки локализации пользовательского интерфейса) и skin (CSS и изображения темы).
- Последняя часть – путь к загружаемому файлу.
Например, chrome://foo/skin/bar.png загружает файл bar.png из раздела skin темы foo .
Когда вы загружаете что-либо, оперируя Chrome URI, Firefox использует реестр Chrome (Chrome Registry) для преобразования этого URI в реальный путь к файлу на диске (или в JAR архивах).
Создание Chrome Manifest
Для получения большей информации о Chrome Manifest и всех его свойствах можно обратиться к справочному руководству.
Откройте файл chrome.manifest, который был создан в корневом каталоге вашего расширения. Добавьте следующий код:
content sample chrome/content/
(Не забудьте о закрывающем слеше, «/»! Без него пакет не будет зарегистрирован.)
Разберем каждый элемент:
- тип пакета chrome
- название пакета chrome (должно быть написано в нижнем регистре, потому что Firefox/Thunderbird в версии 2 и более ранних не поддерживают названия со смешанным регистром — баг 132183)
- размещение файлов пакетов chrome
Это означает, что файлы пакета sample расположены в каталоге chrome/content относительно места расположения файла chrome.manifest .
Обратите внимание, что файлы контента, локализаций и скинов должны находиться внутри каталога content, locale и skin подкаталога chrome соответственно.
Сохраните файл. Теперь, когда вы запустите Firefox с вашим расширением (как это сделать, будет описано ниже), пакет chrome будет зарегистрирован.
Регистрация слоя
Теперь необходимо связать ваш слой с окном браузера. Для этого добавьте следующие строки в файл chrome.manifest :
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul
Эти две строки указывают Firefox’у связать sample.xul и browser.xul во время загрузки browser.xul .
Тестирование
Во-первых, мы должны сообщить Firefox о нашем расширении. На стадии разработки для Firefox версии 2 и выше, вы можете указать откуда брать новое расширение, и браузер будет его загружать после каждого перезапуска.
- Перейдите в домашний каталог, а после в каталог, содержащий профиль Firefox, с которым вы собираетесь работать (например, Firefox/Profiles/
.default/ ).
/extensions/my_extension/ ). Пользователи Windows должны помнить о направлении слешей, обязательно добавьте закрывающий слеш и удалите все замыкающие пробелы.
Теперь все готово к тестированию.
Запустите Firefox. Firefox по текстовой ссылке сам найдет каталог с вашим расширением и установит его. После запуска браузера вы увидите надпись «Hello, World!» в правой части строки состояния.
Вы можете сделать некоторые изменения в .xul-файле, перезапустить Firefox, и сразу же увидите результат.
Создание пакета
Теперь, когда расширение работает, вы можете создать пакет для последующего распространения и установки.
Запакуйте архиватором zip содержимое каталога с вашим расширением (не сам каталог расширения) и измените расширение архива с .zip на .xpi.
Если вы являетесь счастливым обладателем ‘Extension Builder’-а, то он может сам сделать за вас всю грязную работу (Tools -> Extension Developer -> Extension Builder). Просто перейдите в каталог с вашим расширением и нажмите кнопку Build Extension. Это расширение имеет очень много инструментов облегчающих разработку.
Теперь загрузите получившийся .xpi-файл на ваш сервер и удостоверьтесь, что его тип установлен в application/x-xpinstall . После этого можно скачать и установить расширение.
Источник статьи: http://habr.com/ru/post/71839/