home *** CD-ROM | disk | FTP | other *** search
/ Minami 80 / MINAMI80.iso / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / amulet-jslib / firefox / preferences.js < prev    next >
Text File  |  2006-05-15  |  5KB  |  137 lines

  1. function G_Preferences(opt_startPoint, opt_getDefaultBranch) {
  2. this.debugZone = "prefs";
  3. this.observers_ = {};
  4. var startPoint = opt_startPoint || null;
  5. var prefSvc = Cc["@mozilla.org/preferences-service;1"]
  6. .getService(Ci.nsIPrefService);
  7. if (opt_getDefaultBranch) {
  8. this.prefs_ = prefSvc.getDefaultBranch(startPoint);
  9. } else {
  10. this.prefs_ = prefSvc.getBranch(startPoint);
  11. }
  12. this.prefs_.QueryInterface(Ci.nsIPrefBranchInternal);
  13. }
  14. G_Preferences.setterMap_ = { "string": "setCharPref",
  15. "boolean": "setBoolPref",
  16. "number": "setIntPref" };
  17. G_Preferences.getterMap_ = {};
  18. G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_STRING] = "getCharPref";
  19. G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_BOOL] = "getBoolPref";
  20. G_Preferences.getterMap_[Ci.nsIPrefBranch.PREF_INT] = "getIntPref";
  21. G_Preferences.prototype.setPref = function(key, val) {
  22. var datatype = typeof(val);
  23. if (datatype == "number" && (val % 1 != 0)) {
  24. throw new Error("Cannot store non-integer numbers in preferences.");
  25. }
  26. var meth = G_Preferences.setterMap_[datatype];
  27. if (!meth) {
  28. throw new Error("Pref datatype {" + datatype + "} not supported.");
  29. }
  30. return this.prefs_[meth](key, val);
  31. }
  32. G_Preferences.prototype.getPref = function(key, opt_default) {
  33. var type = this.prefs_.getPrefType(key);
  34. if (type == Ci.nsIPrefBranch.PREF_INVALID) {
  35. return opt_default;
  36. }
  37. var meth = G_Preferences.getterMap_[type];
  38. if (!meth) {
  39. throw new Error("Pref datatype {" + type + "} not supported.");
  40. }
  41. try {
  42. return this.prefs_[meth](key);
  43. } catch(e) {
  44. return opt_default;
  45. }
  46. }
  47. G_Preferences.prototype.setBoolPref = function(which, value) {
  48. return this.setPref(which, value);
  49. }
  50. G_Preferences.prototype.getBoolPref = function(which) {
  51. return this.prefs_.getBoolPref(which);
  52. }
  53. G_Preferences.prototype.getBoolPrefOrDefault = function(which, def) {
  54. return this.getPref(which, def);
  55. }
  56. G_Preferences.prototype.getBoolPrefOrDefaultAndSet = function(which, def) {
  57. try {
  58. return this.prefs_.getBoolPref(which);
  59. } catch(e) {
  60. this.prefs_.setBoolPref(which, !!def);  // The !! forces boolean conversion
  61. return def;
  62. }
  63. }
  64. G_Preferences.prototype.clearPref = function(which) {
  65. try {
  66. this.prefs_.clearUserPref(which);
  67. } catch(e) {}
  68. }
  69. G_Preferences.prototype.addObserver = function(which, callback) {
  70. var observer = new G_PreferenceObserver(callback);
  71. if (!this.observers_[which])
  72. this.observers_[which] = new G_ObjectSafeMap();
  73. this.observers_[which].insert(callback, observer);
  74. this.prefs_.addObserver(which, observer, false /* strong reference */);
  75. }
  76. G_Preferences.prototype.removeObserver = function(which, callback) {
  77. var observer = this.observers_[which].find(callback);
  78. G_Assert(this, !!observer, "Tried to unregister a nonexistant observer");
  79. this.prefs_.removeObserver(which, observer);
  80. this.observers_[which].erase(callback);
  81. }
  82. function G_PreferenceObserver(callback) {
  83. this.debugZone = "prefobserver";
  84. this.callback_ = callback;
  85. }
  86. G_PreferenceObserver.prototype.observe = function(subject, topic, data) {
  87. G_Debug(this, "Observed pref change: " + data);
  88. this.callback_(data);
  89. }
  90. G_PreferenceObserver.prototype.QueryInterface = function(iid) {
  91. var Ci = Ci;
  92. if (iid.equals(Ci.nsISupports) ||
  93. iid.equals(Ci.nsIObserves) ||
  94. iid.equals(Ci.nsISupportsWeakReference))
  95. return this;
  96. throw Components.results.NS_ERROR_NO_INTERFACE;
  97. }
  98. function TEST_G_Preferences() {
  99. if (G_GDEBUG) {
  100. var z = "preferences UNITTEST";
  101. G_debugService.enableZone(z);
  102. G_Debug(z, "Starting");
  103. var p = new G_Preferences();
  104. var testPref = "google-amulet-preferences-unittest";
  105. var noSuchPref = "google-amulet-preferences-unittest-aypabtu";
  106. var observeCount = 0;
  107. function observe(prefChanged) {
  108. G_Assert(z, prefChanged == testPref, "observer broken");
  109. observeCount++;
  110. };
  111. p.addObserver(testPref, observe);
  112. p.setBoolPref(testPref, true);
  113. G_Assert(z, p.getBoolPref(testPref), "get or set broken");
  114. G_Assert(z, observeCount == 1, "observer adding not working");
  115. p.removeObserver(testPref, observe);
  116. p.setBoolPref(testPref, false);
  117. G_Assert(z, observeCount == 1, "observer removal not working");
  118. G_Assert(z, !p.getBoolPref(testPref), "get broken");
  119. try {
  120. p.getBoolPref(noSuchPref);
  121. G_Assert(z, false, "getting non-existent pref didn't throw");
  122. } catch (e) {
  123. }
  124. G_Assert(z,
  125. p.getBoolPrefOrDefault(noSuchPref, true), "default borken (t)");
  126. G_Assert(z, !p.getBoolPrefOrDefault(noSuchPref, false), "default borken");
  127. G_Assert(z, p.getBoolPrefOrDefaultAndSet(noSuchPref, true),
  128. "default and set broken (didnt default");
  129. G_Assert(z,
  130. p.getBoolPref(noSuchPref), "default and set broken (didnt set)");
  131. p.clearPref(noSuchPref);
  132. G_Assert(z, !p.getBoolPrefOrDefault(noSuchPref, false), "clear broken");
  133. p.clearPref(testPref);
  134. G_Debug(z, "PASSED");
  135. }
  136. }
  137.