Mozilla Default Prefs: Difference between revisions
From MozillaZine Knowledge Base
Jump to navigationJump to search
mNo edit summary |
|||
Line 26: | Line 26: | ||
var file = Components.classes["@mozilla.org/file/directory_service;1"] | var file = Components.classes["@mozilla.org/file/directory_service;1"] | ||
.getService(Components.interfaces.nsIProperties) | .getService(Components.interfaces.nsIProperties) | ||
.get("ProfD", Components.interfaces.nsIFile).append("pref").append(this.extName + ".js"); | .get("ProfD", Components.interfaces.nsIFile); | ||
file.append("pref"); | |||
file.append(this.extName + ".js"); | |||
var prefs = Components.classes["@mozilla.org/preferences-service;1"] | var prefs = Components.classes["@mozilla.org/preferences-service;1"] | ||
.getService(Components.interfaces.nsIPrefBranch); | .getService(Components.interfaces.nsIPrefBranch); | ||
Line 61: | Line 63: | ||
} | } | ||
} | } | ||
} | }, | ||
readData: function(file) { | readData: function(file) { |
Revision as of 01:42, 11 February 2006
The example code here details a method of reading the default prefs stored in the javascript file here myext.xpi/defaults/preferences/
in your extension and setting them as user prefs in the profile directory since Mozilla does not support profile default preferences. Mozilla does however support default preferences in the application directory so for application directory installs instead of profile installs copy the default prefs file to (appdir)/defaults/pref
in your install script.
The first step is to add this code to your Install.js file.
// Add prefs file var prefDirs = [ getFolder(getFolder('Profile'),'pref') ]; if (!this.profileInstall) prefDirs.push(getFolder(getFolder(getFolder('Program'),'defaults'),'pref')); for(var j=0; j<prefDirs.length; j++) { var prefDir = prefDirs[j]; if(!File.exists(prefDir)) File.dirCreate(prefDir); Install.addFile(null, 'defaults/preferences/' + this.extShortName + '.js', prefDir, null); }
Then second step is to add this code to your main javascript file loaded on startup.
var DefaultPrefCheck = { extName: 'myext', // The name of the default pref file (without the .js part) check: function() { var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); file.append("pref"); file.append(this.extName + ".js"); var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); if (!file.exists()) return; // if not on Mozilla file does not exist so exit var data = this.readData(file); // remove comments and split lines into array data = data.replace(/\/\/.*/gm, "").replace(/\/\*([^*][^\/])*[^\0]?\*\//gm, "").split(';'); // check pref type and set if it does not exist for (var i=0; i<data.length; i++) { //if valid pref line if (/^\s*pref\(.*\,.*\)\s*$/i.test(data[i])) { var pref = data[i].slice(data[i].indexOf('(')+2, data[i].indexOf(',')-1); var value = data[i].slice(data[i].indexOf(',')+1, data[i].indexOf(')')); if (/^\s*false\s*$/i.test(value) || /^\s*true\s*$/i.test(value)) // if boolean pref { value = (/\s*true\s*/i.test(value)); try {prefs.getBoolPref(pref);} catch (e) {prefs.setBoolPref(pref, value);} } else if (/^\s*["][^"]*["]\s*$/.test(value)) // if char pref { value = value.slice(value.indexOf('"')+1,value.lastIndexOf('"')); try {prefs.getCharPref(pref);} catch (e) {prefs.setCharPref(pref, value);} } else // if integer pref { value = new Number(value); try {prefs.getIntPref(pref);} catch (e) {prefs.setIntPref(pref, value);} } } } }, readData: function(file) { var data = ""; var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance(Components.interfaces.nsIScriptableInputStream); fstream.init(file, 1, 0, false); sstream.init(fstream); var str = sstream.read(-1); while (str.length > 0) { data += str; str = sstream.read(-1); } sstream.close(); fstream.close(); return data; } } DefaultPrefCheck.check();