mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-21 09:08:10 +01:00
Tie storage observers to a weak reference of window so they're automatically destroyed.
This commit is contained in:
@@ -320,10 +320,7 @@ function Options() //{{{
|
||||
}
|
||||
|
||||
storage.newMap("options", false);
|
||||
storage.addObserver("options", optionObserver);
|
||||
liberator.registerObserver("shutdown", function () {
|
||||
storage.removeObserver("options", optionObserver);
|
||||
});
|
||||
storage.addObserver("options", optionObserver, window);
|
||||
|
||||
function storePreference(name, value)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
|
||||
|
||||
@@ -236,10 +236,7 @@ function Bookmarks() //{{{
|
||||
};
|
||||
|
||||
var cache = storage.newObject("bookmark-cache", Cache, false);
|
||||
storage.addObserver("bookmark-cache", bookmarkObserver);
|
||||
liberator.registerObserver("shutdown", function () {
|
||||
storage.removeObserver("bookmark-cache", bookmarkObserver);
|
||||
});
|
||||
storage.addObserver("bookmark-cache", bookmarkObserver, window);
|
||||
|
||||
liberator.registerObserver("enter", function () {
|
||||
if (options["preload"])
|
||||
|
||||
Reference in New Issue
Block a user