Merge pull request #10032 from ahocevar/safe-listener-removal

Do not remove listeners that do not exist
This commit is contained in:
Andreas Hocevar
2019-09-26 19:35:02 +02:00
committed by GitHub
2 changed files with 14 additions and 12 deletions
+10 -11
View File
@@ -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];
}
} }
} }
} }
+4 -1
View File
@@ -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]);
}); });
}); });