changeset 278:eb0a143a3080

don't remove observers that aren't in our list of observers, and support observers that are objects rather than functions
author Myk Melez <myk@mozilla.org>
date Mon, 01 Sep 2008 18:58:02 -0700
parents 4de6fb8044e7
children 910120e0ac63
files modules/Observers.js
diffstat 1 files changed, 11 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/modules/Observers.js	Thu Aug 28 16:14:54 2008 -0700
+++ b/modules/Observers.js	Mon Sep 01 18:58:02 2008 -0700
@@ -56,8 +56,10 @@
 
   remove: function(callback, topic) {
     let observer = Observers._observers[topic][callback];
-    Observers._service.removeObserver(observer, topic);
-    delete this._observers[topic][callback];
+    if (observer) {
+      Observers._service.removeObserver(observer, topic);
+      delete this._observers[topic][callback];
+    }
   },
 
   notify: function(subject, topic, data) {
@@ -67,6 +69,8 @@
   _service: Cc["@mozilla.org/observer-service;1"].
             getService(Ci.nsIObserverService),
 
+  // Observers indexed by callback.  This lets us get the observer
+  // to remove when a caller calls |remove|, passing it a callback.
   _observers: {}
 };
 
@@ -81,10 +85,12 @@
     // Pass the wrappedJSObject for subjects that have one.  Otherwise pass
     // the subject itself.  This way we support both wrapped subjects created
     // using this module and those that are real XPCOM components.
-    if (subject && subject.wrappedJSObject)
-      this._callback(subject.wrappedJSObject, topic, data);
+    let unwrappedSubject = subject.wrappedJSObject || subject;
+
+    if (typeof this._callback == "function")
+      this._callback(unwrappedSubject, topic, data);
     else
-      this._callback(subject, topic, data);
+      this._callback.observe(unwrappedSubject, topic, data);
   }
 }