1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-01-09 01:54:12 +01:00

Tie storage observers to a weak reference of window so they're automatically destroyed.

This commit is contained in:
Kris Maglione
2008-12-20 14:36:11 -05:00
parent e1d5236261
commit ef827139e4
3 changed files with 21 additions and 13 deletions

View File

@@ -253,27 +253,41 @@ var storage = {
return this.newObject(key, ArrayStore, store, Array);
},
addObserver: function addObserver(key, callback)
addObserver: function addObserver(key, callback, ref)
{
this.removeDeadObservers();
if (!(key in observers))
observers[key] = [];
if (observers[key].indexOf(callback) == -1)
observers[key].push(callback);
observers[key].push({ ref: ref && Components.utils.getWeakReference(ref), callback: callback });
},
removeObserver: function (key, callback)
{
this.removeDeadObservers();
if (!(key in observers))
return;
observers[key] = observers[key].filter(function (elem) elem != callback);
observers[key] = observers[key].filter(function (elem) elem.callback != callback);
if (observers[key].length == 0)
delete obsevers[key];
},
removeDeadObservers: function ()
{
for (let [key, ary] in Iterator(observers))
{
observers[key] = ary = ary.filter(function (o) !o.ref || o.ref.get());
if (!ary.length)
delete observers[key];
}
},
fireEvent: function fireEvent(key, event, arg)
{
for each (callback in observers[key])
callback(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);
timers[key].tell();
},