mirror of https://github.com/gorhill/uBlock.git
auto cleanup of listeners
This commit is contained in:
parent
dff1506d85
commit
ea2043c0eb
|
@ -20,7 +20,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* exported uDom */
|
/* exported uDom */
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
@ -32,6 +31,8 @@
|
||||||
|
|
||||||
var uDom = (function() {
|
var uDom = (function() {
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
var DOMList = function() {
|
var DOMList = function() {
|
||||||
|
@ -639,6 +640,24 @@ DOMList.prototype.toggleClasses = function(classNames, targetState) {
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
var listenerEntries = [];
|
||||||
|
|
||||||
|
var ListenerEntry = function(target, type, capture, callback) {
|
||||||
|
this.target = target;
|
||||||
|
this.type = type;
|
||||||
|
this.capture = capture;
|
||||||
|
this.callback = callback;
|
||||||
|
target.addEventListener(type, callback, capture);
|
||||||
|
};
|
||||||
|
|
||||||
|
ListenerEntry.prototype.dispose = function() {
|
||||||
|
this.target.removeEventListener(this.type, this.callback, this.capture);
|
||||||
|
this.target = null;
|
||||||
|
this.callback = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
var makeEventHandler = function(selector, callback) {
|
var makeEventHandler = function(selector, callback) {
|
||||||
return function(event) {
|
return function(event) {
|
||||||
var dispatcher = event.currentTarget;
|
var dispatcher = event.currentTarget;
|
||||||
|
@ -662,7 +681,7 @@ DOMList.prototype.on = function(etype, selector, callback) {
|
||||||
|
|
||||||
var i = this.nodes.length;
|
var i = this.nodes.length;
|
||||||
while ( i-- ) {
|
while ( i-- ) {
|
||||||
this.nodes[i].addEventListener(etype, callback, selector !== undefined);
|
listenerEntries.push(new ListenerEntry(this.nodes[i], etype, selector !== undefined, callback));
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
@ -693,6 +712,20 @@ DOMList.prototype.trigger = function(etype) {
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
|
||||||
|
var onBeforeUnload = function() {
|
||||||
|
var entry;
|
||||||
|
while ( entry = listenerEntries.pop() ) {
|
||||||
|
entry.dispose();
|
||||||
|
}
|
||||||
|
window.removeEventListener('beforeunload', onBeforeUnload);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('beforeunload', onBeforeUnload);
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
return DOMListFactory;
|
return DOMListFactory;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Reference in New Issue