現在の位置

diffプラグインを使用中


このチュートリアルは 2004 年時点のもので、現在の Firefox とは拡張の作成方法が異なります。
Firefox 3 の拡張の作成については、
http://piro.sakura.ne.jp/xul/doc/tutorial/
で公開されているチュートリアルを参照してください。

#contents

**チュートリアル [#mf95723f]
~原文: [[How to write Firefox extensions:http://roachfiend.com/archives/2004/12/08/how-to-create-firefox-extensions/]] (訳: Firefoxエクステンションの書き方)
*** 例で学ぼう [#t53d992d]
~誰もが一度や二度は Web ブラウザに追加する新機能のいいアイデアを考えたことがあるだろう。
~さて、Mozilla Firefox ではうれしいことに、今すぐにでもそうすることができるんだ。
必要なのは XUL と JavaScript の半端な知識だけで、両方の達人になる必要なんかない。
~僕ははじめたときは、本当に片方については何もしらなかった。そこかしこでちょっと bookmarklet を見たことがあって、それがどうやって動くのか理解するのに試してみただけだった。
~さて、これは僕が書いた最初の拡張の BugMeNot で、僕が書いた最初のチュートリアルの参照ポイントとして使われたものだ。
よくある
"Hello, world!" の例のかわりにこのチュートリアルを見たいと思うなら、[[ここで見られる:http://extensions.roachfiend.com/howto_bug.html]]よ。 
~基本的に、このチュートリアルはスクラッチから最初の拡張を作る方法を書いてある。大抵のプログラマはいつも有名な "Hello, World!" の例から学ぶけど、拡張の作り方を紹介するのにいいやり方だと僕も思う。
~XULPlanet に出来のいいちょっとした[[チュートリアル:http://www.xulplanet.com/tutorials/xultu/advmenu.html]]がある。メニューを作る基本を書いたものだ。
mozilla.org にもとても便利な[[DOM Window インターフェース リファレンス:http://www.mozilla.org/docs/dom/domref/dom_window_ref.html#1004028]] がある。
よければこれらをざっと見ておいてほしい。これらはどちらもプログラムに興味を持つ人に向けて書かれているけれども、このチュートリアルを読み進むにあたって、全てを理解する必要なんかない。
*** Hello, world! [#i7c583f6]
~この拡張は右クリックメニューかツールメニューの項目を選んだあと、"Hello, world!" と宣言するウィンドウをポップアップするナイスでシンプルな拡張になるはずだ。
これらの場所はどちらも非常にポピュラーな位置で、比較的簡単に何かを差し込める。
~最終結果がどういう感じになるのか確かめてみてほしい。これで何を当てにすればいいか分かる。
まず、ここにこの拡張にアクセスするための2つの方法がある:
~右クリックでこうなるはずだ:
#ref(rightclick.png,nolink)
~ツールメニューはこういう感じになる:
#ref(tools.png,nolink)
~拡張が作用した最後の結果:
#ref(alert.png,nolink)
~拡張マネージャの様子:
#ref(extensions.png,nolink)
~拡張マネージャ内の "About..." (...について) をクリックするとこうなるだろう:
#ref(about.png,nolink)
*** XPI の内部の様子 [#pcd01974]
~ここでは、作成済みの Hello, world! の拡張を例に使って、拡張の分解の仕方を簡単に解説しよう:

~(それを[[ここでダウンロード:http://extensions.roachfiend.com/helloworld.xpi]]できる。右クリックで保存すれば、ここでやってることについてこれるよ)
~helloworld.xpi はパッケージ済みの拡張だ。XPI というのは、要するに君のブラウザがブラウザの拡張として認識するはずのファイル形式だ。
~実際には、それはただの ZIP ファイルなんだ。つまり、もし君が望むなら、名前を XPI から ZIP や、同様に JAR などに変えて、そして [[7-Zip:http://www.7-zip.org/]] や [[WinRAR:http://rarlabs.com/]] みたいなアーカイブプログラムを使って開くことができる。そして、一旦開いてみると、こういう感じになるはずだ:

-chrome
-install.js
-install.rdf

~フォルダと2つのファイルだ。
~かつて install.js はすべてのインストーラに必要とされていた。しかし現在は (Firefox 0.9 から) 拡張マネージャが変わって、代わりに install.rdf が使われるようになった。いまは、install.js は純粋に初期のバージョンの Firefox/bird と、Mozilla、Netscape のために使われる。
~Firefox 0.9 かそれ以降のバージョンだけのためにこの拡張を作りたければ、このファイルは任意で省略しても構わない。僕の場合はこれを作るのに少しの時間しかかからないのと、使う人たちに幅広い互換性を保てるから、これをキープしがちだ。でも、場合によってはどうしても後方互換性を保てない拡張もある。例えば僕の [[ListZilla:http://extensions.roachfiend.com/index.html#listzilla]] 拡張だけど、これは情報を全て 0.9 の拡張マネージャから集めるようになっている。ただし、ナイスでシンプルな "Hello, world!" プロンプトにはどんな問題も存在するべきじゃない。
~もし君が install.js を開いたとしたら、君がそれを改造して自分のインストールスクリプトを作る必要があれば、それがとても簡単そうに見えると思う。

 // --- 編集できる項目の開始 ---
 extFullName: 'Hello, world!', // ユーザーに表示した名前 (バージョンを除く)
 extShortName: 'helloworld', // JARファイルのリーフ名 (.jar 部分なし)
 extVersion: '0.1',
 extAuthor: 'Eric Hamiter',
 extLocaleNames: null, // 例 ['en-US', 'en-GB']
 extSkinNames: null, // 例 ['classic', 'modern']
 extPostInstallMessage: '成功!インストールを完了するためにブラウザを再起動してください。'
 // インストールに指定するメッセージがなければ null にセット
 // --- 編集できる項目の終了 ---

~そして、全てのハードワークはこれで終わりだ。僕は残りのコードを記述しないけど、君が目にするもっと多くの作業は全て自動化されているんだ。
~もしいま 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>{9AA46F4F-4DC7-4c06-97AF-5035170633FE}</em:id>
 		<em:name>Hello, world!</em:name>
 		<em:version>0.1</em:version>
 		<em:description>右クリックかツールメニューから
 		警告メッセージを表示する。</em:description>
 		<em:creator>Eric Hamiter</em:creator>
 		<em:homepageURL>http://extensions.roachfiend.com</em:homepageURL>
 		<em:iconURL>chrome://helloworld/skin/helloworld.png</em:iconURL>
 		<em:aboutURL>chrome://helloworld/content/about.xul</em:aboutURL>
 		<em:file>
 			<Description about="urn:mozilla:extension:file:helloworld.jar">
 				<em:package>content/helloworld/</em:package>
 				<em:skin>skin/classic/helloworld/</em:skin>
 			</Description>
 		</em:file>
 
 		<em:targetApplication>
 			<Description>
 				<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
 				<em:minVersion>0.8</em:minVersion>
 				<em:maxVersion>1.0</em:maxVersion>
 			</Description>
 		</em:targetApplication>
 
 	</Description>
 
 </RDF>
*** 拡張のインストールを再設定 [#g4b06bd8]
~OK、落ち着いて。このわけの分からないでたらめなものは一体何なんだ?
~まず、最初に目に入る物体は <em:id> タグだ。これは君だけのために生成された ID で、君の拡張を他の誰のものからも見分けるようになっている。
~それを作る方法がいくつかある。[[オンライン Perl スクリプト:http://extensions.roachfiend.com/cgi-bin/guid.pl]]を使ってランダムに1つ作ることもできるし、あるいは Windows を使っていれば、Microsoftから提供されている [[guidgen:http://www.microsoft.com/downloads/details.aspx?FamilyId=94551F58-484F-4A8C-BB39-ADB270833AFC]] ってプログラムを使っても良い。何て皮肉的(ironic)なんだろうね。それとも、皮肉(irony)という言葉を間違って使っちゃったかな?(訳註:IEを送り出しているMicrosoftが対抗馬であるFirefoxの開発・発展に有用なツールを提供している事に対してこのような発言をしていると思われる)何はともあれ、それをダウンロードして実行すれば、次のようなダイアログが表示されるだろう:
#ref(guid.png,nolink)
~4. レジストリ用書式 (Registry Format) を選んで、も1つ New GUID ボタンを押して、それから Copy ボタンを押す。これだけで、クリップボードには新しい ID が入ってるはずさ。古い ID をこれで置き換えれば、準備完了だ。
~Name(名前) 、version(バージョン)、description(説明)、creator(作成者)、homepageURL(ホームページ URL)は見た通りのものだ。iconURL(アイコン URL)と aboutURL は、拡張を右クリックして "拡張について..." を選んだ時に表示されるやつだ。
~こいつらは必須じゃなくて、空欄にしてもいいんだけど、こういう情報を入れておいてたまに(拡張マネージャから)目に出来たりするとかっこいいんじゃないかな。
~file(ファイル)の下のやつは標準的なものだ。"helloworld" となっているところを、君の拡張名で置き換えてくれ。これは君のファイルやフォルダをどこで探そうとするかだ。もしアイコンを使いたいのなら、skin フォルダを含めればいい(訳註:アイコンをあるフォルダに入れておき、それを jar に含めます。そして、em:skin にそのフォルダを指定します)。繰り返すけど、これは必須な指定じゃないよ。
~targetApplication(ターゲットアプリケーション)は、この拡張を使うアプリケーションの指定だ。この ec8030f7... というのは Firefox を表す GUID だから、この部分を変える必要は無い。minVersion と maxVersion には Firefox のどのバージョンに対応しているかを表している。
***メッキ (Chrome) は綺麗なバンパー以上のものだ [#m9f3f654]

~OK。じゃあ、chrome フォルダを開いてみよう。その中には、helloworld.jar というアーカイブファイルが入ってると思う。このアーカイブを展開してみてくれ(訳註:jar コマンドを使う場合は "jar xf helloworld.jar" とします。unzip コマンドが使えるなら、"unzip helloworld.jar" で展開できます。コマンドラインが面倒臭いor良く分からなければ、[[Noah:http://f50.aaa.livedoor.jp/~minthe/]]と[[b2e:http://b2efile.at.infoseek.co.jp/]]の組み合わせでも展開できます。)。
~そうしたら、content フォルダと skin フォルダが入ってると思う。先ずは content フォルダを見てみよう。中には先ず helloworld フォルダがあって、その下にはこれらのファイルがある:

-about.xul
-contents.rdf
-helloworldOverlay.js
-helloworldOverlay.xul

~about.xul は拡張メニュー内の "Hello, world! について..." をクリックした時に表示されるものだ。どうなってるかは見れば分かると思う。中に書いてある Jed Brown というナイスな名前はこのテンプレートを書いたヤツのことさ。面倒な事は既に全部彼がやってくれているんだ。繰り返すけど、あとは情報を埋めていけばいいだけなんだ。
~helloworldOverlay.xul と helloworldOverlay.js はこの拡張の動作を指定するものだ。こいつらは、いわばこの拡張全体を支える頭脳と言うべきものだ。中を見たら、とても単純なことに驚くと思う。これが helloworldOverlay.xul の中身だ:

 <?xml version="1.0"?>
 
 <overlay id="helloworldOverlay"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  
 // JavaScript をインポートする
 
 <script type="application/x-javascript" src="chrome://helloworld/content/helloworldOverlay.js">
 
 </script>
 
 
 // 右クリックメニューに追加
 
 <popup id="contentAreaContextMenu">
   <menuitem id="helloworld" label="Hello, world!" accesskey="H"
   insertafter="context-stop" oncommand="hello();"/>
 </popup>
 
 
 // ツールメニューに追加
 
 <menupopup id="menu_ToolsPopup">
 	<menuitem insertafter="devToolsSeparator" label="Hello, world!"
 	accesskey="H" oncommand="hello();" />
 </menupopup>
 
 
 </overlay>

ここでやってることは、JavaScript のファイル helloworldOverlay.js の挿入と、Hello, world! というコンテキストメニュー(右クリックで出てくるメニュー)の作成だ。
~accesskey="H" は "H" にアンダーラインを引く。"H" を選んだのは、最初の1文字で、他のオプションと被らないからだ。insertafter="context-stop" は「中止」ラベルのすぐ下にオプションを置く事を表している。oncommand はメニューを選択した時の動作で、ここでは hello 関数を呼んでウィンドウを開くようにしている。hello 関数はさっきインポートした JavaScript ファイルに定義されてる。
~オーバーレイの2つ目のパートはツールメニューのオプションを置くためのものだ。仕組みはコンテキストメニューと一緒で、メニューを追加する場所が違うだけだ。helloworldOverlay.js の中は次のようになっているはずだ:

 // これはアラートボックスにメッセージを表示する
 // JavaScript です
 
 function hello(){
 	alert("Hello, world!");
 }

~次は contents.rdf だ。これはこのオーバーレイ(重ね合わせ)情報がどこにあるかをブラウザに教えるためのファイルだ。中は次のようになっている。

 <?xml version="1.0"?>
 
 <RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
 
 	<RDF:Seq RDF:about="urn:mozilla:package:root">
 		<RDF:li RDF:resource="urn:mozilla:package:helloworld"/>
 	</RDF:Seq>
 
 	<RDF:Seq RDF:about="urn:mozilla:overlays">
 		<RDF:li RDF:resource="chrome://browser/content/browser.xul"/>
 		<RDF:li RDF:resource="chrome://navigator/content/navigator.xul"/>
 	</RDF:Seq>
 
 	<RDF:Seq RDF:about="chrome://browser/content/browser.xul">
 		<RDF:li>chrome://helloworld/content/helloworldOverlay.xul</RDF:li>
 	</RDF:Seq>
 
 	<RDF:Seq about="chrome://navigator/content/navigator.xul">
 		<RDF:li>chrome://helloworld/content/helloworldOverlay.xul</RDF:li>
 	</RDF:Seq>
 
 	<RDF:Description RDF:about="urn:mozilla:package:helloworld"
 		chrome:displayName="Hello, world! 0.1"
 		chrome:author="Eric Hamiter"
 		chrome:authorURL="mailto:ehamiter@gmail.com"
 		chrome:name="helloworld"
 		chrome:extension="true"
 		chrome:description="右クリックかツールメニューから
 		警告メッセージを表示する。">
 	</RDF:Description>
 
 </RDF:RDF>

~chrome://browser/content/browser.xul というのが気になると思う。これは mozilla の参照の内部フレームだ。browser は今使っているブラウザの事で、navigator の方は Netscape や Mozilla など Firefox 以外のビルドのために動作する。
~変更する必要があるのは Description(説明)の部分だけで、他の部分はブラウザに拡張を追加するためのものだ(訳註:もちろん helloworldOverlay.xul の部分も適宜変える必要があります)。
***あの猫の皮を剥ごう (Skin) [#m208f242]

~さぁ、次は skin フォルダに移ろう。その中には classic 、helloworld とフォルダが続いていると思う。これは伝統的なレイアウトで、勝手に変えない事。helloworld の中には3つのファイルがある。helloworld.png と helloworldb.png と contents.rdf だ。

helloworld.png:
#ref(helloworld.png,nolink)

helloworldb.png:
#ref(helloworldb.png,nolink)

~こいつらは拡張メニューと about (について) メニューで使うために、上で言った about.xul から呼ばれる。contents.rdf は単に skin ファイルへのパスを指定してるだけだ。だから、自分で拡張を作る時に変える必要があるのは、最後の helloworld というフォルダ名が書いてある部分だけだ。
***パックしてインストールしてみよう [#o817f60f]

~もう、各ファイルがどういうものでどこに置けばいいかが分かったと思う。適当に変更して、何か新しいことを試してみることもできるはずだ。
~何か変更を加えたら、またパックする必要がある。chrome フォルダまで戻って、ZIP アーカイブに content と skin を追加して、名前を extension.jar に変えて欲しい。その後、別のフォルダに移って、chrome、install.rdf、install.js を作り、ZIP 形式でアーカイブし、名前を extension.xpi に変えて欲しい(訳註:要するに、helloworld.xpi と同じようなものをもう1つ作るということです)。

これで、ブラウザでテストする準備が整った。Firefox を起動して、CTRL-O を押すか「ファイルを開く」を選ぶかして、さっき作った xpi ファイルを開いてみよう。「今すぐインストール」を選択し、Firefox を再起動すれば、間違いが無ければメニューに新しい拡張が追加されているはずだ。
***簡単にリビルドするには [#z402ed5a]

~しばらくすると、アーカイブ作成作業が面倒になってくるだろう。もし 7-Zip がインストールされていれば、コマンドラインから ZIP することができる。つまり、バッチファイルを作って完全に自動化できるってわけだ。何をどうすればいいかは、次の通りだ:
~C:\Program Files\7-Zip\7z.exe を C:\WINDOWS\system32 にコピーする(7z.exe をシステム用のパスに置けば、コマンドプロンプトからアクセスできるようになるんだ)(訳註:パスが通っていれば、置き場所はどこでも良いです)。
~これは、自作の拡張をビルドするいい練習になる。先ず、作りたい拡張の名前で新しいフォルダを作る。それが install.rdf に前もって指定した内部の .jar ファイル名に一致する事を確認する。できた xpi ファイルの名前を後でもっと複雑なのに変える事もできるけど、パックする時は単純に拡張名と同じ名前にしておくのが一番いい。
~以下のスクリプトをテキストエディタにコピー&ペーストして、さっき作ったフォルダに build.bat という名前で保存して欲しい(訳註:パスの通ったフォルダに保存すれば、どこからでも使えるので便利です):

 set x=%cd%
 md build\chrome
 cd chrome
 7z a -tzip "%x%.jar" * -r -mx=0
 move "%x%.jar" ..\build\chrome
 cd ..
 copy install.* build
 cd build
 7z a -tzip "%x%.xpi" * -r -mx=9
 move "%x%.xpi" ..\
 cd ..
 rd build /s/q

~これで、簡単にビルドしたり拡張に変更を加えたりすることができる。
~さっき作った新しいフォルダは、拡張作成の基地のようなものとして使う事になる。だから、インストールファイルと chrome フォルダもそのフォルダに入れておかないといけない。xpi ファイルを作成、更新したければ、build.bat を実行するだけでいい。自作の新しい拡張は同じフォルダに作成されるはずだ。
~build.bat スクリプトを使うと、xpi アーカイブ内の古いファイルは消され、新しいファイルは追加される。
****訳者補足(Mac OS X, Linux 用スクリプト) [#cc1e89ce]

~Mac OS X, Linux といった環境では、以下のシェルスクリプトが使えます:
~&COLOR(#000064){You can use the following shell script on Mac OS X and Linux:};

 #!/bin/sh -f
 
 x=$(pwd)
 x=${x##*/}
 rm $x.xpi
 
 # chrome のアーカイブ(無圧縮)
 # archive chrome (non-compressed)
 mkdir -p build/chrome
 cd chrome
 find . ! -name '.*' -exec zip -0 ../build/chrome/$x.jar {} \;
 cd ..
 
 cp -f install.js install.rdf build
 
 # 全体のアーカイブ(圧縮)
 # archive whole (compressed)
 cd build
 find . ! -name . -exec zip -9 ../$x.xpi {} \;
 cd ..
 
 rm -rf build

~これをパスの通ったディレクトリに置いておけば、どこからでも使う事ができます。
chrome 内の隠しファイルはアーカイブされないようにしてあるので、作業用のファイルは隠しファイルにしておくといいと思います。
Windows でも、[[Cygwin:http://www.mars.dti.ne.jp/~sohda/cygwin/]] を使うのであればこのスクリプトを利用できます。
~&COLOR(#000064){Place this shell script in a PATHed directory, and you can use it from anywhere. It's nice for the working files to be hidden, because hidden files in the chrome directory are not zipped in this script. You can use it on Windows, too, if you use [[Cygwin:http://sources.redhat.com/cygwin/]].};
***Firefox が完全にハングしたら [#h37c3243]

~最悪のシナリオは「Firefox を再起動したら、"Firefox is still installing an extension, this may take a minute..." と出てハングした」というものだ。これは、何らかの形でマズいことをやってたということだ。
~でも、ここで慌てちゃいけない。失敗した拡張をアンインストールする超簡単な方法は次の通りだ:
~スタート → プログラム → Mozilla Firefox → Mozilla Firefox (Safe Mode) と行き、Firefox をセーフモードで起動する。
~次に ツール → 拡張機能 → [失敗した拡張を選択して右クリック] → 削除 とし、アンインストールする。
~これで Firefox を再起動すれば上手く起動できるはずだ。拡張を修正してまた挑戦してみよう。
***サーバの互換性の確認 [#g38e5997]

~拡張の追加が上手くいったら、ウェブサーバ上に置きたいと思うだろう。でも、直接インストールできず、「名前をつけて保存」扱いになるかもしれない。その時は、.htaccess ファイルを編集する必要がある。
~これが何かというのは置いといて、ここでは簡単のためにウェブサーバソフトウェアが Apache な時にどうすればいいかだけ話すことにする。もし .htaccess ファイルを編集しても問題なければ、.htaccess にこれを書き加えればいいだけだ:

 AddType application/x-xpinstall .xpi

これで上手くいくだろう。
***追加情報 [#rb048bfc]

~もし私の作った他のファイルも見たければ、私のサイトの[[拡張のページ:http://extensions.roachfiend.com/]]に来るといいだろう。その方が便利なので、何があるかここにリストアップしよう:

-[[Allow Right-Click:http://extensions.roachfiend.com/allowrightclick.xpi]]
-[[Alt-Text for Links:http://extensions.roachfiend.com/altlinks.xpi]]
-[[Always Remember Password:http://extensions.roachfiend.com/password.xpi]]
-[[BugMeNot:http://extensions.roachfiend.com/bugmenot.xpi]]
-[[Goon Menu:http://extensions.roachfiend.com/goonmenu.xpi]]
-[[ListZilla:http://extensions.roachfiend.com/listzilla.xpi]]
-[[Productivity and Networking Information Component (PaNIC):http://extensions.roachfiend.com/panic.xpi]]
-[[Teleflip:http://extensions.roachfiend.com/teleflip.xpi]]
-[[Word Count:http://extensions.roachfiend.com/wordcount.xpi]]

~もし JavaScript のあるコードをページに埋め込みたいなら、Allow Right-Click か Always Remember Password を使うといいだろう。Alt-Text for Links はツールチップを制御するのに JavaScript を使っている。
~もし自分のリンクメニューを作りたいなら、Goon Menu がいい勉強になるだろう。BugMeNot は複雑な正規表現を使っており、ListZilla は環境設定を扱い、拡張マネージャを使っている。
~PaNIC は XUL(XML ユーザインターフェイス言語)メニューでユーザ定義変数を使っていて、Teleflip はサードパーティーの実行ファイルを実行する。WordCount はブックマークをどう扱えばいいかを勉強するのにいいだろう。
~拡張の作り方についてもっと知りたければ、[[Mozillazine extensions forum:http://forums.mozillazine.org/viewforum.php?f=19]] に行くといいだろう。それらは重い負荷を受けることがたまにあるから、君がこれを読んだ時、それらがダウンしているかもしれないけれど、そこにはたくさんの役立つ情報があるから、もしそうであればあとで再び試してみて欲しい。
~[[Mozilla Update:http://update.mozilla.org/]] に行けば、他にも便利な拡張が沢山見つかるだろうし、[[My Extensions Mirror:http://extensionsmirror.nl/]] にも拡張が沢山置いてあったり、それだけじゃなくフォーラムもあったりする。
~まぁ、こんなところかな。願わくばこのページが、技術にあまり詳しくないけどいっちょ拡張を作ろうかと言う人に僅かにでも役に立たんことを。さぁ、立ち上がって、何か便利なものを作ってみよう!
**XUL [#gfd55d60]
-[[XulPlanet.com:http://www.xulplanet.com/]]
--[[Tutorials:http://www.xulplanet.com/tutorials/]]
---[[邦訳:http://www.mozilla.gr.jp/jt/xul/]]
--[[References:http://www.xulplanet.com/references/]]
-[[XULアプリケーション開発への誘い:http://piro.sakura.ne.jp/appendix/archives/xul/01-01.html]]
--[[outsider reflex - XUL Apps:http://piro.sakura.ne.jp/xul/xul.html]]
---[[outsider reflex - XUL Apps > Tabbrowser Extensions > Information for Developers:http://piro.sakura.ne.jp/xul/_tabextensions_development.html]]

-[[Mozilla的コンテンツ - XUL Help:http://tkm.s31.xrea.com/xul/samples/index.shtml]]

-[[wikifarm- XUL:http://wiki.fdiary.net/xul/]]

-[[XUL:Home Page - From Meta; discussion about Wikimedia projects:http://wiki.mozilla.org/wiki/XUL:Home_Page]]
**SOAP [#f25e1296]
[[Mozilla de SOAP!:http://www.smellman.homelinux.org/mozilla/mozilla-soap.html]]

**パッケージング [#tfb85750]
-[[Firefox/Thunderbird 用拡張機能のパッケージ方法:http://www.mozilla-japan.org/projects/firefox/extensions/packaging/extensions.html]]
-[[Firefox/Thunderbird 用テーマのパッケージ方法:http://www.mozilla-japan.org/projects/firefox/extensions/packaging/themes.html]]
-[[Web ページから拡張機能やテーマをインストールさせるには:http://www.mozilla-japan.org/projects/firefox/extensions/web-api.html]]
*編集 [#u3f45c54]

**日本語化 [#oedc66f4]
:機能拡張の日本語版|
http://moz.skillup.jp/jlp/viewtopic.php?t=41




;#comment

-GUID Generatorは英文字が小文字なので、そのままXPIにパッケージすると、失敗しますね &size(12){ -- by Geo at 2006年07月23日 (日) 20時38分00秒};

-IEはMicrosoftが提供しているからなのでは?>>Microsoftによって提供される guidgen と呼ばれるプログラムを使っても良い。何て皮肉的(ironic)なんだろうね。それとも、皮肉(irony)という言葉を間違って使っちゃったかな?(訳註:多分何かのジョークだと思うけど、よく分からない...) -- &size(12){by yuu}; &size(12){at 2005-08-03 12:53:08 (水)};
-未訳箇所を訳してみました。 -- &size(12){by leva}; &size(12){at 2005-05-09 02:12:47 (月)};
-[[ Firefox でツールバーの拡張を作成するためのチュートリアル:http://level.s69.xrea.com/mozilla/index.cgi?id=20050322_ToolbarTutorial]] - &size(12){by ar19}; &size(12){at 2005/03/24 (木) 01:18:34};
-残りを訳してみました。若干未訳のところが残ってますが、どうでもいいところばかりなので勘弁を...。 - &size(12){by Robert}; &size(12){at 2004/12/05 (日) 23:59:28};
-stubですが作っておきます・・ - &size(12){by 525}; &size(12){at 2004-08-09 (月) 17:51:03};