Bug 1354682 Add transform to XPCOMUtils.defineLazyPreferenceGetter r?kmag draft
authorAndrew Swan <aswan@mozilla.com>
Fri, 28 Apr 2017 22:39:13 -0700
changeset 570528 c951faa31ccf429e30c1a2018f558450e19d8880
parent 568807 a477e80f03b61be9961bc61770a2b55cce139b91
child 570529 a84ef94dd437c7f121db7b1099e80eb234499441
push id56522
push useraswan@mozilla.com
push dateSat, 29 Apr 2017 05:44:25 +0000
reviewerskmag
bugs1354682
milestone55.0a1
Bug 1354682 Add transform to XPCOMUtils.defineLazyPreferenceGetter r?kmag MozReview-Commit-ID: Lm59IHMNcy9
js/xpconnect/loader/XPCOMUtils.jsm
js/xpconnect/tests/unit/test_xpcomutils.js
--- 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";