Firefox の環境設定
Mozilla アプリケーションは、高度なカスタマイズが可能です。環境設定は、設定とデフォルト動作から変更した情報を格納するために使用されます。Firefox の環境設定ウィンドウを開くには、メインメニューから次の項目を選択します:
- Windows の場合、[ツール] > [オプション]
- Mac の場合、[Firefox] > [環境設定]
- Linux の場合、[編集] > [設定]
Firefox は、ユーザ設定をいくつものソースから読み込みます。各ソースは、通常のコードでは利用できない特別な関数を含む JavaScript ファイルです。環境設定には次のファイルが使用されます:
- デフォルト設定: これは、Firefox をインストールしたディレクトリの defaults/pref ディレクトリ内に格納されています。
- 現在の設定: これは、プロファイルディレクトリ内の prefs.js ファイルに格納されています。プロファイルディレクトリには、ユーザ設定も格納されています。このファイルは、ユーザが設定を変更した時に更新されます。
- ユーザ設定: ユーザのプロファイルディレクトリ内の user.js ファイルは、ユーザが設定した追加の環境設定を保持します。このファイルは Firefox によって書き込まれることはありません。ユーザがこのファイルに書き込んだ設定は、他の設定に上書きされます。
- Lockfile 設定 : この設定は通常、mozilla.cfg あるいは netscape.cfg ファイルに格納されます。このファイルは、ネットワーク上に置かれ、ネットワーク管理者や ISP が中央で設定するために使用されます。さらに、ユーザがいくつかの設定を変更できないようにロックできます。ロックされた設定は、環境設定ウィンドウで無効化されます。
Firefox は、高レベルの設定を環境設定ウィンドウなどから設定できるように露出しています。実際、Firefox はユーザに見せていない何千もの設定を扱っています。これらは、とても細かく、通常のユーザは管理できないため隠されています。また、環境設定ウィンドウをできるだけ簡単にしておくためにも隠されています。他のすべての設定へアクセスするには、ロケーションバーに "about:config" と入力します。この XUL ページには Firefox に定義されたすべての設定のリストが表示され、ユーザがそれらの設定を変更できます。このページを開く前に表示される警告メッセージのとおり、設定を変更する時は特に注意しなければなりません。正しくない値を設定すると、Firefox の動作がおかしくなったり壊れたりすることがあります。
"フィルタ" テキストボックスに入力して特定の設定を検索することができます。"homepage" という単語を入力すると、すべての設定から絞り込まれ、設定名や値に "homepage" が含まれる設定だけが表示されます。設定上で右クリックすると、設定値の変更や新しい設定の追加ができるオプションが表示されます。設定値がデフォルトでないものは太字で強調されます。about:config で行ったすべての変更は、prefs.js ファイルに保存されます。
about:config のリストには設定がすべて表示されません。一部の Firefox はデフォルト値でないため、手動で追加しない限り除かれています。Firefox 設定の広範囲な仕様は、MozillaZine Knowledge Base のページで見られます。これらを覚えておく必要はありません。タスク X の実行にいくつかの設定が必要なときは、設定リストから探すよりも、X を行う方法を探し、必要な設定を理解したほうがよいでしょう。MDC の記事や他のガイドでは、たいてい必要な設定が指定されています。
拡張機能に環境設定を追加する
拡張機能は、Firefox 設定の読み書きができます。また、最も重要なこととして、これらの作成と管理もできます。環境設定システムは、簡単で統一された、設定の名前と値を持つストレージを提供しています。ストレージにこれよりも複雑な格納方式が必要な場合は、後のセクションで取り上げる、さらに詳細な API が必要になります。
拡張機能に環境設定を追加するには、はじめに、設定とそのデフォルト値が記述された JavaScript 設定ファイルを作成しなければなりません (デフォルト値は必須ではありません)。前にも述べたように、デフォルト値を持たない設定は後で設定できます。
作成する必要のある設定ファイルは、拡張機能のルートディレクトリの下の defaults/preferences/yourextensionname.js でなければなりません。この JavaScript ファイルの名前は強制されていませんが、拡張機能の名前することが慣習になっています。
この環境設定を使用する Hello World のサンプルをダウンロードしてください。xulschoolhello.js 設定ファイルを含めるため、Makefiles に 2 カ所の変更を加えています。設定ファイルの内容は簡単です:
// ユーザにメッセージを表示した回数 pref("extensions.xulschoolhello.message.count", 0);
これは、挨拶メッセージをユーザに表示した回数を追跡するために使用する設定を定義しています。設定のデフォルト値は 0 です。この設定は、拡張機能をインストールした後に about:config で見られます。この新しい設定を見るには、フィルタボックスに "xulschool" と入力するだけです。
それでは、環境設定の値を実際に管理する方法を見ていきましょう。
環境設定を FUEL で管理する
FUEL は、拡張機能開発を容易にするために Firefox に統合された JavaScript ライブラリです。その目標には届きませんが、環境設定を扱うために使用できます。Firefox ベースのアプリケーションにも FUEL が含まれています。SeaMonkey には、バージョン 2 から FUEL に相当する SMILE と呼ばれるものが含まれています。
JSM のサンプル拡張を、内部変数の代わりに環境設定を使用するように変更しました。機能の主な違いは、Firefox を一旦閉じて開き直した後、挨拶メッセージが以前に表示された回数を記憶するようになったことです。元の拡張機能は、ブラウザのセッション内の表示回数しか追跡しませんでした。この新しいバージョンは、セッションを超えて表示回数を維持します。
JSM のサンプル拡張内で非 chrome のコードを使用していたのは、メッセージの表示回数を 1 カ所に格納するためでした。新しいバージョンでは、chrome コードを排他的に使用するように簡単に変更できます。もはや、JavaScript のコードモジュールや XPCOM は必要ありません。chrome コードから FUEL ライブラリを使用する場合と非 chrome コードから使用する場合にはわずかに異なる点があります。違いは、"ルート" Application オブジェクトの取得の仕方にあります:
// chrome コード Application.something // 非 chrome コード let application = Cc["@mozilla.org/fuel/application;1"].getService(Ci.fuelIApplication); application.something
chrome コードでは、グローバル Application オブジェクトが使用前に準備してありますが、非 chrome コードでは、これを XPCOM サービスとして取得する必要があります。これは、XPCOM サービスであり、chrome コードからはアクセスしやすくなることだけが違います。
Application オブジェクトは、PreferenceBranch 型の prefs プロパティを持っています。これを環境設定の管理を容易にするために使用できます。
はじめに、設定を提供するオブジェクトを取得します:
this._countPref = application.prefs.get("extensions.xulschoolhello.message.count");
その後、value プロパティを使用して、その値の取得や設定ができます。
/** * 現在のメッセージ表示回数を返す * @return the current message count. */ get count() { return this._countPref.value; }, /** * メッセージ表示回数を 1 回増やす */ increment : function() { this._countPref.value++; }
prefs オブジェクトには設定値を直接取得したり設定したりできるメソッドもありますが、上記の方法の方が好ましいでしょう。
環境設定リスナー (FUEL)
時々、設定値が変更された時にそれを通知してほしいでしょう。例えば、browser 内のどこかにメッセージの表示回数を表示したいときは、環境設定リスナーを使用して表示回数を更新できます。この方法なら、ユーザが about:config で手動で値を変更しても正しく動作します。
これを FUEL で行うには、"change" イベントのイベントリスナーを追加します:
this._countPref.events.addListener("change", this);
リスナーオブジェクトは、EventListener インターフェースを実装しています。オブザーバに似て、必要なことは、JavaScript オブジェクト内で handleEvent メソッドを持つことです。または、EventItem オブジェクトを取得する匿名関数を使用できます。
this._countPref.events.addListener("change", function(aEvent) { /* do stuff. */ });
いつでも、リスナーが必要なくなった時は削除することを忘れないでください。
環境設定を XPCOM で管理する
環境設定システムは、XPCOM で実装されています。FUEL は、XPCOM サービスを使いやすくするための表面的なラッパーにしかすぎないため、どちらを使用しても同じです。XPCOM を使用すると、いつもどおりの冗長な書き方になります。
私たちは、設定値を取得、設定するために Preferences サービス を使用します:
this._prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); // ... get count() { return this._prefService.getIntPref("extensions.xulschoolhello.message.count"); }, increment : function() { let currentCount = this._prefService.getIntPref("extensions.xulschoolhello.message.count"); this._prefService.setIntPref("extensions.xulschoolhello.message.count", currentCount + 1); }
ここで覚えておくべき重要なことは、設定が見つからない場合、サービスの "get" メソッドが例外を投げることです。XPCOM を使用しようとするときは、常に設定のデフォルト値を設定しておくか、try / catch ブロックを使用して扱えないエラーが発生することを防がなくてはなりません。
環境設定リスナー (XPCOM)
XPCOM でリスナーを追加する方法は、XPCOM セクションで QueryInterface メソッドを説明した時に言及しました:
this._prefService.QueryInterface(Ci.nsIPrefBranch2); this._prefService.addObserver(prefName, this, false); this._prefService.QueryInterface(Ci.nsIPrefBranch);
addObserver メソッドが異なるインターフェースに定義されているため、上記のすべての QueryInterface が必要です。また、オブザーバの追加や削除のほか、nsIPrefBranch インターフェースをすべての環境設定にかんするメソッドのために使用します。
次に、オブザーバメソッドを作成します:
observe : function(aSubject, aTopic, aData) { if ("nsPref:changed" == aTopic) { let newValue = aSubject.getIntPref(aData); // do something. } },
いつでも、オブザーバが必要なくなった時は削除することを忘れないでください:
this._prefService.QueryInterface(Ci.nsIPrefBranch2); this._prefService.removeObserver(prefName, this);
環境設定ウィンドウ
ユーザが必要に応じて拡張機能の設定を変更できるようにすることは、とても一般的です。環境設定の管理に関連して難解な部分があるため、XUL と Firefox に、これへの対処を容易にするいくつかの方法が提供されています。
環境設定ウィンドウを開く標準の方法は、アドオンマネージャを開き、アドオンを選択して設定ボタンをクリックすることです。あなたの拡張機能でこのボタンを有効にするには、次の 1 行を install.rdf に追加する必要があります:
<em:optionsURL>chrome://xulschoolhello/content/preferencesWindow.xul</em:optionsURL>
メニューやツールバーボタンなど別の UI からこのウィンドウを開きたいときは、オペレーティングシステムごとに環境設定を開く動作が異なることに注意する必要があります。私たちは、次のようにします:
openPreferences : function() { if (null == this._preferencesWindow || this._preferencesWindow.closed) { let instantApply = Application.prefs.get("browser.preferences.instantApply"); let features = "chrome,titlebar,toolbar,centerscreen" + (instantApply.value ? ",dialog=no" : ",modal"); this._preferencesWindow = window.openDialog( "chrome://xulschoolhello/content/preferencesWindow.xul", "xulschoolhello-preferences-window", features); } this._preferencesWindow.focus(); },
このコードは、アドオンマネージャから環境設定ウィンドウを開くコードを基にしています。ここでは、次の 2 つのことを行っています:
- 設定ウィンドウが開いているか確認し、開いている場合はフォーカスを与える。
- 設定ウィンドウ内の変更がすぐに適用されない (instantApply 設定の値が false の) システムでは、ウィンドウをモーダルにする。この設定はユーザが切り替えられるため、オペレーティングシステムを確認するだけでは不十分なので注意してください。
XUL ファイルで設定ウィンドウを作成する時は、window 要素の代わりに、常に prefwindow 要素を使用してください。Firefox がこのウィンドウに OK ボタンやキャンセルボタンが必要かどうかを判断します。
多くの場合、あなたの設定ウィンドウに一度に表示できるオプションの数は少ないでしょう。多くの設定がある場合は、prefpane 要素を使用して設定を管理してください。これは、Firefox の設定ウィンドウのように、視覚的にアピールするタブビューを作成します。prefpane 要素は、いくつでも置くことができるコンテナです。ウィンドウ上部のタブにはアイコンが必要です。これらのアイコンは、オペレーティングシステムごとにわずかに異なるツールバーボタンと同様です。
prefwindow 内では、設定の扱いを容易にする preferences 要素と preference 要素が使用できます。preferences 要素はコンテナです。ウィンドウごとに 1 個、または prefpane ごとに 1 個置いてください。この要素とその子要素は完全に隠れています。これらの目的は、ウィンドウやペイン内で使用される設定を列挙することです。
<preferences> <preference id="xulschoolhello-message-count-pref" name="extensions.xulschoolhello.message.count" type="int" /> <!-- その他の設定要素 --> </preferences>
必要な設定を定義した後、ウィンドウやペイン内で preference 属性を使用してこれらをフォーム要素と関連付けてください:
<textbox preference="xulschoolhello-message-count-pref" type="number" min="0" max="100" />
この例では、メッセージのカウント設定を設定する数値フィールドを使用しています。コントロール内の値を変更すると設定が変更され (instantApply 設定に依存します)、逆に、設定が変更されるとコントロール内の値も変更されます。preference 要素のおかげで、JavaScript コードを一行も書かずに設定ウィンドウを作成することができるでしょう。
最後に、ウィンドウや設定ペインのコンテンツを管理するためにグループボックスを使用するとよいでしょう。これらは Firefox 設定ウィンドウ内で厳密にスタイル化されているため、Firefox のものと同じ CSS ファイル (chrome://browser/skin/preferences/preferences.css) を XUL ファイルに含めておくべきです。この方法なら、Firefox に定義されたすべての CSS 規則を書き直す必要はありません。また、XUL ファイル内の要素に設定された class の値を見てください。あなたの設定ウィンドウが Firefox の設定ウィンドウのようになり、あなたの拡張機能がアプリケーションに統合され、OS 本来の外観になるようにしてください。
This tutorial was kindly donated to Mozilla by Appcoast.