Commit 250dabb9 authored by Joey Arhar's avatar Joey Arhar Committed by Commit Bot

Fix AbortSignal in addEventListener for capture

AbortSignal doesn't remove the event listener if it was registered with
capture: true in addEventListener.
This patch fixes it by plumbing through the options to
removeEventListener.

Fixed: 1149047
Change-Id: Iccafee46277880088634828fc9c9310388044a1d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2538368Reviewed-by: default avatarMason Freed <masonfreed@chromium.org>
Commit-Queue: Joey Arhar <jarhar@chromium.org>
Auto-Submit: Joey Arhar <jarhar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827912}
parent 5b9af220
......@@ -536,10 +536,13 @@ bool EventTarget::AddEventListenerInternal(
if (options->signal()) {
options->signal()->AddAlgorithm(WTF::Bind(
[](EventTarget* event_target, const AtomicString& event_type,
const EventListener* listener) {
event_target->removeEventListener(event_type, listener);
const EventListener* listener,
AddEventListenerOptionsResolved* options) {
event_target->removeEventListener(event_type, listener, options);
},
WrapWeakPersistent(this), event_type, WrapWeakPersistent(listener)));
WrapWeakPersistent(this), event_type, WrapWeakPersistent(listener),
WrapPersistent(
MakeGarbageCollected<AddEventListenerOptionsResolved>(options))));
if (const LocalDOMWindow* executing_window = ExecutingWindow()) {
if (const Document* document = executing_window->document()) {
document->CountUse(WebFeature::kAddEventListenerWithAbortSignal);
......
......@@ -21,4 +21,16 @@ test(t => {
controller.abort();
target.dispatchEvent(new Event('testevent'));
}, 'Tests support for EventController to cancel event listeners in addEventListener.');
test(t => {
const target = new EventTarget();
const controller = new AbortController();
target.addEventListener('testevent', t.step_func(() => {
assert_unreached('testevent should have been canceled by AbortController');
}), {signal: controller.signal, capture: true});
controller.abort();
target.dispatchEvent(new Event('testevent'));
}, 'Tests support for EventController to cancel capture event listeners in addEventListener.');
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment