[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