1 /* See license.txt for terms of usage */
  2 
  3 // ********************************************************************************************* //
  4 // Constants
  5 
  6 var Cc = Components.classes;
  7 var Ci = Components.interfaces;
  8 var Cu = Components.utils;
  9 
 10 Cu.import("resource://gre/modules/Services.jsm");
 11 
 12 var EXPORTED_SYMBOLS = ["PrefLoader"];
 13 
 14 var PrefLoader = {};
 15 PrefLoader.prefDomain = "extensions.firebug.";
 16 
 17 // ********************************************************************************************* //
 18 // Implementation
 19 
 20 /**
 21  * Load file with default preferences
 22  *
 23  * @param {Object} path Extension installation path
 24  * @param {Object} fileName Preference file name
 25  */
 26 function loadDefaultPrefs(path, fileName)
 27 {
 28     try
 29     {
 30         var uri;
 31         var baseURI = Services.io.newFileURI(path);
 32 
 33         // Compute preference file name path.
 34         if (path.isDirectory())
 35             uri = Services.io.newURI("defaults/preferences/" + fileName, null, baseURI).spec;
 36         else
 37             uri = "jar:" + baseURI.spec + "!/defaults/preferences/" + fileName;
 38 
 39         // Load preference file and use 'pref' function to define all prefs.
 40         Services.scriptloader.loadSubScript(uri, {pref: pref});
 41     }
 42     catch (err)
 43     {
 44         Cu.reportError(err);
 45     }
 46 }
 47 
 48 // ********************************************************************************************* //
 49 
 50 /**
 51  * Clear preferences that are not modified by the user. This is requirement
 52  * (or recommendation?) from AMO reviewers.
 53  *
 54  * @param {Object} domain
 55  */
 56 function clearDefaultPrefs(domain)
 57 {
 58     domain = domain || PrefLoader.prefDomain;
 59     var pb = Services.prefs.getDefaultBranch(domain);
 60 
 61     var names = pb.getChildList("");
 62     for each (var name in names)
 63     {
 64         if (!pb.prefHasUserValue(name))
 65             pb.deleteBranch(name);
 66     }
 67 }
 68 
 69 // ********************************************************************************************* //
 70 
 71 /**
 72  * Implement function that is used to define preferences in preference files. These
 73  * are usually stored within 'defaults/preferences' directory.
 74  *
 75  * @param {Object} name Preference name
 76  * @param {Object} value Preference value
 77  */
 78 function pref(name, value)
 79 {
 80     try
 81     {
 82         var branch = Services.prefs.getDefaultBranch("");
 83 
 84         switch (typeof value)
 85         {
 86             case "boolean":
 87                 branch.setBoolPref(name, value);
 88                 break;
 89 
 90             case "number":
 91                 branch.setIntPref(name, value);
 92                 break;
 93 
 94             case "string":
 95                 var str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
 96                 str.data = value;
 97                 branch.setComplexValue(name, Ci.nsISupportsString, str);
 98                 break;
 99         }
100     }
101     catch (e)
102     {
103         Cu.reportError("prefLoader.pref; Firebug can't set default pref value for: " + name);
104     }
105 }
106 
107 // ********************************************************************************************* //
108 // Duplicates firebug/lib/options
109 
110 var prefTypeMap = (function()
111 {
112     var map = {}, br = Ci.nsIPrefBranch;
113     map["string"] = map[br.PREF_STRING] = "CharPref";
114     map["boolean"] = map[br.PREF_BOOL] = "BoolPref";
115     map["number"] = map[br.PREF_INT] = "IntPref";
116     return map;
117 })();
118 
119 function getPref(prefDomain, name)
120 {
121     var prefName;
122     if (name == undefined)
123         prefName = PrefLoader.prefDomain + prefDomain;
124     else
125         prefName = prefDomain + "." + name;
126 
127     var prefs = Services.prefs;
128     var type = prefTypeMap[prefs.getPrefType(prefName)];
129     if (type)
130         var value = prefs["get" + type](prefName);
131 
132     return value;
133 }
134 
135 function setPref(name, value)
136 {
137     var prefName = PrefLoader.prefDomain + name;
138     var prefs = Services.prefs;
139 
140     var type = prefTypeMap[typeof value];
141     if (type)
142         value = prefs["set" + type](prefName, value);
143 
144     return value;
145 }
146 
147 function forceSave()
148 {
149     Services.prefs.savePrefFile(null);
150 }
151 
152 // ********************************************************************************************* //
153 // Registration
154 
155 PrefLoader.loadDefaultPrefs = loadDefaultPrefs;
156 PrefLoader.clearDefaultPrefs = clearDefaultPrefs;
157 PrefLoader.getPref = getPref;
158 PrefLoader.setPref = setPref;
159 PrefLoader.forceSave = forceSave;
160 
161 // ********************************************************************************************* //
162