1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-21 12:47:58 +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

@@ -320,10 +320,7 @@ function Options() //{{{
} }
storage.newMap("options", false); storage.newMap("options", false);
storage.addObserver("options", optionObserver); storage.addObserver("options", optionObserver, window);
liberator.registerObserver("shutdown", function () {
storage.removeObserver("options", optionObserver);
});
function storePreference(name, value) function storePreference(name, value)
{ {

View File

@@ -253,27 +253,41 @@ var storage = {
return this.newObject(key, ArrayStore, store, Array); return this.newObject(key, ArrayStore, store, Array);
}, },
addObserver: function addObserver(key, callback) addObserver: function addObserver(key, callback, ref)
{ {
this.removeDeadObservers();
if (!(key in observers)) if (!(key in observers))
observers[key] = []; observers[key] = [];
if (observers[key].indexOf(callback) == -1) 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) removeObserver: function (key, callback)
{ {
this.removeDeadObservers();
if (!(key in observers)) if (!(key in observers))
return; 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) if (observers[key].length == 0)
delete obsevers[key]; 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) fireEvent: function fireEvent(key, event, arg)
{ {
for each (callback in observers[key]) this.removeDeadObservers();
callback(key, event, arg); // Safe, since we have our own Array object here.
for each (let observer in observers[key])
observer.callback(key, event, arg);
timers[key].tell(); timers[key].tell();
}, },

View File

@@ -236,10 +236,7 @@ function Bookmarks() //{{{
}; };
var cache = storage.newObject("bookmark-cache", Cache, false); var cache = storage.newObject("bookmark-cache", Cache, false);
storage.addObserver("bookmark-cache", bookmarkObserver); storage.addObserver("bookmark-cache", bookmarkObserver, window);
liberator.registerObserver("shutdown", function () {
storage.removeObserver("bookmark-cache", bookmarkObserver);
});
liberator.registerObserver("enter", function () { liberator.registerObserver("enter", function () {
if (options["preload"]) if (options["preload"])