blob: 03b01cfbddb93c5b4d6e12541b5484160b30c191 (
plain)
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
|
---
title: Building an Extension
slug: Building_an_Extension
tags:
- Add-ons
- Extensions
---
<p> </p>
<h4 id=".E5.BA.8F.E7.AB.A0" name=".E5.BA.8F.E7.AB.A0">序章</h4>
<p>このチュートリアルでは、基本的な拡張機能を作る手順を段階を追って説明していきます。まずはFirefoxのステータスバーパネルに「<strong>Hello, World!</strong>」を表示してみましょう。</p>
<div class="note">
<p><strong>注意</strong> このチュートリアルは、Firefox 1.5 の拡張機能の作成方法です。それ以前のバージョンの作成方法については、別のチュートリアルを参照してください。</p>
</div>
<h4 id=".E9.96.8B.E7.99.BA.E7.92.B0.E5.A2.83.E3.82.92.E6.BA.96.E5.82.99.E3.81.99.E3.82.8B" name=".E9.96.8B.E7.99.BA.E7.92.B0.E5.A2.83.E3.82.92.E6.BA.96.E5.82.99.E3.81.99.E3.82.8B">開発環境を準備する</h4>
<p>拡張機能は、ZIPファイルの形式で固めて配布するか、さもなくば <strong>拡張子が<code>xpi</code>のファイル(実体はZIP形式です)</strong>を<a href="/ja/Bundles" title="ja/Bundles">バンドル</a>します。XPIファイルの構造は下記のとおりです。</p>
<pre class="eval">extension.xpi:
/<a href="/ja/Install_Manifests" title="ja/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="/ja/Chrome_Registration" title="ja/Chrome_Registration">chrome.manifest</a>
/<a href="/ja/Window_icons" title="ja/Window_icons">chrome/icons/default/*</a>
/chrome/
/chrome/content/
</pre>
<p>自作のソースをzipに固めるのにMakefileやシェルスクリプトを書きたくないのであれば、上記と同じようにファイルを配置してみるのが一番簡単です。たとえ準備ができているとしても、一度このように広げて確認してみると、Firefox 1.5 のアドオンの仕組みがずっと簡単になります。</p>
<p>それでは始めましょう。まずハードディスク上に、拡張機能用のフォルダ(例:「<code>C:\extensions\myExtension\」</code>や<code>「~/extensions/myExtension/」</code>等)を作って下さい。このフォルダの中に「<code>chrome</code>」という名前のフォルダを作成します。この「<code>chrome</code>」の中に「<code>content</code>」というフォルダを作成します。(UNIX系のシステムであれば、拡張機能のrootディレクトリから「<code>mkdir -p chrome/content</code>」と叩くだけで2つのディレクトリが作成できます。)</p>
<p>次に、あなたの拡張機能用フォルダ(<strong>root</strong> とします)に、<code>chrome</code> フォルダと並んで 2つの新規ファイルを作成します。1つは「<code>chrome.manifest</code>」で、もう1つは「<code>install.rdf</code>」です。</p>
<p>開発環境の準備に関するもっと多くの助言が、<a class="external" href="http://kb.mozillazine.org/Setting_up_extension_development_environment">Mozillazine Knowledge Base</a> にもありますので、そちらも参考にしてください。</p>
<h4 id=".E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.83.9E.E3.83.8B.E3.83.95.E3.82.A7.E3.82.B9.E3.83.88.E3.82.92.E4.BD.9C.E3.82.8B" name=".E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.83.9E.E3.83.8B.E3.83.95.E3.82.A7.E3.82.B9.E3.83.88.E3.82.92.E4.BD.9C.E3.82.8B">インストールマニフェストを作る</h4>
<p>拡張機能の root フォルダに作った <code><a href="/ja/Install_Manifests" title="ja/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@foo.net" rel="freelink">sample@foo.net</a></strong></em:id>
<em:version><strong>1.0</strong></em:version>
<em:type>2</em:type>
<!-- Target Application this extension can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong></em:id>
<em:minVersion><strong>1.0+</strong></em:minVersion>
<em:maxVersion><strong>1.5.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.foo.com/</span></strong></em:homepageURL>
</Description>
</RDF>
</pre>
<ul>
<li><strong><a class="link-mailto" href="mailto:sample@foo.net" rel="freelink">sample@foo.net</a></strong> - この拡張機能の ID です。これはあなたの拡張機能を識別するためのメールアドレス形式の値です(「あなたのメールアドレス」を書くところではありませんよ?)。他の機能拡張とかぶらないよう、ユニークな値にします。GUIDを使う事もできます。</li>
<li><code><em:type>2</em:type></code> の指定 -- この「2」は拡張機能であることを表しています。 (他の値の意味については <a href="/ja/Install_Manifests#type" title="ja/Install_Manifests#type">Install Manifests#type</a> を参照のこと)。</li>
<li><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong> - Firefoxのアプリケーション ID です。</li>
<li><strong>1.0+</strong> - この拡張機能が動作するFirefoxの最小バージョン。あなたが動作確認して、バグを修正する責任を持とうとする最小のバージョンを指定して下さい。</li>
<li><strong>1.5.0.*</strong> - この拡張機能が動作するFirefoxの最大バージョン。この値を現時点の最新版よりも大きな値にしないように!</li>
</ul>
<p><a href="/ja/Install_Manifests" title="ja/Install_Manifests">Install Manifests</a> には必須のプロパティもオプションのプロパティも全て網羅されています。</p>
<p>ファイルを保存します。</p>
<h4 id="XUL_.E3.81.A7.E3.83.96.E3.83.A9.E3.82.A6.E3.82.B6.E3.82.92.E6.8B.A1.E5.BC.B5.E3.81.99.E3.82.8B" name="XUL_.E3.81.A7.E3.83.96.E3.83.A9.E3.82.A6.E3.82.B6.E3.82.92.E6.8B.A1.E5.BC.B5.E3.81.99.E3.82.8B">XUL でブラウザを拡張する</h4>
<p>Firefox のユーザインタフェースは XUL と JavaScript で書かれます。<a href="/ja/XUL" title="ja/XUL">XUL</a> はボタン、メニュー、ツールバー、ツリーといったユーザインタフェースの部品を提供するための XML の文法です。ユーザーの行動は JavaScript を使って関数のように結び付いています。</p>
<p>ブラウザを拡張するために、我々は部品を加えるか修正することでブラウザのユーザーインタフェースの一部を修正します。我々は新しい XUL DOM 要素をブラウザウインドウに挿入することによって部品を追加し、スクリプトにイベントハンドラを付加することによって修正します。</p>
<p>ブラウザは <code>browser.xul</code> (<code>$FIREFOX_INSTALL_DIR/chrome/browser.jar</code> に含まれる <code>content/browser/browser.xul</code>)と呼ばれる XUL ファイルに実装されています。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_.E3.82.AA.E3.83.BC.E3.83.90.E3.83.AC.E3.82.A4.E6.96.B9.E5.BC.8F" name="XUL_.E3.82.AA.E3.83.BC.E3.83.90.E3.83.AC.E3.82.A4.E6.96.B9.E5.BC.8F">XUL オーバレイ方式</h5>
<p><a href="/ja/XUL_Overlays" title="ja/XUL_Overlays">XUL オーバレイ方式</a>とは、動的に他の UI 部品を 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><strong>status-bar</strong></code> という名前の <code><statusbar></code> で、ブラウザウィンドウの中のくっつけたい「マージポイント」を指定しています。</p>
<p><code><statusbarpanel></code> はその子要素で、マージポイントに追加したい部品です。</p>
<p>上記のサンプルコードを <code><strong>sample.xul</strong></code> という名前のファイルに書いて、先ほど作った <code>chrome/content</code> に保存して下さい。</p>
<p>オーバーレイを使っての部品の追加やユーザーインターフェースの修正に関する詳細は、下記を参照して下さい。</p>
<h4 id="Chrome_URI.E3.81.AE.E6.9B.B8.E5.BC.8F" name="Chrome_URI.E3.81.AE.E6.9B.B8.E5.BC.8F">Chrome URIの書式</h4>
<p>XUL ファイルは、 "<a href="/ja/Chrome_Registration" title="ja/Chrome_Registration">Chrome パッケージ</a>" と呼ばれる ユーザーインターフェースコンポーネントのかたまりの一部です。これらは「<code>file://</code>」といったURIではなく、「<code>chrome://</code>」といった URI で呼び出されます(これはプラットフォームの依存度を下げるためです)。XUL ファイルの URI を インストールされたアプリケーションに引き継ぐために、Mozillaの開発者がこの解決策を考えつきました。</p>
<p>ブラウザのウィンドウは <code><a class="external" rel="freelink">chrome://browser/content/browser.xul</a></code> です。試しにこの URL を Firefox のロケーションバーに打ち込んでみてください!</p>
<p>Chrome URI はいくつかの要素から成り立っています。</p>
<ul>
<li>第1に <strong>URI スキーマ</strong> (<code>chrome</code>の部分) 、これでFirefox のネットワーキングライブラリに「これは Chrome URIである」と伝えることでその内容がロードされますので、特別に処理される必要があります。</li>
<li>第2に、ユーザインタフェースコンポーネントの包みを識別するパッケージ名(上記の例では <code><strong>browser</strong></code>の部分)。これは拡張同士の競合を避けるために、可能な限りあなたのアプリケーションに特有であるべきです。</li>
<li>第3に、リクエストするデータの種類。これには3種類あります。
<ul>
<li><code>content</code> (XUL, JavaScript, XBL バインディングといったアプリケーション UI の構造と振舞いを構成しています。)</li>
<li><code>locale</code> (DTD, .properties ファイルといった UI の<a href="/ja/Localization" title="ja/Localization">地域化</a>のための文言を含んでいます。)</li>
<li><code>skin</code> (CSS や画像といった、UI の <a href="/ja/Themes" title="ja/Themes">見た目</a> の部分を構成します。)</li>
</ul>
</li>
<li>最後に、ロードするファイルへのパスです。</li>
</ul>
<p>つまり、<code><a class="external" rel="freelink">chrome://foo/skin/bar.png</a></code> だと、<code>foo</code> テーマの <code>skin</code> セクションの <code>bar.png</code> というファイルを呼び出すのです。</p>
<p>あなたが Chrome URI を使って内容をロードするとき、 Firefox はこれらのURIを実際のディスク上のソースファイル(もしくはJARパッケージ)に変換するのに、Chromeレジストリを使用します。</p>
<h4 id="Chrome_Manifest.E3.81.AE.E4.BD.9C.E6.88.90" name="Chrome_Manifest.E3.81.AE.E4.BD.9C.E6.88.90">Chrome Manifestの作成</h4>
<p>Chrome Manifest に関するさらに詳細な情報と、それがサポートするプロパティについては、<a href="/ja/Chrome_Manifest" title="ja/Chrome_Manifest">Chrome Manifest</a> を参照して下さい。</p>
<p>先ほど root フォルダに <code>chrome</code> というディレクトリと並べて作成した <code><strong>chrome.manifest</strong></code> を開いて下さい。</p>
<p>下記の一文を追加します。</p>
<pre class="eval">content sample chrome/content/
</pre>
<p>(<strong>最後のスラッシュ "<code>/</code>" を忘れない事!</strong> さもないと、拡張機能はロードされません。)</p>
<p>注意: Firefox/Thunderbird 2 とそれ以前のバージョンでは混合/大文字をサポートしていないので、必ず小文字のパッケージ名 ("sample") を使ってください。 - {{ Bug(132183) }}</p>
<p>ここで指定しているのは、</p>
<ol>
<li>chrome パッケージの物の種類</li>
<li>chrome パッケージの名前</li>
<li>chrome パッケージファイルの場所</li>
</ol>
<p>つまりこの行は、「chrome パッケージ名が <strong>sample</strong>」で「<strong>content</strong> ファイルが <code>chrome/content</code> (<code>chrome.manifest</code>の相対パス) にある」という事を表しているのです。</p>
<p>「content」「locale」「skin」に相当するファイルは、それぞれ<code>chrome</code> のサブディレクトリである「content」「locale」「skin」のディレクトリ下に配置しなくてはならない事を注意してください。</p>
<p>ファイルを保存して下さい。あなたが拡張機能を入れて Firefox を起動した時に(このチュートリアルの後で)、chrome パッケージが登録されます。</p>
<h4 id=".E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.AC.E3.82.A4.E3.81.AE.E7.99.BB.E9.8C.B2" name=".E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.AC.E3.82.A4.E3.81.AE.E7.99.BB.E9.8C.B2">オーバーレイの登録</h4>
<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>これはFirefox に、「 browser.xul をロードする時に sample.xul を browser.xul にマージする」という意味です。</p>
<h4 id=".E3.83.86.E3.82.B9.E3.83.88" name=".E3.83.86.E3.82.B9.E3.83.88">テスト</h4>
<p>最初に、我々はあなたの拡張機能の存在を Firefox に伝えなくてはなりません。昔、Firefox 1.0 の頃にはこれは、あなたの拡張機能を XPI としてパッケージ化して、ユーザインタフェースを通じてそれをインストールする事を意味していました。これが実に辛い。でも、今はもっとずっと簡単です。</p>
<ol>
<li>あなたの環境の <a class="external" href="http://kb.mozillazine.org/Profile_folder">プロファイルフォルダ</a>を開いてください。</li>
<li>そこにある <strong>extensions</strong> という名前のフォルダを開いて下さい。(なければ作成して下さい。)</li>
<li>新しいテキストファイルを作成して、その中にあなたの機能拡張フォルダのパス(例:「<code>C:\extensions\myExtension\</code>」とか「<code>~/extensions/myExtension</code>」とか。)を書いて、そのファイルをあなたの拡張機能のIDと同じ名前(例:「<code><a class="link-mailto" href="mailto:sample@foo.net" rel="freelink">sample@foo.net</a></code>」)で保存して下さい。</li>
</ol>
<p>これで拡張機能のテストの準備ができました!</p>
<p>Firefoxを起動します。Firefox はあなたの拡張機能のディレクトリへのテキストリンクを検出して、そして拡張機能をインストールしてくれます。ブラウザウインドウが表示されると、ステータスバーパネルの右側でテキスト「Hello, World!」と表示されているのが見えるでしょう。</p>
<p>戻って「.xul」ファイルを修正した場合も、ファイルを閉じて Firefox を再起動すれば、その結果が反映されます。</p>
<p><span class="comment">These don't actually match the described extension and confuse people. -Nickolay CENTER> Image:Helloworld_tools_menu.PNG Image:Helloworld_extensions_wnd.PNG </CENTER</span></p>
<h4 id=".E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8.E5.8C.96" name=".E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8.E5.8C.96">パッケージ化</h4>
<p>あなたの拡張機能が動作する今、あなたは配備とインストールのためにそれを<a href="/ja/Extension_Packaging" title="ja/Extension_Packaging">パッケージ</a>することができます。</p>
<p>あなたの拡張機能のフォルダのコンテンツ(rootフォルダ自体を圧縮するのではなく、中身だけ)をZipで圧縮し、そのZipファイルの拡張子を「.xpi」に変更します。Windows XP ではもっと簡単で、root フォルダの下の全てのファイル・ディレクトリを選択して右クリックして、「送る」->「圧縮(zip形式)フォルダ」を選択します。これで拡張子「.zip」のファイルができます。あとはファイル名を変更すればおしまい!</p>
<p>次に「.xpi」ファイルをあなたのサーバーにアップロードして、MIMEタイプが「<code>application/x-xpinstall</code>」になっている事を確認して下さい。これであなたはリンクを張って、みんながダウンロードしてFirefoxにインストールする事を可能にできます。</p>
<h5 id="addons.mozilla.org_.E3.81.AE.E5.88.A9.E7.94.A8" name="addons.mozilla.org_.E3.81.AE.E5.88.A9.E7.94.A8">addons.mozilla.org の利用</h5>
<p>Mozilla Update は、あなたが無料であなたの拡張機能を配布する事ができるサイトです。あなたの拡張機能は、非常に人気が高くなっても安定的にダウンロードできるように、Mozillaのミラーサーバー上にも格納されます。Mozillaのサイトはまた、ユーザーにより容易なインストレーションを提供し、さらにあなたが新バージョンをアップロードした時には、既存のユーザーにその新バージョンを自動で提供します。さらに Mozilla Update では、ユーザーのコメントをあなたにフィードバックさせる事も可能です。あなたがあなたの拡張機能を Mozilla Update で配布する事は、強く推奨されているのです!</p>
<p><a class="external" href="/http://addons.mozilla.org/developers/%7Chttp://addons.mozilla.org/developers" title="http://addons.mozilla.org/developers/|http://addons.mozilla.org/developers">http://addons.mozilla.org/developers/|http://addons.mozilla.org/developers</a>を訪ねて、アカウントを作って機能拡張を配布してみて下さい。</p>
<p><em>注意:</em> あなたの拡張機能は、もし丁寧な説明文と動作のスクリーンショットがあれば、より早く知られて、もっとダウンロードされるでしょう。</p>
<h5 id=".E6.8B.A1.E5.BC.B5.E6.A9.9F.E8.83.BD.E3.81.AEWindows.E3.83.AC.E3.82.B8.E3.82.B9.E3.83.88.E3.83.AA.E3.81.B8.E3.81.AE.E7.99.BB.E9.8C.B2" name=".E6.8B.A1.E5.BC.B5.E6.A9.9F.E8.83.BD.E3.81.AEWindows.E3.83.AC.E3.82.B8.E3.82.B9.E3.83.88.E3.83.AA.E3.81.B8.E3.81.AE.E7.99.BB.E9.8C.B2">拡張機能のWindowsレジストリへの登録</h5>
<p>Windows では、拡張機能の情報をレジストリに登録する事ができます。これによって拡張機能は次回自動的に呼び出されてアプリケーションが起動されます。これはアプリケーションインストーラに拡張機能として容易にインテグレーションフックを加えることを許すものです。詳細は<a href="/ja/Adding_Extensions_using_the_Windows_Registry" title="ja/Adding_Extensions_using_the_Windows_Registry">Windowsレジストリへの拡張機能の登録</a>を参照の事。</p>
<h4 id="XUL_.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.AC.E3.82.A4.E6.96.B9.E5.BC.8F.E3.81.AE.E8.BF.BD.E5.8A.A0.E6.83.85.E5.A0.B1" name="XUL_.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.AC.E3.82.A4.E6.96.B9.E5.BC.8F.E3.81.AE.E8.BF.BD.E5.8A.A0.E6.83.85.E5.A0.B1">XUL オーバーレイ方式の追加情報</h4>
<p>UI部品をマージポイントに追加するだけでなく、XUL のかたまりをオーバーレイの中で使う事もできます。</p>
<ul>
<li>マージポイントの属性の変更</li>
</ul>
<dl>
<dd>
<dl>
<dd>
(例:「<code><statusbar id="status-bar" hidden="true"/></code>」(ステータスバーを隠す))</dd>
</dl>
</dd>
</dl>
<ul>
<li>マスタードキュメントからマージポイントの削除</li>
</ul>
<dl>
<dd>
<dl>
<dd>
(例:「<code><statusbar id="status-bar" removeelement="true"/></code>」)</dd>
</dl>
</dd>
</dl>
<ul>
<li>追加した部品の位置の操作</li>
</ul>
<pre class="eval"><statusbarpanel position="1" .../>
<statusbarpanel insertbefore="other-id" .../>
<statusbarpanel insertafter="other-id" .../>
</pre>
<h4 id=".E6.96.B0.E3.81.97.E3.81.84.E3.83.A6.E3.83.BC.E3.82.B6.E3.83.BC.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.82.B3.E3.83.B3.E3.83.9D.E3.83.BC.E3.83.8D.E3.83.B3.E3.83.88.E3.81.AE.E4.BD.9C.E6.88.90" name=".E6.96.B0.E3.81.97.E3.81.84.E3.83.A6.E3.83.BC.E3.82.B6.E3.83.BC.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.82.B3.E3.83.B3.E3.83.9D.E3.83.BC.E3.83.8D.E3.83.B3.E3.83.88.E3.81.AE.E4.BD.9C.E6.88.90">新しいユーザーインターフェースコンポーネントの作成</h4>
<p>自分で作ったウィンドウとダイアログボックスを「.xul」ファイルを分けて作ったり、UI部品を操作するためのDOMメソッドを「.js」ファイルに実装する事で、機能として提供できます。また、「.css」ファイルにスタイルを定義しておけば、色の設定など、見た目を触る事もできます。</p>
<p>XUL開発のためのもっと詳しい情報は、<a href="/ja/XUL" title="ja/XUL">XUL</a>の文章を参照して下さい。</p>
<h4 id="Defaults_.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB" name="Defaults_.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB">Defaults ファイル</h4>
<p>Defaults ファイルは、拡張機能の root フォルダの下の <code>defaults/</code> というフォルダにあって、ユーザーのプロファイルを後押しするのに使います。デフォルトの情報は<code>defaults/preferences/</code> の下の「.js」ファイルに格納されます。ファイルをここに置いておけば Firefoxのプリファレンスシステムが起動時に自動的に読み込んでくれますので、あなたのプログラムは<a href="/ja/Preferences_API" title="ja/Preferences_API">プリファレンスAPI</a>を通じてデフォルトの情報を参照する事が可能です。</p>
<h4 id="XPCOM_.E3.82.B3.E3.83.B3.E3.83.9D.E3.83.BC.E3.83.8D.E3.83.B3.E3.83.88" name="XPCOM_.E3.82.B3.E3.83.B3.E3.83.9D.E3.83.BC.E3.83.8D.E3.83.B3.E3.83.88">XPCOM コンポーネント</h4>
<p>Firefox は拡張機能で <a href="/ja/XPCOM" title="ja/XPCOM">XPCOM</a> コンポーネントの利用をサポートしています。ですからあなたは JavaScript や C++ で(<a href="/ja/Gecko_SDK" title="ja/Gecko_SDK">Gecko SDK</a>を使って) 簡単にあなたのコンポーネントを作る事ができます。</p>
<p>自作の「.js」「.dll」ファイルは<code>components/</code> ディレクトリに置いて下さい。そうすれば拡張機能をインストールした最初のFirefox起動時に、自動的に登録されます。</p>
<p>詳細については <a href="/ja/How_to_Build_an_XPCOM_Component_in_Javascript" title="ja/How_to_Build_an_XPCOM_Component_in_Javascript">How to Build an XPCOM Component in Javascript</a> および <a href="/ja/Creating_XPCOM_Components" title="ja/Creating_XPCOM_Components">Creating XPCOM Components</a> bookを参照してください。</p>
<h5 id=".E3.82.A2.E3.83.97.E3.83.AA.E3.82.B1.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E3.83.A9.E3.82.A4.E3.83.B3.E3.81.AE.E6.93.8D.E4.BD.9C" name=".E3.82.A2.E3.83.97.E3.83.AA.E3.82.B1.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E3.83.A9.E3.82.A4.E3.83.B3.E3.81.AE.E6.93.8D.E4.BD.9C">アプリケーションコマンドラインの操作</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 ファンクションを含んだコンポーネントを追加する事によって、これは実行されます。 function NSGetModule(comMgr, fileSpec) { return myAppHandlerModule; } このファンクションはFirefox 起動を起動するたびに、Firefox から呼び出されます。 #Firefox はmyAppHandlerModuleの「registerSelf()」を呼ぶことによって、 myAppHandlerModule を登録します。 #それから「getClassObject()」によって myAppHandlerModule のハンドラファクトリを入手します。 #ハンドラファクトリはその「createInstance()」を使ってハンドルを作るために使われます。 #最終的にハンドルの「handle(cmdline)」で、コマンドライン(cmdline)の 「handleFlagWithParam()」と「handleFlag()」を処理します。</span> 詳細については、<a href="/ja/Chrome/Command_Line" title="ja/Chrome/Command_Line">Chrome: Command Line</a>と <a class="external" href="http://forums.mozillazine.org/viewtopic.php?t=365297">forum Discussion</a> を参照して下さい。</p>
<h4 id="Localization_.28.E5.9C.B0.E5.9F.9F.E5.8C.96.29" name="Localization_.28.E5.9C.B0.E5.9F.9F.E5.8C.96.29">Localization (地域化)</h4>
<p>複数言語をサポートするために、あなたは <a href="/ja/XUL_Tutorial/Localization" title="ja/XUL_Tutorial/Localization">エンティティ</a>や<a href="/ja/XUL_Tutorial/Property_Files" title="ja/XUL_Tutorial/Property_Files">文字列のバンドル</a> を使ってコンテンツから文字列を分離するべきです。開発時にやっておけば、後から戻ってきてやるよりもずっと楽ですよ!</p>
<p>拡張機能の地域化の情報は、「locale」ディレクトリの中に格納します。例えば、サンプル機能拡張に国依存の情報を追加したい場合、ディレクトリ「chrome」(「content」ディレクトリがあるのと同じ場所です)の中に「locale」ディレクトリを作り、そこにファイル「chrome.manifest」を作成して下記の一文を記述します。</p>
<pre class="eval">locale sample sampleLocale chrome/locale/
</pre>
<p>XULで地域化した属性値を与えるためには、その値を「<code>.ent</code>」ファイル(または「<code>.dtd</code>」ファイル)に記述します。これは「locale」ディレクトリに、こんな感じで書いておきます。</p>
<pre class="eval"><!ENTITY button.label "Click Me!">
<!ENTITY button.accesskey "C">
</pre>
<p>そうしたら、今度はあなたが書いた XUL ドキュメントの先頭(但し "<?xml version"1.0"?>" よりは下)に下記のように書きます。</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="/ja/DOM/element.localName" title="ja/DOM/element.localName">地域名</a></code> であり、XUL文書のルート要素となります。<code>SYSTEM</code> プロパティは、エンティティファイルへの chrome 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」ファイルを作成して、下記の書式で1つ1行で指定します。</p>
<pre class="eval">key=value
</pre>
<p>スクリプト中で値を取得するには、<code><a href="/ja/NsIStringBundleService" title="ja/NsIStringBundleService">nsIStringBundleService</a></code>/<code><a href="/ja/NsIStringBundle" title="ja/NsIStringBundle">nsIStringBundle</a></code>や、<code><a class="external" href="http://xulplanet.com/references/elemref/ref_stringbundle.html"><stringbundle></a></code> タグを使用します。</p>
<h4 id=".E3.83.96.E3.83.A9.E3.82.A6.E3.82.B6.E3.82.92.E7.90.86.E8.A7.A3.E3.81.99.E3.82.8B" name=".E3.83.96.E3.83.A9.E3.82.A6.E3.82.B6.E3.82.92.E7.90.86.E8.A7.A3.E3.81.99.E3.82.8B">ブラウザを理解する</h4>
<p>ブラウザウィンドウや他のXULウィンドウの検査をするのには、<a href="/ja/DOM_Inspector" title="ja/DOM_Inspector">DOMインスペクタ</a>を使用します。 (これはFirefoxの「標準」インストールには含まれませんので、「カスタムインストール」で再インストールして「開発者ツール」を選択すれば、ブラウザのツールメニューに「DOM Inspector」が表示されます)</p>
<p>DOMインスペクタのツールバーの左上の「ノードファインダボタン」を押してから、検査したいウィンドウのオブジェクトをクリックすると、視覚的に選択したものの情報が表示されます。この時、DOMインスペクタのDOMツリービューは、あなたがクリックしたものの所にジャンプルするでしょう。</p>
<p>DOMインスペクタの右側のパネルでマージポイントとあなたがオーバーレイから追加した要素を見つけるのにも使います。もしあなたがマージした要素が見つけられないのであれば、マスターのXULウィンドウが呼び出された(<code>load</code>イベントが発行された)タイミングで、あなたのオーバーレイでスクリプト割り付けて要素を追加する必要があるかもしれません。</p>
<h4 id=".E6.8B.A1.E5.BC.B5.E6.A9.9F.E8.83.BD.E3.81.AE.E3.83.87.E3.83.90.E3.83.83.E3.82.B0" name=".E6.8B.A1.E5.BC.B5.E6.A9.9F.E8.83.BD.E3.81.AE.E3.83.87.E3.83.90.E3.83.83.E3.82.B0">拡張機能のデバッグ</h4>
<p><strong>デバッグ用の分析ツール</strong></p>
<ul>
<li><a href="/ja/DOM_Inspector" title="ja/DOM_Inspector">DOMインスペクタ</a> - 属性・DOM構造・CSSスタイルルールの検査が実施されます。(例えば、あなたのスタイルルールが特定の要素では効いてなさそうな場合に調査する、非常に便利なツールです!)</li>
<li><a href="/ja/Venkman" title="ja/Venkman">Venkman</a> - ブレークポイントを JavaScript にセットして、スタック呼び出しを検証します。</li>
<li><code><a href="/ja/Core_JavaScript_1.5_Reference/Objects/Function/arguments/callee" title="ja/Core_JavaScript_1.5_Reference/Objects/Function/arguments/callee">arguments.callee</a>.<a href="/ja/Core_JavaScript_1.5_Reference/Objects/Function/caller" title="ja/Core_JavaScript_1.5_Reference/Objects/Function/caller">caller</a></code> in JavaScript - ファンクションのスタックにアクセスします。</li>
</ul>
<p><strong>printf デバッグ</strong></p>
<ul>
<li>Firefox をコマンドラインから <code>-console</code> オプションをつけて起動します。使う時には <code><a href="/ja/DOM/window.dump" title="ja/DOM/window.dump">dump</a>("string")</code> で文字列を出力できます。(詳細はリンク先を見てください)</li>
<li>JavaScript コンソールにログ出力するのには、<code><a href="/ja/nsIConsoleService" title="ja/nsIConsoleService">nsIConsoleService</a></code> を使用します。</li>
</ul>
<p><strong>さらに上のデバッグ</strong></p>
<ul>
<li>デバッグビルド版のFirefoxを動かして、Firefoxなり あなたのC++のモジュールなりにブレークポイントをセットします。経験豊かな開発者にとっては、このやり方がしばしば問題を診断する最速の方法です。詳細は <a href="/ja/Developer_Guide/Build_Instructions" title="ja/Developer_Guide/Build_Instructions">Build Documentation</a> および <a href="/ja/Developing_Mozilla" title="ja/Developing_Mozilla">Developing Mozilla</a> を参照してください。</li>
<li><a href="/ja/Debugging_a_XULRunner_Application" title="ja/Debugging_a_XULRunner_Application">Debugging a XULRunner Application</a>にもっと詳しい情報があります。</li>
</ul>
<h3 id=".E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.83.BB.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88" name=".E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.83.BB.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88">クイック・スタート</h3>
<p>機能する簡単な拡張機能を作るために <a class="external" href="http://ted.mielczarek.org/code/mozilla/extensionwiz/">Extension Wizard</a> オンラインツールを使えます。</p>
<p>Extension Wizard を使って作ったのと同じような <a class="external" href="http://mozilla.doslash.org/stuff/helloworld.zip">Hello World 拡張機能</a> の一行一行の説明が <a class="external" href="http://kb.mozillazine.org/Getting_started_with_extension_development">another tutorial from MozillaZine Knowledge Base</a> にあります。</p>
|