[EventTarget] Abort controller from a past subscription can remove events from future subscriptions #1346
Description
What is the issue with the DOM Standard?
The addEventListener
method for the EventTarget
interface includes a step to add an abort step to remove the subscription: https://dom.spec.whatwg.org/#add-an-event-listener.
In the removeEventListener
method (in the same interface) there is no step to remove the previous abort step (https://dom.spec.whatwg.org/#remove-an-event-listener), which means that the abort controller will still try to remove the listener when aborted, even if the previous listener was removed.
That can cause the abort controller to remove subscriptions where we abort controller itself was not used.
Example (which works according to the step and can be reproduced in browsers like Google Chrome):
/*
* Setup
*/
const eventTarget = new EventTarget();
const callback = (event) => console.log('Event was called');
const abortController = new AbortController();
/*
* Previous subscription
*/
eventTarget.addEventListener('customEvent', callback, {signal: abortController.signal});
eventTarget.dispatchEvent(new CustomEvent('customEvent'));
// console logs "Event was called", as expected
eventTarget.removeEventListener('customEvent', callback);
eventTarget.dispatchEvent(new CustomEvent('customEvent'));
// console does NOT log "Event was called", as expected
/*
* New subscription
*/
// Note that we did NOT use a signal
eventTarget.addEventListener('customEvent', callback);
eventTarget.dispatchEvent(new CustomEvent('customEvent'));
// console logs "Event was called", as expected
// Aborting the controller that is not used in this subscription
abortController.abort();
eventTarget.dispatchEvent(new CustomEvent('customEvent'));
// console does NOT log "Event was called" (not as expected?)
This behavior does not match user expectations. Is it a bug in the specification, followed by implementers? Is this something that can be fixed at this point?
Thanks.