mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-03-08 05:35:46 +01:00
Refactor storage observers to be less dodgy and stupid.
This commit is contained in:
@@ -185,8 +185,10 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
|
|
||||||
setData: function setData(obj, key, val) {
|
setData: function setData(obj, key, val) {
|
||||||
let data = this.getData(obj);
|
let data = this.getData(obj);
|
||||||
|
if (val !== undefined)
|
||||||
|
return data[key] = val;
|
||||||
|
|
||||||
return data[key] = val;
|
delete data[key];
|
||||||
},
|
},
|
||||||
|
|
||||||
overlayWindow: function overlayWindow(url, fn) {
|
overlayWindow: function overlayWindow(url, fn) {
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ var Storage = Module("Storage", {
|
|||||||
if (!Services.dactylSession)
|
if (!Services.dactylSession)
|
||||||
Services.dactylSession = Cu.createObjectIn(sessionGlobal);
|
Services.dactylSession = Cu.createObjectIn(sessionGlobal);
|
||||||
this.session = Services.dactylSession;
|
this.session = Services.dactylSession;
|
||||||
|
this.windows = WeakMap();
|
||||||
},
|
},
|
||||||
|
|
||||||
cleanup: function () {
|
cleanup: function () {
|
||||||
@@ -287,60 +288,33 @@ var Storage = Module("Storage", {
|
|||||||
return this.newObject(key, ArrayStore, update({ type: Array }, options));
|
return this.newObject(key, ArrayStore, update({ type: Array }, options));
|
||||||
},
|
},
|
||||||
|
|
||||||
addObserver: function addObserver(key, callback, ref) {
|
get observerMaps() {
|
||||||
if (ref) {
|
yield this.observers;
|
||||||
let refs = overlay.getData(ref, "storage-refs");
|
for (let window of overlay.windows)
|
||||||
refs.push(callback);
|
yield overlay.getData(window, "storage-observers", Object);
|
||||||
var callbackRef = util.weakReference(callback);
|
},
|
||||||
}
|
|
||||||
else {
|
|
||||||
callbackRef = { get: function () callback };
|
|
||||||
}
|
|
||||||
|
|
||||||
this.removeDeadObservers();
|
addObserver: function addObserver(key, callback, window) {
|
||||||
|
var { observers } = this;
|
||||||
|
if (window)
|
||||||
|
observers = overlay.getData(window, "storage-observers", Object);
|
||||||
|
|
||||||
if (!(key in this.observers))
|
if (!hasOwnProperty(observers, key))
|
||||||
this.observers[key] = [];
|
observers[key] = RealSet();
|
||||||
|
|
||||||
if (!this.observers[key].some(o => o.callback.get() == callback))
|
observers[key].add(callback);
|
||||||
this.observers[key].push({ ref: ref && Cu.getWeakReference(ref),
|
|
||||||
callback: callbackRef });
|
|
||||||
},
|
},
|
||||||
|
|
||||||
removeObserver: function (key, callback) {
|
removeObserver: function (key, callback) {
|
||||||
this.removeDeadObservers();
|
for (let observers in this.observerMaps)
|
||||||
|
if (key in observers)
|
||||||
if (!(key in this.observers))
|
observers[key].remove(callback);
|
||||||
return;
|
|
||||||
|
|
||||||
this.observers[key] = this.observers[key].filter(elem => elem.callback.get() != callback);
|
|
||||||
if (this.observers[key].length == 0)
|
|
||||||
delete obsevers[key];
|
|
||||||
},
|
|
||||||
|
|
||||||
removeDeadObservers: function () {
|
|
||||||
function filter(o) {
|
|
||||||
if (!o.callback.get())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let ref = o.ref && o.ref.get();
|
|
||||||
return ref && !ref.closed && overlay.getData(ref, "storage-refs", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let [key, ary] in Iterator(this.observers)) {
|
|
||||||
this.observers[key] = ary = ary.filter(filter);
|
|
||||||
if (!ary.length)
|
|
||||||
delete this.observers[key];
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
fireEvent: function fireEvent(key, event, arg) {
|
fireEvent: function fireEvent(key, event, arg) {
|
||||||
this.removeDeadObservers();
|
for (let observers in this.observerMaps)
|
||||||
|
for (let observer of observers[key] || [])
|
||||||
if (key in this.observers)
|
observer(key, event, arg);
|
||||||
// Safe, since we have our own Array object here.
|
|
||||||
for each (let observer in this.observers[key])
|
|
||||||
observer.callback.get()(key, event, arg);
|
|
||||||
|
|
||||||
if (key in this.keys && this.keys[key].timer)
|
if (key in this.keys && this.keys[key].timer)
|
||||||
this[key].timer.tell();
|
this[key].timer.tell();
|
||||||
@@ -392,8 +366,7 @@ var Storage = Module("Storage", {
|
|||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
cleanup: function (dactyl, modules, window) {
|
cleanup: function (dactyl, modules, window) {
|
||||||
overlay.setData(window, "storage-refs", null);
|
overlay.setData(window, "storage-callbacks", undefined);
|
||||||
this.removeDeadObservers();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user