[Pkg-mozext-commits] [adblock-plus] 212/464: Initialize Prefs module automatically when it is loaded, allow adding pref observers

David Prévot taffit at moszumanska.debian.org
Tue Jul 22 20:44:18 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository adblock-plus.

commit 66ade127aa85ed46238e5a5c58e2cfdd781399f6
Author: Wladimir Palant <trev at adblockplus.org>
Date:   Mon Jan 23 15:38:02 2012 +0100

    Initialize Prefs module automatically when it is loaded, allow adding pref observers
---
 bootstrap.js.tmpl |   1 +
 prefs.js          | 223 ++++++++++++++++++++++++++++++++----------------------
 2 files changed, 133 insertions(+), 91 deletions(-)

diff --git a/bootstrap.js.tmpl b/bootstrap.js.tmpl
index bcb9d41..44e94fb 100644
--- a/bootstrap.js.tmpl
+++ b/bootstrap.js.tmpl
@@ -106,6 +106,7 @@ function require(module)
         addonID: addonData.id,
         addonVersion: addonData.version,
         addonRoot: addonData.resourceURI.spec,
+        addonName: "{{metadata.get('general', 'basename')}}",
       };
     }
     else
diff --git a/prefs.js b/prefs.js
index 50c65f3..5c65458 100644
--- a/prefs.js
+++ b/prefs.js
@@ -11,122 +11,152 @@ const Cu = Components.utils;
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-let {addonRoot} = require("info");
+let {addonRoot, addonName} = require("info");
+let branchName = "extensions." + addonName + ".";
+let branch = Services.prefs.getBranch(branchName);
+let ignorePrefChanges = false;
 
-let Prefs = exports.Prefs =
+function init()
 {
-  branch: null,
-  ignorePrefChanges: false,
+  // Load default preferences and set up properties for them
+  let defaultBranch = Services.prefs.getDefaultBranch(branchName);
+  let scope =
+  {
+    pref: function(pref, value)
+    {
+      if (pref.substr(0, branchName.length) != branchName)
+      {
+        Cu.reportError(new Error("Ignoring default preference " + pref + ", wrong branch."));
+        return;
+      }
+      pref = pref.substr(branchName.length);
+
+      let [getter, setter] = typeMap[typeof value];
+      setter(defaultBranch, pref, value);
+      defineProperty(pref, false, getter, setter);
+    }
+  };
+  Services.scriptloader.loadSubScript(addonRoot + "defaults/preferences/prefs.js", scope);
 
-  init: function(branchName, migrate)
+  // Add preference change observer
+  try
   {
-    if (this.branch)
-      return;
-    this.branch = Services.prefs.getBranch(branchName);
+    branch.QueryInterface(Ci.nsIPrefBranch2).addObserver("", Prefs, true);
+    onShutdown.add(function() branch.removeObserver("", Prefs));
+  }
+  catch (e)
+  {
+    Cu.reportError(e);
+  }
+}
 
-    /**
-     * Sets up getter/setter on Prefs object for preference.
-     */
-    function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, /**Function*/ writeFunc)
+/**
+ * Sets up getter/setter on Prefs object for preference.
+ */
+function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, /**Function*/ writeFunc)
+{
+  let value = defaultValue;
+  Prefs["_update_" + name] = function()
+  {
+    try
     {
-      let value = defaultValue;
-      this["_update_" + name] = function()
-      {
-        try
-        {
-          value = readFunc(this.branch, name);
-        }
-        catch(e)
-        {
-          Cu.reportError(e);
-        }
-      };
-      Prefs.__defineGetter__(name, function() value);
-      Prefs.__defineSetter__(name, function(newValue)
-      {
-        if (value == newValue)
-          return value;
-
-        try
-        {
-          this.ignorePrefChanges = true;
-          writeFunc(this.branch, name, newValue);
-          value = newValue;
-        }
-        catch(e)
-        {
-          Cu.reportError(e);
-        }
-        finally
-        {
-          this.ignorePrefChanges = false;
-        }
-        return value;
-      });
-      this["_update_" + name]();
+      value = readFunc(branch, name);
+      triggerListeners(name);
+    }
+    catch(e)
+    {
+      Cu.reportError(e);
     }
+  };
+  Prefs.__defineGetter__(name, function() value);
+  Prefs.__defineSetter__(name, function(newValue)
+  {
+    if (value == newValue)
+      return value;
 
-    // Load default preferences and set up properties for them
-    let defaultBranch = Services.prefs.getDefaultBranch(branchName);
-    let typeMap =
+    try
     {
-      boolean: [getBoolPref, setBoolPref],
-      number: [getIntPref, setIntPref],
-      string: [getCharPref, setCharPref],
-      object: [getJSONPref, setJSONPref]
-    };
-    let scope =
+      ignorePrefChanges = true;
+      writeFunc(branch, name, newValue);
+      value = newValue;
+      triggerListeners(name);
+    }
+    catch(e)
     {
-      pref: function(pref, value)
-      {
-        if (pref.substr(0, branchName.length) != branchName)
-        {
-          Cu.reportError(new Error("Ignoring default preference " + pref + ", wrong branch."));
-          return;
-        }
-        pref = pref.substr(branchName.length);
-
-        let [getter, setter] = typeMap[typeof value];
-        setter(defaultBranch, pref, value);
-        defineProperty.call(Prefs, pref, false, getter, setter);
-      }
-    };
-    Services.scriptloader.loadSubScript(addonRoot + "defaults/preferences/prefs.js", scope);
+      Cu.reportError(e);
+    }
+    finally
+    {
+      ignorePrefChanges = false;
+    }
+    return value;
+  });
+  Prefs["_update_" + name]();
+}
 
