1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
'use strict';
export const 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,
observer: this.observer
};
},
// Encerra pref observer
// Só precisa passar a var definida quando adicionou
removeListener: function (obs) {
Services.prefs.removeObserver(obs.prefPath, obs.observer);
}
}
|