このセクションでは、オーバーレイを明示的にインポートしないファイルに対して、オーバーレイを適用する方法について説明します。
他のパッケージにオーバーレイを適用する
オーバーレイには、もう 1 つ非常に役立つ機能があります。 前のセクションの例では、ウィンドウから明示的にオーバーレイをインポートしていましたが、 オーバーレイの指定は、別の方法によっても行うことが可能です。 その方法では、オーバーレイをどのウィンドウに適用するかを指定するために、 パッケージの contents.rdf
ファイルの変更を行うことになります。 この方法でオーバーレイを利用すれば、他のパッケージのユーザーインターフェイスの変更を、そのパッケージに手を加えることなく行うことができるために便利です。 例えば、これを利用して Mozilla のブラウザウィンドウにメニュー項目やツールバーを追加することが可能です。
このセクションでは、この機能を利用して Mozilla のブラウザウィンドウにツールバーを加えてみたいと思います。 なお、Mozilla スイートのメールアプリケーションでは、ブラウザウィンドウにコンテントを追加するためにオーバーレイを使用しています。 このため、メールアプリケーションをインストールしない場合には、「新規メッセージ (New Message)」のメニュー項目は表示されず、 メールアプリケーションがインストールされると、オーバーレイがメニューに適用されるために「新規メッセージ」のメニュー項目が追加されることになります。 以下では、ブラウザにファイル検索用のツールバーの追加を行います。 なお、この機能をブラウザに追加しても、おそらく実際の役には立たないと思いますが、とりえずはやってみることにしましょう。
Mozilla では、オーバーレイのリストを、contents.rdf
ファイルに追加することが可能です。 これは、クロムパッケージやスキン、ロケールのリストを指定するためにも使用するファイルです。 オーバーレイの作成を行い、それを contents.rdf
ファイルに追加することで、 オーバーレイの適用対象の各ウィンドウに項目の追加が行われることになります。
ファイル検索ダイアログの例
それでは、まず簡単なオーバーレイの作成から始めます。 ここには、検索するファイル名とディレクトリを入力するための要素だけを置きます。 これを foverlay.xul
というファイル名で findfile.xul
と同じ findfile
ディレクトリに保存しておきます。
var el = env.locale; foverlay.xul : ソース
<?xml version="1.0"?>
<overlay
xmlns="https://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<toolbox id="navigator-toolbox">
<toolbar id="findfile_toolbar">
<label control="findfile_filename" value="Search for files named:"/>
<textbox id="findfile_filename"/>
<label control="findfile_dir" value="Directory:"/>
<textbox id="findfile_dir"/>
<button label="Browse..."/>
</toolbar>
</toolbox>
</overlay>
上記の例の overlay
を window
に変更すれば、実際に表示させてみることも可能です。 上記の中で、特別なことがあるとすれば、
に設定されている toolbox
id
だけです。 この値 (navigator-toolbox
) は、ブラウザウィンドウ (navigator.xul
) のツールボックスの識別子に指定されているのと同じものを指定しています。 これによって、このオーバーレイが適用されたときには、ブラウザウィンドウのツールボックスに適用されて、 そのコンテントが、追加のツールバーとしてブラウザに加えられることになります。
このオーバーレイをマニフェストファイルに追加するためには、2 つのリソースを加える必要があります。 1 つめは、オーバーレイを適用するウィンドウを示すためのもので、 以下のコードを、contents.rdf
の RDF の終了タグの直前に加えます。
<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://navigator/content/navigator.xul"/>
</RDF:Seq>
上記は、ルートオーバーレイノード (urn:mozilla:overlays
) の子として オーバーレイ対象ウィンドウを追加するための宣言になります。 オーバーレイを適用したいウィンドウが他にもある場合は、 li
ノードを追加することで、任意のウィンドウを追加することが可能です。
2 つめは、対象のウィンドウに対してどのオーバーレイを適用するかを示すためのものです。 この例では 1 つだけですが、適用するオーバーレイを追加することも可能です。 先述の例の直後に、以下の行を追加します。
<RDF:Seq about="chrome://navigator/content/navigator.xul">
<RDF:li>chrome://findfile/content/foverlay.xul</RDF:li>
</RDF:Seq>
Mozilla は上記の情報を読み込むと、別のウィンドウに適用されるオーバーレイのリストの構築を行います。 この情報は chrome/overlayinfo
ディレクトリに保存されます。 このディレクトリのファイルは、Mozilla が最初に起動されるか新しいパッケージがインストールされたときに、自動的に生成または更新されるため、手作業で修正を行う必要はありませんが、 このデータを強制的に再構築させたい場合には、このディレクトリと chrome.rdf
ファイルを削除しても構いません。
ちなみに、類似のテクニックとして、contents.rdf
を使用して、外部スタイルシートの適用を指定することが可能です。 以下の例は、その方法を示しています。
<RDF:Seq about="urn:mozilla:stylesheets"> <RDF:li resource="chrome://messenger/content/messenger.xul"/> </RDF:Seq> <RDF:Seq about="chrome://messenger/content/messenger.xul"> <RDF:li>chrome://blueswayedshoes/skin/myskinfile.css</RDF:li> </RDF:Seq>
次のセクションでは、XUL アプリケーションのためのインストーラの作成方法を見ていきます。