[Pkg-mozext-commits] [requestpolicy] 105/280: integrate ObserverManager into Environment

David Prévot taffit at moszumanska.debian.org
Sat May 2 20:30:07 UTC 2015


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

taffit pushed a commit to branch master
in repository requestpolicy.

commit 2c9d9443139c3e8d31f2317eb8c6dfaf98393ec6
Author: Martin Kimmerle <dev at 256k.de>
Date:   Sun Jan 4 16:34:29 2015 +0100

    integrate ObserverManager into Environment
    
    ObserverManager has been converted from a singleton object to a
    class and must from now on be bound to an Environment. As the
    environment has to be created *before* the ObserverManager, the
    Lazy Getter `Environment.obMan` is a convenient method for
    getting an ObserverManager for an existing Environment.
---
 src/content/lib/environment.jsm                |  18 ++++
 src/content/lib/observer-manager.jsm           | 144 +++++++++++++------------
 src/content/lib/request-processor.redirects.js |   4 +-
 src/content/lib/requestpolicy-service.jsm      |   5 +-
 src/content/settings/advancedprefs.js          |   2 +-
 src/content/settings/basicprefs.js             |   2 +-
 src/content/settings/common.js                 |   6 +-
 src/content/settings/defaultpolicy.js          |   2 +-
 src/content/settings/subscriptions.js          |   6 +-
 src/content/settings/yourpolicy.js             |   2 +-
 10 files changed, 113 insertions(+), 78 deletions(-)

diff --git a/src/content/lib/environment.jsm b/src/content/lib/environment.jsm
index c22d66b..e4c266f 100644
--- a/src/content/lib/environment.jsm
+++ b/src/content/lib/environment.jsm
@@ -27,6 +27,17 @@ const Cu = Components.utils;
 
 let EXPORTED_SYMBOLS = ["Environment"];
 
+let globalScope = this;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(globalScope, "ScriptLoader",
+    "chrome://requestpolicy/content/lib/script-loader.jsm");
+XPCOMUtils.defineLazyGetter(globalScope, "ObserverManager", function() {
+  return ScriptLoader.importModule("observer-manager").ObserverManager;
+});
+
+
 
 /**
  * The `Environment` class can take care of the "startup" (=initialization) and
@@ -67,6 +78,13 @@ function Environment() {
   // The function queues
   self.startupFnQueue = [];
   self.shutdownFnStack = [];
+
+  // Define a Lazy Getter to get an ObserverManager for this Environment.
+  // Using that Getter is more convenient than doing it manually, as the
+  // Environment has to be created *before* the ObserverManager.
+  XPCOMUtils.defineLazyGetter(self, "obMan", function() {
+    return new ObserverManager(self);
+  });
 }
 
 Environment.STATE_SHUT_DOWN = 0;
diff --git a/src/content/lib/observer-manager.jsm b/src/content/lib/observer-manager.jsm
index cef0a1c..efbe16c 100644
--- a/src/content/lib/observer-manager.jsm
+++ b/src/content/lib/observer-manager.jsm
@@ -33,87 +33,99 @@ Cu.import("chrome://requestpolicy/content/lib/script-loader.jsm");
 let {ProcessEnvironment} = ScriptLoader.importModule("process-environment");
 
 // Load the Logger at startup-time, not at load-time!
-// ( On load-time Looger might be null. )
+// ( On load-time Logger might be null. )
 let Logger;
 ProcessEnvironment.enqueueStartupFunction(function() {
   Logger = ScriptLoader.importModule("logger").Logger;
 });
 
 
+
 /**
- * The ObserverManager provides an interface to `nsIObserverService` which takes
- * care of unregistering the observed topics.
+ * An instance of this class registers itself to `nsIObserverService` on behalf
+ * of some other object.
  */
