Mercurial > snowl
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); } }