Merge pull request #10032 from ahocevar/safe-listener-removal
Do not remove listeners that do not exist
This commit is contained in:
+10
-11
@@ -149,20 +149,19 @@ class Target extends Disposable {
|
|||||||
* @param {import("../events.js").ListenerFunction} listener Listener.
|
* @param {import("../events.js").ListenerFunction} listener Listener.
|
||||||
*/
|
*/
|
||||||
removeEventListener(type, listener) {
|
removeEventListener(type, listener) {
|
||||||
if (!type || !listener) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const listeners = this.listeners_[type];
|
const listeners = this.listeners_[type];
|
||||||
if (listeners) {
|
if (listeners) {
|
||||||
const index = listeners.indexOf(listener);
|
const index = listeners.indexOf(listener);
|
||||||
if (type in this.pendingRemovals_) {
|
if (index !== -1) {
|
||||||
// make listener a no-op, and remove later in #dispatchEvent()
|
if (type in this.pendingRemovals_) {
|
||||||
listeners[index] = VOID;
|
// make listener a no-op, and remove later in #dispatchEvent()
|
||||||
++this.pendingRemovals_[type];
|
listeners[index] = VOID;
|
||||||
} else {
|
++this.pendingRemovals_[type];
|
||||||
listeners.splice(index, 1);
|
} else {
|
||||||
if (listeners.length === 0) {
|
listeners.splice(index, 1);
|
||||||
delete this.listeners_[type];
|
if (listeners.length === 0) {
|
||||||
|
delete this.listeners_[type];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,9 +64,12 @@ describe('ol.events.EventTarget', function() {
|
|||||||
eventTarget.removeEventListener('foo', spy1, false);
|
eventTarget.removeEventListener('foo', spy1, false);
|
||||||
expect(eventTarget.listeners_['foo']).to.have.length(1);
|
expect(eventTarget.listeners_['foo']).to.have.length(1);
|
||||||
});
|
});
|
||||||
it('does nothing when called with undefined listener', function() {
|
it('does not remove listeners when the specified listener is not found', function() {
|
||||||
eventTarget.addEventListener('foo', spy1);
|
eventTarget.addEventListener('foo', spy1);
|
||||||
|
eventTarget.addEventListener('foo', spy2);
|
||||||
eventTarget.removeEventListener('foo', undefined);
|
eventTarget.removeEventListener('foo', undefined);
|
||||||
|
eventTarget.removeEventListener('foo', spy2);
|
||||||
|
eventTarget.removeEventListener('foo', spy2);
|
||||||
expect(eventTarget.listeners_['foo']).to.eql([spy1]);
|
expect(eventTarget.listeners_['foo']).to.eql([spy1]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user