Skip to content

Commit 625e131

Browse files
authored
DOM: signal support for addEventListener()
Tests for whatwg/dom#919.
1 parent 097305c commit 625e131

File tree

2 files changed

+133
-56
lines changed

2 files changed

+133
-56
lines changed

dom/abort/addEventListenerAbortController.tentative.html

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
'use strict';
2+
3+
test(function() {
4+
let count = 0;
5+
function handler() {
6+
count++;
7+
}
8+
const et = new EventTarget();
9+
const controller = new AbortController();
10+
et.addEventListener('test', handler, { signal: controller.signal });
11+
et.dispatchEvent(new Event('test'));
12+
assert_equals(count, 1, "Adding a signal still adds a listener");
13+
et.dispatchEvent(new Event('test'));
14+
assert_equals(count, 2, "The listener was not added with the once flag");
15+
controller.abort();
16+
et.dispatchEvent(new Event('test'));
17+
assert_equals(count, 2, "Aborting on the controller removes the listener");
18+
et.addEventListener('test', handler, { signal: controller.signal });
19+
et.dispatchEvent(new Event('test'));
20+
assert_equals(count, 2, "Passing an aborted signal never adds the handler");
21+
}, "Passing an AbortSignal to addEventListener options should allow removing a listener");
22+
23+
test(function() {
24+
let count = 0;
25+
function handler() {
26+
count++;
27+
}
28+
const et = new EventTarget();
29+
const controller = new AbortController();
30+
et.addEventListener('test', handler, { signal: controller.signal });
31+
et.removeEventListener('test', handler);
32+
et.dispatchEvent(new Event('test'));
33+
assert_equals(count, 0, "The listener was still removed");
34+
}, "Passing an AbortSignal to addEventListener does not prevent removeEventListener");
35+
36+
test(function() {
37+
let count = 0;
38+
function handler() {
39+
count++;
40+
}
41+
const et = new EventTarget();
42+
const controller = new AbortController();
43+
et.addEventListener('test', handler, { signal: controller.signal, once: true });
44+
controller.abort();
45+
et.dispatchEvent(new Event('test'));
46+
assert_equals(count, 0, "The listener was still removed");
47+
}, "Passing an AbortSignal to addEventListener works with the once flag");
48+
49+
test(function() {
50+
let count = 0;
51+
function handler() {
52+
count++;
53+
}
54+
const et = new EventTarget();
55+
const controller = new AbortController();
56+
et.addEventListener('test', handler, { signal: controller.signal, once: true });
57+
et.removeEventListener('test', handler);
58+
et.dispatchEvent(new Event('test'));
59+
assert_equals(count, 0, "The listener was still removed");
60+
}, "Removing a once listener works with a passed signal");
61+
62+
test(function() {
63+
let count = 0;
64+
function handler() {
65+
count++;
66+
}
67+
const et = new EventTarget();
68+
const controller = new AbortController();
69+
et.addEventListener('first', handler, { signal: controller.signal, once: true });
70+
et.addEventListener('second', handler, { signal: controller.signal, once: true });
71+
controller.abort();
72+
et.dispatchEvent(new Event('first'));
73+
et.dispatchEvent(new Event('second'));
74+
assert_equals(count, 0, "The listener was still removed");
75+
}, "Passing an AbortSignal to multiple listeners");
76+
77+
test(function() {
78+
let count = 0;
79+
function handler() {
80+
count++;
81+
}
82+
const et = new EventTarget();
83+
const controller = new AbortController();
84+
et.addEventListener('test', handler, { signal: controller.signal, capture: true });
85+
controller.abort();
86+
et.dispatchEvent(new Event('test'));
87+
assert_equals(count, 0, "The listener was still removed");
88+
}, "Passing an AbortSignal to addEventListener works with the capture flag");
89+
90+
test(function() {
91+
let count = 0;
92+
function handler() {
93+
count++;
94+
}
95+
const et = new EventTarget();
96+
const controller = new AbortController();
97+
et.addEventListener('test', () => {
98+
controller.abort();
99+
}, { signal: controller.signal });
100+
et.addEventListener('test', handler, { signal: controller.signal });
101+
et.dispatchEvent(new Event('test'));
102+
assert_equals(count, 0, "The listener was still removed");
103+
}, "Aborting from a listener does not call future listeners");
104+
105+
test(function() {
106+
let count = 0;
107+
function handler() {
108+
count++;
109+
}
110+
const et = new EventTarget();
111+
const controller = new AbortController();
112+
et.addEventListener('test', () => {
113+
et.addEventListener('test', handler, { signal: controller.signal });
114+
controller.abort();
115+
}, { signal: controller.signal });
116+
et.dispatchEvent(new Event('test'));
117+
assert_equals(count, 0, "The listener was still removed");
118+
}, "Adding then aborting a listener in another listener does not call it");
119+
120+
test(function() {
121+
const et = new EventTarget();
122+
const ac = new AbortController();
123+
let count = 0;
124+
et.addEventListener('foo', () => {
125+
et.addEventListener('foo', () => {
126+
count++;
127+
if (count > 5) ac.abort();
128+
et.dispatchEvent(new Event('foo'));
129+
}, { signal: ac.signal });
130+
et.dispatchEvent(new Event('foo'));
131+
}, { once: true });
132+
et.dispatchEvent(new Event('foo'));
133+
}, "Aborting from a nested listener should remove it");

0 commit comments

Comments
 (0)