From 348226998025ebe75217553e6ae2ff3c270432f8 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sun, 21 Dec 2008 18:56:56 -0500 Subject: [PATCH] Fix storage observer weak ref stuff (Gecko is a strange beast) --- common/content/options.js | 2 +- common/modules/storage.jsm | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/common/content/options.js b/common/content/options.js index c20882db..9128b492 100644 --- a/common/content/options.js +++ b/common/content/options.js @@ -96,7 +96,7 @@ Option.prototype = { }, get values() this.parseValues(this.value), - set values(values) this.setValues(this.scope, values), + set values(values) this.setValues(values, this.scope), getValues: function (scope) this.parseValues(this.get(scope)), diff --git a/common/modules/storage.jsm b/common/modules/storage.jsm index 22b89605..c48a0c40 100644 --- a/common/modules/storage.jsm +++ b/common/modules/storage.jsm @@ -311,11 +311,22 @@ var storage = { addObserver: function addObserver(key, callback, ref) { + if (ref) + { + if (!ref.liberatorStorageRefs) + ref.liberatorStorageRefs = []; + ref.liberatorStorageRefs.push(callback); + var callbackRef = Cu.getWeakReference(callback); + } + else + { + callbackRef = { get: function () callback }; + } this.removeDeadObservers(); if (!(key in observers)) observers[key] = []; - if (observers[key].indexOf(callback) == -1) - observers[key].push({ ref: ref && Cu.getWeakReference(ref), callback: callback }); + if (!observers[key].some(function (o) o.callback.get() == callback)) + observers[key].push({ ref: ref && Cu.getWeakReference(ref), callback: callbackRef }); }, removeObserver: function (key, callback) @@ -323,7 +334,7 @@ var storage = { this.removeDeadObservers(); if (!(key in observers)) return; - observers[key] = observers[key].filter(function (elem) elem.callback != callback); + observers[key] = observers[key].filter(function (elem) elem.callback.get() != callback); if (observers[key].length == 0) delete obsevers[key]; }, @@ -332,18 +343,20 @@ var storage = { { for (let [key, ary] in Iterator(observers)) { - observers[key] = ary = ary.filter(function (o) !o.ref || o.ref.get()); + observers[key] = ary = ary.filter(function (o) o.callback.get() && (!o.ref || o.ref.get() && o.ref.get().liberatorStorageRefs)) if (!ary.length) delete observers[key]; } }, + get observers() observers, + fireEvent: function fireEvent(key, event, arg) { this.removeDeadObservers(); // Safe, since we have our own Array object here. for each (let observer in observers[key]) - observer.callback(key, event, arg); + observer.callback.get()(key, event, arg); timers[key].tell(); },