1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-03-14 17:15:45 +01:00

Fix storage observer weak ref stuff (Gecko is a strange beast)

This commit is contained in:
Kris Maglione
2008-12-21 18:56:56 -05:00
parent fc0a35e833
commit 3482269980
2 changed files with 19 additions and 6 deletions

View File

@@ -96,7 +96,7 @@ Option.prototype = {
}, },
get values() this.parseValues(this.value), 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)), getValues: function (scope) this.parseValues(this.get(scope)),

View File

@@ -311,11 +311,22 @@ var storage = {
addObserver: function addObserver(key, callback, ref) 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(); this.removeDeadObservers();
if (!(key in observers)) if (!(key in observers))
observers[key] = []; observers[key] = [];
if (observers[key].indexOf(callback) == -1) if (!observers[key].some(function (o) o.callback.get() == callback))
observers[key].push({ ref: ref && Cu.getWeakReference(ref), callback: callback }); observers[key].push({ ref: ref && Cu.getWeakReference(ref), callback: callbackRef });
}, },
removeObserver: function (key, callback) removeObserver: function (key, callback)
@@ -323,7 +334,7 @@ var storage = {
this.removeDeadObservers(); this.removeDeadObservers();
if (!(key in observers)) if (!(key in observers))
return; 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) if (observers[key].length == 0)
delete obsevers[key]; delete obsevers[key];
}, },
@@ -332,18 +343,20 @@ var storage = {
{ {
for (let [key, ary] in Iterator(observers)) 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) if (!ary.length)
delete observers[key]; delete observers[key];
} }
}, },
get observers() observers,
fireEvent: function fireEvent(key, event, arg) fireEvent: function fireEvent(key, event, arg)
{ {
this.removeDeadObservers(); this.removeDeadObservers();
// Safe, since we have our own Array object here. // Safe, since we have our own Array object here.
for each (let observer in observers[key]) for each (let observer in observers[key])
observer.callback(key, event, arg); observer.callback.get()(key, event, arg);
timers[key].tell(); timers[key].tell();
}, },