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