X-0007 prefs.js に設定を保存する・設定を読み込む

XPConnect を利用すれば、ユーザープロファイルの prefs.js に簡単に情報を書き出せます。

const PREFID = '@mozilla.org/preferences;1';
const nsIPrefBranch = Components.interfaces.nsIPrefBranch
const PREF = Components.classes[PREFID].getService(nsIPrefBranch);

設定の保存は以下の要領で行います。

読み込む場合は以下の要領です。

PREF.clearUserPref('package.pref.value'); とすると、 prefs.js に記録された設定を user_pref(~)という行ごと消すことができます。

getPrefType() を使うと、保存されている値のタイプを判別することができます。例えば以下のようにすれば、前述のような場合分けは不要になります。

function getPref(prefstring) {
    var type = PREF.getPrefType(prefstring);
    const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
    switch (type) {
        case nsIPrefBranch.PREF_STRING:
            return PREF.getCharPref(prefstring);
            break;
        case nsIPrefBranch.PREF_INT:
            return PREF.getIntPref(prefstring);
            break;
        case nsIPrefBranch.PREF_BOOL:
        default:
            return PREF.getBoolPref(prefstring);
            break;
    }
}

2バイト文字を含む文字列の場合

日本語などの非アスキー文字は、 getCharPref() で読み書きすると文字化けしてしまいます。以下のようにすると、文字コードの処理を Mozilla に任せることができます。

保存
const nsISupportsWString = Components.interfaces.nsISupportsWString;
var string = Components.classes['@mozilla.org/supports-wstring;1'].createInstance(nsISupportsWString);
string.data = 文字列 ;
PREF.setComplexValue(prefstring, nsISupportsWString, string);
読み込み
const nsISupportsWString = Components.interfaces.nsISupportsWString;
var string = PREF.getComplexValue(prefstring, nsISupportsWString).data;

Mozilla 1.1 から仕様が変わって、 nsISupportsWString は nsISupportsString に、 nsISupportsString は nsISupportsCString に名前がスライドしたようです。上記の記述のままだと1.1以降でエラーになりますので、1.0系と1.1系の両方で動くようにする場合は、以下のように書いて下さい。

保存
var nsISupportsString = Components.interfaces.nsISupportsWString ||
                        Components.interfaces.nsISupportsString;
var string = (Components.classes['@mozilla.org/supports-wstring;1']) ?
        Components.classes['@mozilla.org/supports-wstring;1']
                  .createInstance(nsISupportsString) :
        Components.classes['@mozilla.org/supports-string;1']
                  .createInstance(nsISupportsString) ;
string.data = 文字列 ;
PREF.setComplexValue(prefstring, nsISupportsString, string);
読み込み
var nsISupportsString = Components.interfaces.nsISupportsWString ||
                        Components.interfaces.nsISupportsString;
var string = PREF.getComplexValue(prefstring, nsISupportsString).data;

Mozilla 標準で提供されているライブラリを使う

chrome://global/content/nsUserSettings.js で定義されている nsPreferences オブジェクトを使うと、単純な設定の読み書きについては、面倒なことは必要なくなります。<script type="application/x-javascript" src="chrome://global/content/nsUserSettings.js"/>でスクリプトを読み込んでおくだけで、以下のメソッドが使えるようになります。

nsPreferences.setBoolPref(設定の名前, 値(真偽値))
nsPreferences.setUnicharPref(設定の名前, 値( Unicode 文字列))
nsPreferences.setIntPref(設定の名前, 値(整数値))
上で紹介した方法と同様に、設定を保存します。
nsPreferences.getBoolPref(設定の名前, デフォルトの値)
nsPreferences.getIntPref(設定の名前, デフォルトの値)
上で紹介した方法と同様に、設定を読み込みます。第2引数としてデフォルトの値を指定すると、もしその設定が保存されていない場合、デフォルトの値を返します。デフォルトが無指定だと、 null を返します。
nsPreferences.copyUnicharPref(設定の名前, デフォルトの値)
nsPreferences.getLocalizedUnicharPref(設定の名前, デフォルトの値)
getBoolPref, getIntPref と使い方は同様です。 copyUnicharPref は取得した値を通常の文字列として、 getLocalizedUnicharPref はローカライズ済みの文字列として返します。