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:
@@ -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)),
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user