home *** CD-ROM | disk | FTP | other *** search
- function G_Preferences(opt_startPoint, opt_getDefaultBranch) {
- this.debugZone = "prefs";
- this.observers_ = {};
- var startPoint = opt_startPoint || null;
- var prefSvc = Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefService);
- if (opt_getDefaultBranch) {
- this.prefs_ = prefSvc.getDefaultBranch(startPoint);
- } else {
- this.prefs_ = prefSvc.getBranch(startPoint);
- }
- this.prefs_.QueryInterface(Ci.nsIPrefBranchInternal);
- }
- G_Preferences.setterMap_ = { "string": "setCharPref",
- "boolean": "setBoolPref",
- "number": "setIntPref" };
- G_Preferences.getterMap_ = {};
- G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_STRING] = "getCharPref";
- G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_BOOL] = "getBoolPref";
- G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_INT] = "getIntPref";
- G_Preferences.prototype.setPref = function(key, val) {
- var datatype = typeof(val);
- if (datatype == "number" && (val % 1 != 0)) {
- throw new Error("Cannot store non-integer numbers in preferences.");
- }
- var meth = G_Preferences.setterMap_[datatype];
- if (!meth) {
- throw new Error("Pref datatype {" + datatype + "} not supported.");
- }
- return this.prefs_[meth](key, val);
- }
- G_Preferences.prototype.getPref = function(key, opt_default) {
- var type = this.prefs_.getPrefType(key);
- if (type == Ci.nsIPrefBranch.PREF_INVALID) {
- return opt_default;
- }
- var meth = G_Preferences.getterMap_[type];
- if (!meth) {
- throw new Error("Pref datatype {" + type + "} not supported.");
- }
- try {
- return this.prefs_[meth](key);
- } catch(e) {
- return opt_default;
- }
- }
- G_Preferences.prototype.setBoolPref = function(which, value) {
- return this.setPref(which, value);
- }
- G_Preferences.prototype.getBoolPref = function(which) {
- return this.prefs_.getBoolPref(which);
- }
- G_Preferences.prototype.getBoolPrefOrDefault = function(which, def) {
- return this.getPref(which, def);
- }
- G_Preferences.prototype.getBoolPrefOrDefaultAndSet = function(which, def) {
- try {
- return this.prefs_.getBoolPref(which);
- } catch(e) {
- this.prefs_.setBoolPref(which, !!def); // The !! forces boolean conversion
- return def;
- }
- }
- G_Preferences.prototype.clearPref = function(which) {
- try {
- this.prefs_.clearUserPref(which);
- } catch(e) {}
- }
- G_Preferences.prototype.addObserver = function(which, callback) {
- var observer = new G_PreferenceObserver(callback);
- if (!this.observers_[which])
- this.observers_[which] = new G_ObjectSafeMap();
- this.observers_[which].insert(callback, observer);
- this.prefs_.addObserver(which, observer, false /* strong reference */);
- }
- G_Preferences.prototype.removeObserver = function(which, callback) {
- var observer = this.observers_[which].find(callback);
- G_Assert(this, !!observer, "Tried to unregister a nonexistant observer");
- this.prefs_.removeObserver(which, observer);
- this.observers_[which].erase(callback);
- }
- function G_PreferenceObserver(callback) {
- this.debugZone = "prefobserver";
- this.callback_ = callback;
- }
- G_PreferenceObserver.prototype.observe = function(subject, topic, data) {
- G_Debug(this, "Observed pref change: " + data);
- this.callback_(data);
- }
- G_PreferenceObserver.prototype.QueryInterface = function(iid) {
- var Ci = Ci;
- if (iid.equals(Ci.nsISupports) ||
- iid.equals(Ci.nsIObserves) ||
- iid.equals(Ci.nsISupportsWeakReference))
- return this;
- throw Components.results.NS_ERROR_NO_INTERFACE;
- }
- function TEST_G_Preferences() {
- if (G_GDEBUG) {
- var z = "preferences UNITTEST";
- G_debugService.enableZone(z);
- G_Debug(z, "Starting");
- var p = new G_Preferences();
- var testPref = "google-amulet-preferences-unittest";
- var noSuchPref = "google-amulet-preferences-unittest-aypabtu";
- var observeCount = 0;
- function observe(prefChanged) {
- G_Assert(z, prefChanged == testPref, "observer broken");
- observeCount++;
- };
- p.addObserver(testPref, observe);
- p.setBoolPref(testPref, true);
- G_Assert(z, p.getBoolPref(testPref), "get or set broken");
- G_Assert(z, observeCount == 1, "observer adding not working");
- p.removeObserver(testPref, observe);
- p.setBoolPref(testPref, false);
- G_Assert(z, observeCount == 1, "observer removal not working");
- G_Assert(z, !p.getBoolPref(testPref), "get broken");
- try {
- p.getBoolPref(noSuchPref);
- G_Assert(z, false, "getting non-existent pref didn't throw");
- } catch (e) {
- }
- G_Assert(z,
- p.getBoolPrefOrDefault(noSuchPref, true), "default borken (t)");
- G_Assert(z, !p.getBoolPrefOrDefault(noSuchPref, false), "default borken");
- G_Assert(z, p.getBoolPrefOrDefaultAndSet(noSuchPref, true),
- "default and set broken (didnt default");
- G_Assert(z,
- p.getBoolPref(noSuchPref), "default and set broken (didnt set)");
- p.clearPref(noSuchPref);
- G_Assert(z, !p.getBoolPrefOrDefault(noSuchPref, false), "clear broken");
- p.clearPref(testPref);
- G_Debug(z, "PASSED");
- }
- }
-