XPConnect を利用すれば、ユーザープロファイルの prefs.js に簡単に情報を書き出せます。
const PREFID = '@mozilla.org/preferences;1';
const nsIPrefBranch = Components.interfaces.nsIPrefBranch
const PREF = Components.classes[PREFID].getService(nsIPrefBranch);
設定の保存は以下の要領で行います。
PREF.setBoolPref('package.pref.value1', 真偽値);
PREF.setCharPref('package.pref.value2', 文字列);
PREF.setIntPref('package.pref.value3', 整数値);
読み込む場合は以下の要領です。
val_bool = PREF.getBoolPref('package.pref.value1');
val_str = PREF.getCharPref('package.pref.value2');
val_int = PREF.getIntPref('package.pref.value3');
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;
}
}
日本語などの非アスキー文字は、 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;
chrome://global/content/nsUserSettings.js で定義されている nsPreferences オブジェクトを使うと、単純な設定の読み書きについては、面倒なことは必要なくなります。<script type="application/x-javascript" src="chrome://global/content/nsUserSettings.js"/>
でスクリプトを読み込んでおくだけで、以下のメソッドが使えるようになります。