Bug 1354682 Add transform to XPCOMUtils.defineLazyPreferenceGetter r?kmag
MozReview-Commit-ID: Lm59IHMNcy9
--- a/js/xpconnect/loader/XPCOMUtils.jsm
+++ b/js/xpconnect/loader/XPCOMUtils.jsm
@@ -294,21 +294,26 @@ this.XPCOMUtils = {
* The name of the getter property to define on aObject.
* @param aPreference
* The name of the preference to read.
* @param aDefaultValue
* The default value to use, if the preference is not defined.
* @param aOnUpdate
* A function to call upon update. Receives as arguments
* `(aPreference, previousValue, newValue)`
+ * @param aTransform
+ * An optional function to transform the value. If provided,
+ * this function receives the new preference value as an argument
+ * and its return value is used by the getter.
*/
defineLazyPreferenceGetter: function XPCU_defineLazyPreferenceGetter(
aObject, aName, aPreference,
aDefaultValue = null,
- aOnUpdate = null)
+ aOnUpdate = null,
+ aTransform = val => val)
{
// Note: We need to keep a reference to this observer alive as long
// as aObject is alive. This means that all of our getters need to
// explicitly close over the variable that holds the object, and we
// cannot define a value in place of a getter after we read the
// preference.
let observer = {
QueryInterface: this.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
@@ -338,17 +343,17 @@ this.XPCOMUtils = {
configurable: true,
enumerable: true,
get,
});
};
function lazyGetter() {
if (observer.value === undefined) {
- observer.value = Preferences.get(aPreference, aDefaultValue);
+ observer.value = aTransform(Preferences.get(aPreference, aDefaultValue));
}
return observer.value;
}
defineGetter(() => {
Services.prefs.addObserver(aPreference, observer, true);
defineGetter(lazyGetter);
--- a/js/xpconnect/tests/unit/test_xpcomutils.js
+++ b/js/xpconnect/tests/unit/test_xpcomutils.js
@@ -146,16 +146,28 @@ add_test(function test_defineLazyPrefere
equal(obj.pref, "currentValue", "Should return new value after second preference change");
Preferences.reset(PREF);
equal(obj.pref, "defaultValue", "Should return default value after pref is reset");
+ obj = {};
+ XPCOMUtils.defineLazyPreferenceGetter(obj, "pref", PREF, "a,b",
+ null, value => value.split(","));
+
+ deepEqual(obj.pref, ["a", "b"], "transform is applied to default value");
+
+ Preferences.set(PREF, "x,y,z");
+ deepEqual(obj.pref, ["x", "y", "z"], "transform is applied to updated value");
+
+ Preferences.reset(PREF);
+ deepEqual(obj.pref, ["a", "b"], "transform is applied to reset default");
+
run_next_test();
});
add_test(function test_categoryRegistration()
{
const CATEGORY_NAME = "test-cat";
const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1";