-    // Add preference change observer
+let listeners = [];
+function triggerListeners(/**String*/ name)
+{
+  for (let i = 0; i < listeners.length; i++)
+  {
     try
     {
-      this.branch.QueryInterface(Ci.nsIPrefBranch2)
-                 .addObserver("", this, true);
-      onShutdown.add((function() this.branch.removeObserver("", this)).bind(this));
+      listeners[i](name);
     }
-    catch (e)
+    catch(e)
     {
       Cu.reportError(e);
     }
+  }
+}
 
-    // Migrate preferences stored under outdated names
-    if (migrate)
+/**
+ * Manages the preferences for an extension, object properties corresponding
+ * to extension's preferences are added automatically. Setting the property
+ * will automatically change the preference, external preference changes are
+ * also recognized automatically.
+ */
+let Prefs = exports.Prefs =
+{
+  /**
+   * Migrates an old preference to a new name.
+   */
+  migrate: function(/**String*/ oldName, /**String*/ newName)
+  {
+    if (newName in this && Services.prefs.prefHasUserValue(oldName))
     {
-      for (let oldName in migrate)
+      let [getter, setter] = typeMap[typeof this[newName]];
+      try
       {
-        let newName = migrate[oldName];
-        if (newName in this && Services.prefs.prefHasUserValue(oldName))
-        {
-          let [getter, setter] = typeMap[typeof this[newName]];
-          try
-          {
-            this[newName] = getter(Services.prefs, oldName);
-          } catch(e) {}
-          Services.prefs.clearUserPref(oldName);
-        }
-      }
+        this[newName] = getter(Services.prefs, oldName);
+      } catch(e) {}
+      Services.prefs.clearUserPref(oldName);
     }
   },
 
+  /**
+   * Adds a preferences listener that will be fired whenever a preference
+   * changes.
+   */
+  addListener: function(/**Function*/ listener)
+  {
+    if (listeners.indexOf(listener) < 0)
+      listeners.push(listener);
+  },
+
+  /**
+   * Removes a preferences listener.
+   */
+  removeListener: function(/**Function*/ listener)
+  {
+    let index = listeners.indexOf(listener);
+    if (index >= 0)
+      listeners.splice(index, 1);
+  },
+
   observe: function(subject, topic, data)
   {
-    if (this.ignorePrefChanges || topic != "nsPref:changed")
+    if (ignorePrefChanges || topic != "nsPref:changed")
       return;
 
     if ("_update_" + data in this)
@@ -136,6 +166,15 @@ let Prefs = exports.Prefs =
   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
 };
 
+// Getter/setter functions for difference preference types
+let typeMap =
+{
+  boolean: [getBoolPref, setBoolPref],
+  number: [getIntPref, setIntPref],
+  string: [getCharPref, setCharPref],
+  object: [getJSONPref, setJSONPref]
+};
+
 function getIntPref(branch, pref) branch.getIntPref(pref)
 function setIntPref(branch, pref, newValue) branch.setIntPref(pref, newValue)
 
@@ -152,3 +191,5 @@ function setCharPref(branch, pref, newValue)
 
 function getJSONPref(branch, pref) JSON.parse(getCharPref(branch, pref))
 function setJSONPref(branch, pref, newValue) setCharPref(branch, pref, JSON.stringify(newValue))
+
+init();

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git



More information about the Pkg-mozext-commits mailing list