1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
---
title: Создание расширения
slug: conflicting/Mozilla/Add-ons
tags:
- Расширение
- Создание
original_slug: Building_an_Extension
---
<h2 id="Introduction" name="Introduction">Введение</h2>
<p>Этот урок по шагам покажет Вам как создать простое <a href="/en/Extensions" title="en/Extensions">Расширение</a> – сутью которого является добавление в панель статуса Firefox блока со строкой "Hello, World!"</p>
<div class="note">
<p><strong>Отметьте</strong> Данный урок о создании Расширений для Firefox 1.5 и более поздних версий. Другие существующие уроки для создания Расширений, предназначены для более ранних версий.</p>
<p>Если Вас интересует урок по созданию Расширения для Thunderbird, смотрите <a href="/en/Building_a_Thunderbird_extension" title="en/Building_a_Thunderbird_extension">Создание Расширения для Thunderbird</a></p>
</div>
<h2 id="Setting_up_the_Development_Environment" name="Setting_up_the_Development_Environment">Настройка окружения</h2>
<p>Начнём с того, что Расширение распространяется в виде zip архива или <a href="/en/Bundles" title="en/Bundles">Пакетов</a>, с расширением <code>XPI</code> (<em>произносится как “зиппи”</em>).</p>
<p>Вот пример типичного XPI файла:</p>
<pre class="eval">exampleExt.xpi:
/<a href="/en/Install_Manifests" title="en/Install_Manifests">install.rdf</a>
<a href="#XPCOM_Components">/components/*</a>
<a href="#Application_Command_Line">/components/cmdline.js</a>
<a href="#Defaults_Files">/defaults/</a>
<a href="#Defaults_Files">/defaults/preferences/*.js</a>
/plugins/*
/<a href="/en/Chrome_Registration" title="en/Chrome_Registration">chrome.manifest</a>
/<a href="/en/Window_icons" title="en/Window_icons">chrome/icons/default/*</a>
/chrome/
/chrome/content/
</pre>
<p>Давайте создадим файловою структуру для нашего урока, подобную той что была описана выше, для чего создайте где-нибудь на жёстком диске директорию(например <code>C:\extensions\my_extension\</code> или <code>~/extensions/my_extension/</code>). Создайте в этой директории новую директорию c именем <code>chrome</code>, и создайте в директории <code>chrome</code> директорию с именем code>content.</p>
<p>В <strong>корне</strong> директории вашего Расширения создайте два пустых файла, один назовите <code>chrome.manifest</code>, а другой <code>install.rdf</code>.</p>
<p>В итоге у вас должна получиться вот такая структура:</p>
<pre><ext path>\
install.rdf
chrome.manifest
chrome\
content\
</pre>
<p><span class="comment"><pre> #!/bin/sh h=$HOME/moExt mkdir -p $h/my_extension/chrome/content touch $h/my_extension/chrome.manifest $h/my_extension/install.rdf </pre></span> Более подробную информацию по настройке окружения читайте в статье <a href="/en/Setting_up_extension_development_environment" title="en/Setting_up_extension_development_environment">Setting up extension development environment</a>.</p>
<h2 id="Create_the_Install_Manifest" name="Create_the_Install_Manifest">Создание файла инсталяции</h2>
<p>Откройте файл <code><a href="/en/Install_Manifests" title="en/Install_Manifests">install.rdf</a></code> который Вы создали на предыдущем этапе и вставьте эти строки:</p>
<pre class="eval"><?xml version="1.0"?>
<RDF xmlns="<span class="nowiki">http://www.w3.org/1999/02/22-rdf-syntax-ns#</span>"
xmlns:em="<span class="nowiki">http://www.mozilla.org/2004/em-rdf#</span>">
<Description about="urn:mozilla:install-manifest">
<em:id><strong><a class="link-mailto" href="mailto:sample@example.net" rel="freelink">sample@example.net</a></strong></em:id>
<em:version><strong>1.0</strong></em:version>
<em:type>2</em:type>
<!-- Указывается приложение для которого может
быть установлено Расширение, его максимальная
и минимальная поддерживаемая версия. -->
<em:targetApplication>
<Description>
<em:id><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong></em:id>
<em:minVersion><strong>1.5</strong></em:minVersion>
<em:maxVersion><strong>3.0.*</strong></em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name><strong>sample</strong></em:name>
<em:description><strong>A test extension</strong></em:description>
<em:creator><strong>Your Name Here</strong></em:creator>
<em:homepageURL><strong><span class="nowiki">http://www.example.com/</span></strong></em:homepageURL>
</Description>
</RDF>
</pre>
<ul>
<li><strong><a class="link-mailto" href="mailto:sample@example.net" rel="freelink">sample@example.net</a></strong> - идентификатор вашего Расширения. Это - значение, которое Вы должны придумать сами, чтобы идентифицировать Ваше Расширение, в данном случае оно в формате адреса электронной почты (это не обязательно должна быть <em>Ваша</em> электронная почта). Этот идентификатор должен быть уникальным. Вы можете также использовать GUID. ЗАМЕТКА: Хотя этот параметр и ДОЛЖЕН быть в формате адреса электронной почты, но не обязательно должен быть действительным адресом электронной почты. (example.example.example)</li>
<li>Определение <code><em:type>2</em:type></code> -- объявляет, что устанавливается именно расширение. Если бы Вы устанавливали тему, то это было бы 4 ( <a href="/en/Install_Manifests#type" title="en/Install_Manifests#type">Install Manifests#type</a> for other type codes).</li>
<li><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong> - Идентификатор приложения Firefox.</li>
<li><strong>1.5</strong> - минимальная версия Firefox, с которой будет работать Ваше Расширение. Укажите здесь минимальную версию, для которой будет выполняться все необходимые тесты.</li>
<li><strong>3.0.*</strong> - - максимальня версия Firefox, с которой будет работать Ваше Расширение. Укажите здесь, самую свежую, доступную в данный момент версию. В этом случае, "3.0.*" указывает на то, что расширение работает с Firefox 3.0 и любыми последующими 3.0.x версиями.</li>
</ul>
<p>(В Firefox версии 3.0.1, вы не сможете установить для em:minVersion и em:maxVersion значение "<strong>3.0.*</strong>". Если Вы попытаетесь установить Расширение, то получите ошибку "Not compatible with Firefox 3.0.1". Мне не ясны причины этого, так что я оставлю объяснение тому, кто имеет больше информации по этому поводу. Установка em:minVersion равным "<strong>3</strong>" и em:maxVersion равным "<strong>3.0.*</strong>" решило проблему для меня.)</p>
<p>Расширения разработанные для работы только с последними версиями Firefox 2.0.0.x, должны иметь установленным максимальную версию в "2.0.0. *". Расширения, разработанные для работы с только с последними версиями Firefox 1.5.0.x, должны иметь установленным максимальную версию "1.5.0. *".</p>
<p>Более подробно См. <a href="/en/Install_Manifests" title="en/Install_Manifests">Install Manifests</a> с полным перечнем основных и дополнительных свойств.</p>
<p>Сохраните файл.</p>
<h2 id="Extending_the_Browser_with_XUL" name="Extending_the_Browser_with_XUL">Расширение браузера с помощью XUL</h2>
<p>Пользовательский интерфейс Firefox написан c использованием XUL и JavaScript. <a href="/en/XUL" title="en/XUL">XUL</a> является языком разметки на основе грамматики XML, которая позволяет описывать такие фрагменты пользовательского интерфейса, как кнопки, меню, панели инструментов, деревья и т.д. Вся функциональность и обработка действий пользователя осуществляется с помощью JavaScript.</p>
<p>Чтобы расширить браузер, мы изменяем различные части интерфейса браузера путём добавления или изменения ”виджетов”. Мы добавляем “виджеты”, вставляя новые элементы, DOM XUL в окно браузера и изменяем их, используя сценарий (скрипт) и присоединяя, обработчики событий.</p>
<p>Интерфейс браузера описан в XUL файле, который называется <code>browser.xul</code> (<code>$FIREFOX_INSTALL_DIR/chrome/browser.jar</code> contains <code>content/browser/browser.xul</code>). В browser.xul, мы можем найти фрагмент описывающий строку состояния, который выглядит вот так:</p>
<pre class="eval"><statusbar id="status-bar">
... <statusbarpanel>s ...
</statusbar>
</pre>
<p><code><statusbar id="status-bar"></code> это “точка слияния" для XUL Оверлея.</p>
<h5 id="XUL_Overlays" name="XUL_Overlays">XUL Оверлеи</h5>
<p><a href="/en/XUL_Overlays" title="en/XUL_Overlays">XUL Оверлей</a> - это способ внедрить другие “виджеты” пользовательского интерфейса в основной документ XUL. XUL Оверлей – это .xul файл, в котором определены фрагменты XUL для вставки в определённых “точках слияния” в основном документе. Эти фрагменты, могут определять “виджеты” которые должны быть вставлены, удалены, или изменены.</p>
<p><strong>Пример документа XUL Оверлея:</strong></p>
<pre class="eval"><?xml version="1.0"?>
<overlay id="sample"
xmlns="<span class="nowiki">http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</span>">
<statusbar id="<strong>status-bar</strong>">
<statusbarpanel id="my-panel" label="Hello, World"/>
</statusbar>
</overlay>
</pre>
<p><code><statusbar></code> название <code><strong>status-bar</strong></code> определяет "точку слияния" в пределах окна браузера, к которой мы хотим присоединить.</p>
<p><code><statusbarpanel></code> новый “виджет” который мы хотели бы вставить в пределах точки слияния.</p>
<p>Возьмите этот простой код и сохраните в новом файле с именем <code><strong>sample.xul</strong></code> и поместите его в директорию <code>chrome/content</code>.</p>
<p>Для получения дополнительной информации о присоединении “виджетов” и изменении пользовательского интерфейса, используя Оверлеи, см. далее.</p>
<h2 id="Chrome_URIs" name="Chrome_URIs">Chrome URIs</h2>
<p>XUL Файлы - это часть пакета <a href="/en/Chrome_Registration" title="en/Chrome_Registration">Chrome Packages</a> - пакета компонентов пользовательского интерфейса, которые загружаются через <code><a class="external" rel="freelink">chrome://</a></code>URIs. Вместо того, чтобы загружать их диска, используя <code><a class="external" rel="freelink">file://</a></code>URI (так как местоположение Firefox в системе может меняться от платформы к платформе и от системы к системе), разработчики Mozilla придумали решение, которое позволяет создать URIs к информационному наполнению XUL, о котором знает установленное приложение.</p>
<p>В окне браузера: <code><a class="external" rel="freelink">chrome://browser/content/browser.xul</a></code>. Напечатайте этот URL в адресной строке Firefox!</p>
<p>Chrome URIs состоит из нескольких составляющих:</p>
<ul>
<li>Во-первых, <strong>URI scheme</strong> схема (<code>chrome</code>), которая говорит сетевой библиотеке Firefox, что это Chrome URI. Указывает, что информационное наполнение URI, должно быть обработано как (<code>chrome</code>). В отличии от (<code>chrome</code>), (<code>http</code>) говорит Firefox обрабатывать URI как web-страницу.</li>
<li>Во-вторых, название пакета (<code><strong>browser</strong></code>, в примере выше), который идентифицирует пакет компонентов пользовательского интерфейса. Оно должно быть уникальным , чтобы избежать конфликтов между расширениями.</li>
<li>В-третьих, тип запрошенных данных. Есть три типа: <code>content</code> (XUL, JavaScript, связывания XBL, и т.д. которые формируют структуру и поведение приложения UI), <code>locale</code> (DTD.properties файлы и т.д, которые содержат строки для <a href="/en/Localization" title="en/Localization">локализации UI</a>), и <code>skin</code> (CSS и изображения, которые формируют <a href="/en/Themes" title="en/Themes">тему</a> UI)</li>
<li>Путь файла, для загрузки.</li>
</ul>
<p>Так, <code><a class="external" rel="freelink">chrome://foo/skin/bar.png</a></code> загружает файл <code>bar.png</code> из темы foo раздела <code>skin</code>.</p>
<p>Когда Вы загружаете содержимое, используя Chrome URI, Firefox использует системный реестр Chrome, чтобы транслировать URIs в фактические исходные файлы на диске (или в пакетах JAR).</p>
<h2 id="Create_a_Chrome_Manifest" name="Create_a_Chrome_Manifest">Создание установок Chrome</h2>
<p>Для получения дополнительной информации об установках Chrome и о поддерживаемых свойствах руководство по <a href="/en/Chrome_Registration" title="en/Chrome_Registration">Chrome Manifest</a>.</p>
<p>Откройте файл с названием <strong>chrome.manifest</strong> который Вы создали рядом с каталогом <code>chrome</code> в корне исходной иерархии директории Вашего Расширения.</p>
<p>Добавьте в него код:</p>
<pre class="eval">content sample chrome/content/
</pre>
<p>(<strong>Не забывайте, косую черту "<code>/</code>"!</strong> Без этого пакет не будет зарегистрирован.)</p>
<p>Здесь определяется:</p>
<ol>
<li>тип материала в пределах chrome пакета</li>
<li>название chrome пакета (удостоверьтесь, что Вы используете все символы в нижнем регистре для имени пакета ("sample"), так как во 2-й версии не поддерживается смешанные регистры и вы получите ошибку {{ Bug(132183) }}</li>
<li>местоположение файлов chrome пакета</li>
</ol>
<p>Эта строка говорит, что для chrome пакета с именем <strong>sample</strong>, файлы информационного наполнения находятся в <code>chrome/content</code>, который является путем относительно местоположения <code>chrome.manifest</code>.</p>
<p>Заметьте, что content, locale и skin должны быть сохранены как каталоги, с соответствующими именами content, locale и skin в подкаталоге <code>chrome</code>.</p>
<p>Сохраните файл. Когда Вы запустите Firefox со своим расширением, (это будет позже в данном уроке), chrome пакет будет зарегистрирован.</p>
<h2 id="Register_an_Overlay" name="Register_an_Overlay">Регистрация Оверлея</h2>
<p>Вам нужно присоединить ваш оверлей к окну браузера Firefox, при его отображении. Для этого добавьте следующую строку файл <code>chrome.manifest</code>:</p>
<pre class="eval">overlay <a class="external" rel="freelink">chrome://browser/content/browser.xul</a> <a class="external" rel="freelink">chrome://sample/content/sample.xul</a>
</pre>
<p>Эта строка говорит браузеру, присоединить sample.xul к browser.xul во время загрузки <code>browser.xul</code>.</p>
<h2 id="Test" name="Test">Тестирование</h2>
<p>Во-первых, мы должны рассказать о своём расширении Firefox. На стадии разработки для Firefox версии 2.0 и выше, вы можете указать Firefox папку, где вы разрабатываете Расширение, и оно будет загружать его каждый раз после перезапуска Firefox.</p>
<ol>
<li>Перейдите в <a class="external" href="http://kb.mozillazine.org/Profile_folder">папку вашего профиля</a> по умолчанию. Папка вашего профиля по умолчанию, должна, находится где-то в папке профилей, например в <code>Firefox/Profiles/<profile_id>.default/</code>.</li>
<li>Откройте папку <strong>extensions</strong>. Если ранее вы уже устанавливали, какие либо расширения, то она должна уже существовать.</li>
<li>Создайте там, новый текстовый файл и запишите в него путь к папке с вашим расширением, например <code>C:\extensions\my_extension\</code> или <code>~/extensions/my_extension/</code>. Сохраните файл, указав в качестве имени идентификатор вашего Расширения, в нашем примере это<code><a class="link-mailto" href="mailto:sample@example.net" rel="freelink">sample@example.net</a></code>.</li>
</ol>
<p>(<strong>Не забывайте, косую черту, "<code>/</code>"!</strong> Без этого ваше расширение не будет зарегистрировано.)</p>
<p>(<strong>my_extension может не работать!</strong> Если имя папки содержит символы подчеркивания.)</p>
<p>Теперь всё готово для испытания вашего расширения!</p>
<p>Запустите Firefox. Firefox обнаружит ссылку на каталог вашего расширения и установит его. Когда появится окно браузера вы должны увидеть текст "Hello, World!" на правой стороне в панели статуса.</p>
<p>Вы можете вернуться и внести необходимые изменения в .xul файл, после чего закрыть и перезапустить Firefox и изменения немедленно вступят в силу.</p>
<h2 id="Package" name="Package">Упаковка</h2>
<p>Теперь, когда ваше расширение работает, вы можете его <a href="/en/Extension_Packaging" title="en/Extension_Packaging">упаковать</a> для последующего развертывания и установки.</p>
<p>За "зипуйте" папку <strong>contents</strong> вашего Расширения (не саму папку расширения), и переименуйте получившийся zip файл, так чтобы он имел расширение .xpi. В Windows XP, вы можете сделать это очень просто, выбрав все файлы и вложенные папки в папке вашего расширения, и щелкнув правой кнопкой мыши и выбрав "Send To -> Compressed (Zipped) Folder". Zip файл будет создан. Просто переименуйте его, и готово!</p>
<p>В Mac OS X, вы можете нажать правой кнопкой мыши на папке <strong>contents</strong> вашего Расширения и выбрать "Создать архив ..." для создания архива. Однако, Mac OS X добавляет скрытые файлы в папку. Поэтому следует использовать Terminal, для удаления скрытых файлов (чьи имена начинаются с периода), а затем ввести в командной строке zip команду для создания архива.</p>
<p>В Linux, вы аналогичным образом можете использовать в командной строке Zip инструменты.</p>
<p>Если у вас установлено Extension Builder вы можете использовать его для сборки .xpi файла (Tools -> Extension Developer -> Extension Builder). Просто выберите каталог, где находится ваше расширение (install.rdf т.д.), и нажмите кнопку Build Extension (Построить расширение). Это расширение имеет множество инструментов для облегчения процесса создания расширений.</p>
<p>Теперь загрузите ваш .XPI файл на сервер, и сделайте, так чтобы он определялся как <code>application/x-xpinstall</code>. Вы можете давать ссылку на него и позволить людям скачивать и установить его. Для тестирования нашего. XPI файла можно просто перетащить его в окно менеджера расширений, открыв его через меню Tools -> Extensions в Firefox 1.5.0.x, или Tools -> Add-ons в более поздних версиях.</p>
<h5 id="Installing_from_a_web_page" name="Installing_from_a_web_page">Установка с web-страниц</h5>
<p>Существует множество путей, которыми вы можете устанавливать ваши расширения прямо с web-страниц, в том числе использование прямых ссылок на файлы XPI и использование <a href="/en/Installing_Extensions_and_Themes_From_Web_Pages" title="en/Installing_Extensions_and_Themes_From_Web_Pages"> InstallTrigger method</a> объекта. Разработчикам расширений и веб разработчикам, рекомендуется использовать для установки XPI методы InstallTrigger, которые дают больше возможностей их пользователям.</p>
<h5 id="Using_addons.mozilla.org" name="Using_addons.mozilla.org">Использование addons.mozilla.org</h5>
<p>С помощью сайта Mozilla Add-ons вы может распространять ваше Расширение для бесплатного пользования. Вше расширение будет иметь зеркала на Mozilla, что обеспечит доступность вашего расширения, если оно станет очень популярным. Сайт Mozilla также упрощает установку расширений для пользователей , и автоматически сделает доступными ваши новые версии для пользователей вашей текущей версии, после того как вы загрузите их. Кроме того Mozilla Add-ons позволяет пользователям оставлять комментарии и тем самым обеспечивает обратную связь с Вашим Расширением. Настоятельно рекомендуется использовать Mozilla Add-ons для распространения ваших расширений!</p>
<p>Зайдите на <a class="external" href="http://addons.mozilla.org/developers/" rel="freelink">http://addons.mozilla.org/developers/</a> создайте учётную запись и начинайте распространение ваших расширений!</p>
<p><em>Примечание:</em>Ваше Расширение будет скачиваться быстрее и чаще, если у вас будет хорошее описание и скриншоты с вашим расширением в действии.</p>
<h5 id="Registering_Extensions_in_the_Windows_Registry" name="Registering_Extensions_in_the_Windows_Registry">Регистрация расширений в реестре Windows</h5>
<p>В Windows, информация о расширениях может быть добавлена в реестр, откуда Расширение автоматически будет извлекаться в следующий раз, при загрузке приложения. This allows application installers to easily add integration hooks as extensions. Для получения более подробной информации смотри <a href="/en/Adding_Extensions_using_the_Windows_Registry" title="en/Adding_Extensions_using_the_Windows_Registry">Adding Extensions using the Windows Registry</a>.</p>
<h2 id="More_on_XUL_Overlays" name="More_on_XUL_Overlays">Подробнее о XUL Оверлеях</h2>
<p>Помимо добавления UI виджетов, вы также можете использовать XUL фрагменты для:</p>
<ul>
<li>Изменить атрибуты для "точки слияния", например <code><statusbar id="status-bar" hidden="true" /></code> (скрывается строка состояния)</li>
<li>Удалить "точку слияния" из главного документа, например, <code><statusbar id="status-bar" removeelement="true" /></code></li>
<li>Контроль позиции вставки “виджета”:</li>
</ul>
<pre class="eval"><statusbarpanel position="1" .../>
<statusbarpanel insertbefore="other-id" .../>
<statusbarpanel insertafter="other-id" .../>
</pre>
<h2 id="Creating_New_User_Interface_Components" name="Creating_New_User_Interface_Components">Создание новых компонентов UI</h2>
<p>Вы можете создавать ваши собственные окна и диалоговые окошки в отдельных .xul файлах, обеспечивая их функциональность с помощью описания действий пользователя в .js файлах, используя DOM для манипуляции UI “виджетами”. Вы можете использовать стили из .css файлов для присоединения изображений, установки цвета и т.д.</p>
<p>Смотрите документацию по XUL на крупных ресурсах для разработчиков <a href="/en/XUL" title="en/XUL">XUL</a>.</p>
<h2 id="Defaults_Files" name="Defaults_Files">Файлы По умолчанию</h2>
<p>Файлы по умолчанию, которые вы используете для профиля пользователя, должны быть помещены в <code>defaults/</code> в корень в иерархии папок вашего Расширения. По умолчанию .js файлы с настройками должны храниться в <code>defaults/preferences/</code> - после того как вы поместите их туда они будут автоматически загружаться в системные настройки Firefox при запуске, так что вы сможете получить к ним доступ использую <a href="/en/Preferences_API" title="en/Preferences_API">Preferences API</a>.</p>
<p>Пример файла настроек по умолчанию:</p>
<pre class="eval">pref("extensions.sample.username", "Joe"); //строка
pref("extensions.sample.sort", 2); //число
pref("extensions.sample.showAdvanced", true); //булево
</pre>
<h2 id="XPCOM_Components" name="XPCOM_Components">XPCOM Components</h2>
<p>Firefox поддерживает <a href="/en/XPCOM" title="en/XPCOM">XPCOM</a> компоненты в расширениях. Вы можете легко создавать свои собственные компоненты на JavaScript или C + + (с использованием <a href="/en/Gecko_SDK" title="en/Gecko_SDK">Gecko SDK</a>).</p>
<p>Поместите все ваши. JS или. DLL файлы каталог <code>components/</code> - после установки расширения , они автоматически будут зарегистрированы при первом запуске Firefox.</p>
<p>Для получения дополнительной информации см. <a href="/en/How_to_Build_an_XPCOM_Component_in_Javascript" title="en/How_to_Build_an_XPCOM_Component_in_Javascript">Как создать XPCOM компонент на JavaScript</a>, <a href="/en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio" title="en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio">Как создать XPCOM компонент с использованием Visual Studio</a> и <a href="/en/Creating_XPCOM_Components" title="en/Creating_XPCOM_Components">Книги по созданию XPCOM Компонентов</a>.</p>
<h5 id="Application_Command_Line" name="Application_Command_Line">Командная строка приложения</h5>
<p>Один из возможных вариантов использования пользовательских XPCOM компонентов добавить в командную строку указатель для Firefox или Thunderbird. Вы можете использовать этот метод для запуска ваших расширений, как приложений:</p>
<pre class="eval"> firefox.exe -myapp
</pre>
<p><span class="comment">I should move the useful parts of this to the Command Line page. -Nickolay This is done by adding a component containing the function... function NSGetModule(comMgr, fileSpec) { return myAppHandlerModule; } This function is run by firefox each time firefox is started. Firefox registers the myAppHandlerModule's by calling its 'registerSelf()'. Then it obtains the myAppHandlerModule's handler factory via 'getClassObject()'. The handler factory is then used to create the handle using its 'createInstance(). Finally, the handle's 'handle(cmdline)' processes the command line cmdline's handleFlagWithParam() and handleFlag().</span> Смотрите <a href="/en/Chrome/Command_Line" title="en/Chrome/Command_Line">Chrome: Command Line</a> , а также обсуждения <a class="external" href="http://forums.mozillazine.org/viewtopic.php?t=365297">на форуме</a>.</p>
<h2 id="Localization" name="Localization">Локализация</h2>
<p>Для поддержки более чем одного языка, вы должны вместо отдельных строк из вашего содержимого использовать <a href="/en/XUL_Tutorial/Localization" title="en/XUL_Tutorial/Localization">"сущности"</a> или a href="<a class="external" rel="freelink">mks://localhost/en/XUL_Tutorial/Property_Files</a>" title="en/XUL_Tutorial/Property_Files">"связки строк". Это лучше делать в самом начале разработки Вашего Расширения, а не возвращаться, к этому позже!</p>
<p>Информация о локализации хранится в каталоге локализации расширения. Например, чтобы добавить локализацию для нашего расширения, создайте директорию с именем "locale" в каталоге chrome (где находится каталог "content" ) и добавьте следующую строчку в файл chrome.manifest:</p>
<pre class="eval">locale sample en-US chrome/locale/en-US/
</pre>
<p>Для создания локализации , значения атрибута в XUL, вы вставляете его значение в <code>.ent</code> (или <code>.dtd</code>) файле который, затем помещаете каталог локализации и который выглядит так:</p>
<pre class="eval"><!ENTITY button.label "Click Me!">
<!ENTITY button.accesskey "C">
</pre>
<p>Затем, подключаете его в верхней части вашего XUL документа ( сразу под строкой ), вот так::</p>
<pre class="eval"><!DOCTYPE <strong>window</strong> SYSTEM "<a class="external" rel="freelink">chrome://packagename/locale/filename.ent</a>">
</pre>
<p>где <code><strong>window</strong></code> это <code><a href="/en/DOM/element.localName" title="en/DOM/element.localName">localName</a></code> значение, которое является корневым элементом вашего XUL документа, и свойство <code>SYSTEM</code> значение которого chorm URI к файлу с сущностями. Для примера нашего расширения, мы используем корневой элемент <code><strong>overlay</strong></code>.</p>
<p>Для использования сущностей измените ваш XUL, что бы он выглядел так:</p>
<pre class="eval"><button label="&button.label;" accesskey="&button.accesskey;"/>
</pre>
<p>Chrome реестр всегда будет загружать тот файл с сущностями, который соответствует текущей выбранной локализации.</p>
<p>Для строк которые вы используете в сценарии (скрипте), создайте файл .properties, текстовый файл который будет содержать строки в таком формате:</p>
<pre class="eval">key=value
</pre>
<p>а, затем используйте <code><a href="/en/NsIStringBundleService" title="en/NsIStringBundleService">nsIStringBundleService</a></code>/<code><a href="/en/nsIStringBundle" title="en/nsIStringBundle">nsIStringBundle</a></code> или тег <code><a class="external" href="http://xulplanet.com/references/elemref/ref_stringbundle.html"><stringbundle></a></code>, чтобы получить значения в сценарии (скрипте).</p>
<h2 id="Understanding_the_Browser" name="Understanding_the_Browser">Understanding the Browser</h2>
<p>Use the <a href="/en/DOM_Inspector" title="en/DOM_Inspector">DOM Inspector</a> to inspect the browser window or any other XUL window you want to extend.</p>
<p><strong>Примечание:</strong> <strong>DOM Inspector</strong> не устанавливается в режиме <strong>стандартной</strong> установки Firefox. Начиная с версии Firefox 3 Beta 4, DOM Inspector доступен с сайта <a class="link-https" href="https://addons.mozilla.org/en-US/firefox/addon/6622">Firefox Add-ons</a>, как автономное расширение. Для более ранних версий, вам необходимо переустановить FireFox в режиме Пользовательской установки и выбрать путь к DOM Inspector(или <strong>Developer Tools</strong> в Firefox 1.5), если DOM Inspector'a нет в меню Инструменты (Tools) в вашего браузера.</p>
<p>Используйте кнопку <img alt="Point-and-click icon" src="https://mdn.mozillademos.org/files/8571/point-and-click.png" style="width: 17px; height: 17px;"> в верхнем правом углу панели инструментов DOM Inspector для визуального выбора интересующего элемента в окне XUL. После выбора элемента, в окне DOM inspector появится DOM иерархия интересующего Вас элемента.</p>
<p><span style="line-height: 1.5;">Use the DOM Inspector's right side panel to discover merge points with ids that you can use to insert your elements from overlays. If you cannot discover an element with an id that you can merge into, you may need to attach a script in your overlay and insert your elements when the </span><code style="font-style: normal; line-height: 1.5;">load</code><span style="line-height: 1.5;"> event fires on the master XUL window.</span></p>
<h2 id="Debugging_Extensions" name="Debugging_Extensions">Debugging Extensions</h2>
<p><strong>Analytical Tools for Debugging</strong></p>
<ul>
<li>The <a href="/en/DOM_Inspector" title="en/DOM_Inspector">DOM Inspector</a> - inspect attributes, DOM structure, CSS style rules that are in effect (e.g. find out why your style rules don't seem to be working for an element - an invaluable tool!)</li>
<li><a href="/en/Venkman" title="en/Venkman">Venkman</a> - set breakpoints in JavaScript and inspect call stacks</li>
<li><code><a href="/En/Core_JavaScript_1.5_Reference/Functions_and_function_scope/arguments/callee" title="en/Core_JavaScript_1.5_Reference/Functions/arguments/callee">arguments.callee</a>.<a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/caller" title="en/Core_JavaScript_1.5_Reference/Global_Objects/Function/caller">caller</a></code> in JavaScript - access a function's call stack</li>
</ul>
<p><strong>printf debugging</strong></p>
<ul>
<li>Use <code><a href="/en/DOM/window.dump" title="en/DOM/window.dump">dump</a>("string")</code> (see the link for details; this requires a bit of configuration to work properly)</li>
<li>Use <code><a href="/en/Components.utils.reportError" title="en/Components.utils.reportError">Components.utils.reportError()</a></code> or <code><a href="/en/nsIConsoleService" title="en/nsIConsoleService">nsIConsoleService</a></code> to log to the JavaScript console</li>
</ul>
<p><strong>Advanced debugging</strong></p>
<ul>
<li>Run a debug Firefox build and set breakpoints in Firefox itself, or your C++ components. For the experienced developer, this is often the fastest way to diagnose a problem. See <a href="/en/Build_Documentation" title="en/Build_Documentation">Build Documentation</a> and <a href="/en/Developing_Mozilla" title="en/Developing_Mozilla">Developing Mozilla</a> for more information.</li>
<li>See <a href="/en/Debugging_a_XULRunner_Application" title="en/Debugging_a_XULRunner_Application">Debugging a XULRunner Application</a> for more helpful tips.</li>
</ul>
<h3 id="Quick_Start" name="Quick_Start">Быстрый старт</h3>
<p>Вы можете использовать <a class="external" href="http://ted.mielczarek.org/code/mozilla/extensionwiz/">Extension Wizard</a>, инструмент для создания простых Расширений.</p>
<p>A <a class="external" href="http://mozilla.doslash.org/stuff/helloworld.zip">Hello World extension</a> similar to what you can generate with the Extension Wizard is explained line-by-line in <a class="external" href="http://kb.mozillazine.org/Getting_started_with_extension_development">another tutorial from MozillaZine Knowledge Base</a>.</p>
<h3 id="Further_information" name="Further_information">Further information</h3>
<ul>
<li><a href="/en/Extension_Frequently_Asked_Questions" title="en/Extension_Frequently_Asked_Questions">Extension FAQ</a></li>
<li><a href="/en/Extensions" title="en/Extensions">Extensions</a></li>
</ul>
|