読者です 読者をやめる 読者になる 読者になる

何もしないFirefox拡張機能を作成する (その1)

Firefox 連載 連載第1回

今回から数回に分けて、何もしないFirefox拡張機能を作成する。

この拡張は文字通り何もしない。ただインストール、アンインストールができるだけだ。とりあえず拡張機能に最低限必要なものを理解するのが狙い。

参考にしたのは以下のサイト。

作成した拡張は今後テンプレートとして利用していくつもりなので、大切に保管しておく。ついでに拡張の名前は「template」にしよう。

また、今後のことも考えてFirefoxのバージョンをメモしておくことにする。今使用しているバージョンは2.0.0.12だ。

ファイル一覧

最終的に出来上がるファイル、ディレクトリは以下の通り

chrome/
chrome/content/
chrome/content/template.xul
install.rdf
chrome.manifest

ディレクトリを2つ、ファイルを3つ作るだけだ。ファイルはすべてテキストエディタだけで作成できる。

chromeとは

まずは一番分量が少ないchrome.manifestから取りかかることにする。
以下のページを参考にした
Chrome Registration | MDN

そのページを読んでいると知らない単語がどんどん出てくる。そんなのを無視してもとりあえずは何とかなるだろうが、他の人のソースをコピペするだけでは何だし、今後自分で調べるときに困るかもしれない。特にchromeという単語は重要そうだ。

そこで、コーディングを始める前に少し概念的なことを理解しておくことにした。chromeについて、MDCにはこう書いてある。

Chrome とは、アプリケーションウィンドウで、そのウィンドウのコンテンツ領域の外側にあるユーザーインターフェイス要素のセットのことです。 ツールバーやメニューバー、プログレスバー、およびウィンドウタイトルバーといった要素は、全て chrome の部分の典型的な例になります。

Chrome Registration | MDN

小難しいことが書いてあるが、自分なりに解釈してみる。

まずアプリケーションウィンドウとは、きっとFirefoxのウィンドウのことだ。そして、コンテンツ領域とはブラウザでWebページを表示している部分のことだろう(まさにこの文章が出力されている部分だ)。で、外側にあるユーザーインターフェイス要素というと、つまりそれ以外の人間が操作する部分、それがchromeということになる。ブラウザの「戻る」ボタンなんかがchromeの一種にあたるわけだ。

ユーザーインターフェイス要素のセットとあるが、ボタンとかそういうユーザーが操作する部品全体のことをchromeと言うのだ。そして、各部品のことをchromeプロバイダと言う。chromeを提供するもの、という意味だろう。

インストールしているFirefoxの拡張を思い出してみると、たいていツールバーにボタンを追加できたり、サイドバーに何か表示できたりする。そういうのはすべてFirefox本体にchromeプロバイダを追加している、と言い換えることができる。そして、これから新しくchromeプロバイダを作成しようとしているわけだ。

chromeプロバイダの基本型

MDCを読み進めると、もう少し具体的なchromeプロバイダの内容が書いてあった。それによると、chromeプロバイダの基本型というものがあって、それはコンテントロケールスキンの3つだとある。

そのうちメインとなるのがコンテントで、XULファイルやJavaScriptファイルからなる。つまりプログラムのソースファイルだ。

ロケールはそのchromeプロバイダのうちローカライズするための情報を集めた部分だ。メニューに出る文言なんかがたくさん定義されている。

有名な拡張機能はたいてい多言語対応されていて、ユーザーにあわせた言語で表示できるようになっている。それは表示される言語のようにローカライズしたいことが独立してまとめられ、必要に応じて追加、変更できるからだ。それがこのロケールにあたる。つまり、当面はいらない。

スキンは見た目を定義するための部分で、主に画像とCSSファイルの集まりだ。ロケールと同じようにコンテントとは独立しているため、好みに応じて変更できるようになっている。これも当面はいらない。

結論としては、とりあえずコンテントだけ作れば良い。

chrome.manifestファイルの作成

それでは実際にchrome.manifestファイルに記述してみる。chromeプロバイダは要するにソースファイルの集まりなわけだけど、Firefoxはそれらを直接ファイルパス指定で参照したりしない。つまり、/usr/lib/extension/template.xulとかC:\work\extension\template.xulなんて書いたりしない。そんな下品なことはせずに、もっとスマートにURIで参照するのだ。

例えばこんな感じ。
chrome://template/content/template.xul
そして、そのURIと実際のファイルのパスの対応を定義するのがこのchrome.manifestファイルというわけだ。今回作成した内容は以下の通り。

# chrome.manifest
# 拡張機能のテンプレート
content template chrome/content/
overlay chrome://browser/content/browser.xul chrome://template/content/template.xul

'#'で始まる行はコメントだ。自分の好きなようにメモを書いておこう。
3行めからが本番だ。3行目はコンテント(chromeプロバイダの基本型のうちの1つだ)の場所を定義している。

この行は chrome パッケージ名 パス という構造になっている。パッケージ名とはすなわち作成する拡張の名前のことで、ここではtemplateとした。最後のパスの部分だが、コンテントの場所をこのmanifestファイルからの相対パスで指定する。

例えばこのchrome.manifestファイルが/home/user/work/というディレクトリにあったとしよう。そうするとchrome://template/content/template.xulというURI/home/user/work/chrome/content/template.xulが参照できることになる。また、この行は必ず'/'で終わっていなければならない。

このchrome/content/という部分は自分で実際に作成したファイルの場所を指定すれば良い。しかしコンテントなのにodenとか変な名前にするとわけがわからなくなるので、ほどほどにしておこう。

最後のoverlay行はありえるえりあの内容をコピペしただけで、まだよく分かっていない。とりあえず無視しておく。

ちなみにこの方法はFirefox 1.5からサポートされた。念のため覚えておく。

今回はMDCを読み、chrome.manifestファイルを作成した。次回はinstall.rdfファイルを作成する。

次へ >

この連載の一覧