-let ObserverManager = (function() {
-  let self = {};
-
-  /**
-   * This Object registers itself to `nsIObserverService` on behalf of some other
-   * object.
-   */
-  function SingleTopicObserver(aTopic, aFunctionToCall) {
-    // save the parameters
-    this.topic = aTopic;
-    // As the `observe` function, take directly the parameter.
-    this.observe = aFunctionToCall;
-
-    // currently this obserer is not rgistered yet
+function SingleTopicObserver(aTopic, aFunctionToCall) {
+  // save the parameters
+  this.topic = aTopic;
+  // As the `observe` function, take directly the parameter.
+  this.observe = aFunctionToCall;
+
+  // currently this obserer is not rgistered yet
+  this.isRegistered = false;
+
+  // register this observer
+  this.register();
+}
+SingleTopicObserver.prototype.register = function() {
+  if (!this.isRegistered) {
+    Services.obs.addObserver(this, this.topic, false);
+    this.isRegistered = true;
+  }
+};
+SingleTopicObserver.prototype.unregister = function() {
+  if (this.isRegistered) {
+    Services.obs.removeObserver(this, this.topic);
     this.isRegistered = false;
-
-    // register this observer
-    this.register();
   }
-  SingleTopicObserver.prototype.register = function() {
-    if (!this.isRegistered) {
-      Services.obs.addObserver(this, this.topic, false);
-      this.isRegistered = true;
-    }
-  };
-  SingleTopicObserver.prototype.unregister = function() {
-    if (this.isRegistered) {
-      Services.obs.removeObserver(this, this.topic);
-      this.isRegistered = false;
-    }
-  };
-
+};
 
 
 
-
-  // an object holding all observers for unregistering when unloading the page
-  let observers = [];
-
-  /**
-   * This function can be called from anywhere; the caller hands over an object
-   * with the keys being the *topic* and the values being the function that
-   * should be called when the topic is observed.
-   */
-  self.observe = function(aList) {
-    for (let topic in aList) {
-      if (aList.hasOwnProperty(topic)) {
-        observers.push(new SingleTopicObserver(topic, aList[topic]));
-      }
+/**
+ * An ObserverManager provides an interface to `nsIObserverService` which takes
+ * care of unregistering the observed topics. Every ObserverManager is bound to
+ * an environment.
+ */
+function ObserverManager(aEnv) {
+  let self = this;
+
+  self.environment = aEnv;
+
+  if (!!aEnv) {
+    self.environment.pushShutdownFunction(function() {
+      self.unregisterAllObservers();
+    });
+  } else {
+    // aEnv is not defined! Try to report an error.
+    if (!!Logger) {
+      Logger.warning(Logger.TYPE_INTERNAL, "No Environment was specified for " +
+                     "a new ObserverManager! This means that the observers " +
+                     "won't be unregistered!");
     }
-  };
-
-  self.observePrefChanges = self.observe.bind(self,
-      "requestpolicy-prefs-changed");
-
-
-
-
+  }
 
+  // an object holding all observers for unregistering when unloading the page
+  self.observers = [];
+}
 
-  /**
-   * The function will unregister all registered observers.
-   */
-  ProcessEnvironment.pushShutdownFunction(function() {
-    while (observers.length > 0) {
-      let observer = observers.pop();
-      Logger.dump("Unregistering observer for topic " + observer.topic);
-      observer.unregister();
+/**
+ * This function can be called from anywhere; the caller hands over an object
+ * with the keys being the *topic* and the values being the function that
+ * should be called when the topic is observed.
+ */
+ObserverManager.prototype.observe = function(aList) {
+  let self = this;
+  for (let topic in aList) {
+    if (aList.hasOwnProperty(topic)) {
+      self.observers.push(new SingleTopicObserver(topic, aList[topic]));
     }
-  });
+  }
+};
+
+ObserverManager.prototype.observePrefChanges = function(aFunctionToCall) {
+  let self = this;
+  self.observe({"requestpolicy-prefs-changed": aFunctionToCall});
+};
 
-  return self;
-}());
+/**
+ * The function will unregister all registered observers.
+ */
+ObserverManager.prototype.unregisterAllObservers = function() {
+  let self = this;
+  while (self.observers.length > 0) {
+    let observer = self.observers.pop();
+    Logger.dump("Unregistering observer for topic " + observer.topic);
+    observer.unregister();
+  }
+};
diff --git a/src/content/lib/request-processor.redirects.js b/src/content/lib/request-processor.redirects.js
index cd676ee..0644ee9 100644
--- a/src/content/lib/request-processor.redirects.js
+++ b/src/content/lib/request-processor.redirects.js
@@ -36,7 +36,7 @@ ScriptLoader.importModules([
   "request",
   "request-result",
   "http-response",
-  "observer-manager"
+  "process-environment"
 ], this);
 ScriptLoader.defineLazyModuleGetters({
   "requestpolicy-service": ["rpService"]
@@ -58,7 +58,7 @@ let RequestProcessor = (function(self) {
 
 
 
-  ObserverManager.observe({
+  ProcessEnvironment.obMan.observe({
     "http-on-examine-response": function(subject) {
       examineHttpResponse(subject);
     },
diff --git a/src/content/lib/requestpolicy-service.jsm b/src/content/lib/requestpolicy-service.jsm
index 9bfa004..85364de 100644
--- a/src/content/lib/requestpolicy-service.jsm
+++ b/src/content/lib/requestpolicy-service.jsm
@@ -42,8 +42,7 @@ ScriptLoader.importModules([
   "utils",
   "content-policy",
   "constants",
-  "process-environment",
-  "observer-manager"
+  "process-environment"
 ], this);
 
 
@@ -383,7 +382,7 @@ let rpService = (function() {
   }
 
   function register() {
-    ObserverManager.observe({
+    ProcessEnvironment.obMan.observe({
       "http-on-modify-request": self.observe,
       "sessionstore-windows-restored": self.observe,
       "private-browsing": self.observe,
diff --git a/src/content/settings/advancedprefs.js b/src/content/settings/advancedprefs.js
index 4879d96..b426b10 100644
--- a/src/content/settings/advancedprefs.js
+++ b/src/content/settings/advancedprefs.js
@@ -135,5 +135,5 @@ function onload() {
   );
 
   // call updateDisplay() every time a preference gets changed
-  ObserverManager.observePrefChanges(updateDisplay);
+  WinEnv.obMan.observePrefChanges(updateDisplay);
 }
diff --git a/src/content/settings/basicprefs.js b/src/content/settings/basicprefs.js
index 6bdb8ac..b89e195 100644
--- a/src/content/settings/basicprefs.js
+++ b/src/content/settings/basicprefs.js
@@ -78,5 +78,5 @@ function onload() {
   );
 
   // call updateDisplay() every time a preference gets changed
-  ObserverManager.observePrefChanges(updateDisplay);
+  WinEnv.obMan.observePrefChanges(updateDisplay);
 }
diff --git a/src/content/settings/common.js b/src/content/settings/common.js
index b4bb872..e864b1d 100644
--- a/src/content/settings/common.js
+++ b/src/content/settings/common.js
@@ -15,9 +15,13 @@ ScriptLoader.importModules([
   "subscription",
   "policy-manager",
   "requestpolicy-service",
-  "observer-manager"
+  "environment"
 ], this);
 
+// create a new Environment for this window
+var WinEnv = new Environment();
+WinEnv.shutdownOnWindowUnload(content);
+
 
 const COMMON_STRINGS = [
   'preferences',
diff --git a/src/content/settings/defaultpolicy.js b/src/content/settings/defaultpolicy.js
index b3aed6c..a89b64b 100644
--- a/src/content/settings/defaultpolicy.js
+++ b/src/content/settings/defaultpolicy.js
@@ -75,5 +75,5 @@ function onload() {
   );
 
   // call updateDisplay() every time a preference gets changed
-  ObserverManager.observePrefChanges(updateDisplay);
+  WinEnv.obMan.observePrefChanges(updateDisplay);
 }
diff --git a/src/content/settings/subscriptions.js b/src/content/settings/subscriptions.js
index 379811e..ae6cbc5 100644
--- a/src/content/settings/subscriptions.js
+++ b/src/content/settings/subscriptions.js
@@ -135,6 +135,8 @@ function onload() {
   }
 
   // call updateDisplay() every time a subscription is added or removed
-  ObserverManager.observe({SUBSCRIPTION_ADDED_TOPIC: updateDisplay});
-  ObserverManager.observe({SUBSCRIPTION_REMOVED_TOPIC: updateDisplay});
+  WinEnv.obMan.observe({
+    SUBSCRIPTION_ADDED_TOPIC: updateDisplay,
+    SUBSCRIPTION_REMOVED_TOPIC: updateDisplay
+  });
 }
diff --git a/src/content/settings/yourpolicy.js b/src/content/settings/yourpolicy.js
index 3776639..108e84e 100644
--- a/src/content/settings/yourpolicy.js
+++ b/src/content/settings/yourpolicy.js
@@ -230,7 +230,7 @@ function onload() {
   }
 
   // observe rule changes and update the table then
-  ObserverManager.observe({
+  WinEnv.obMan.observe({
     "requestpolicy-rules-changed": function(subject, topic, data) {
       var search = document.getElementById('rulesearch');
       populateRuleTable(search.value);

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



More information about the Pkg-mozext-commits mailing list