MSFX/chrome/utils/xPref.jsm

94 lines
2.7 KiB
JavaScript

let EXPORTED_SYMBOLS = ['xPref'];
const Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
var xPref = {
// Retorna o valor da preferência, seja qual for o tipo, mas não
// testei com tipos complexos como nsIFile, não sei como detectar
// uma preferência assim, na verdade nunca vi uma
get: function (prefPath, def = false, valueIfUndefined, setDefault = true) {
let sPrefs = def ?
Services.prefs.getDefaultBranch(null) :
Services.prefs;
try {
switch (sPrefs.getPrefType(prefPath)) {
case 0:
if (valueIfUndefined != undefined)
return this.set(prefPath, valueIfUndefined, setDefault);
else
return undefined;
case 32:
return sPrefs.getStringPref(prefPath);
case 64:
return sPrefs.getIntPref(prefPath);
case 128:
return sPrefs.getBoolPref(prefPath);
}
} catch (ex) {
return undefined;
}
return;
},
set: function (prefPath, value, def = false) {
let sPrefs = def ?
Services.prefs.getDefaultBranch(null) :
Services.prefs;
switch (typeof value) {
case 'string':
return sPrefs.setStringPref(prefPath, value) || value;
case 'number':
return sPrefs.setIntPref(prefPath, value) || value;
case 'boolean':
return sPrefs.setBoolPref(prefPath, value) || value;
}
return;
},
lock: function (prefPath, value) {
let sPrefs = Services.prefs;
this.lockedBackupDef[prefPath] = this.get(prefPath, true);
if (sPrefs.prefIsLocked(prefPath))
sPrefs.unlockPref(prefPath);
this.set(prefPath, value, true);
sPrefs.lockPref(prefPath);
},
lockedBackupDef: {},
unlock: function (prefPath) {
Services.prefs.unlockPref(prefPath);
let bkp = this.lockedBackupDef[prefPath];
if (bkp == undefined)
Services.prefs.deleteBranch(prefPath);
else
this.set(prefPath, bkp, true);
},
clear: Services.prefs.clearUserPref,
// Detecta mudanças na preferência e retorna:
// return[0]: valor da preferência alterada
// return[1]: nome da preferência alterada
// Guardar chamada numa var se quiser interrompê-la depois
addListener: function (prefPath, trat) {
this.observer = function (aSubject, aTopic, prefPath) {
return trat(xPref.get(prefPath), prefPath);
}
Services.prefs.addObserver(prefPath, this.observer);
return {
prefPath: prefPath,
observer: this.observer
};
},
// Encerra pref observer
// Só precisa passar a var definida quando adicionou
removeListener: function (obs) {
Services.prefs.removeObserver(obs.prefPath, obs.observer);
}
}