• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3test(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
23test(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
36test(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
49test(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
62test(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
77test(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
90test(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
105test(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
120test(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");
134
135test(function() {
136  const et = new EventTarget();
137  assert_throws_js(TypeError, () => { et.addEventListener("foo", () => {}, { signal: null }); });
138}, "Passing null as the signal should throw");
139
140test(function() {
141  const et = new EventTarget();
142  assert_throws_js(TypeError, () => { et.addEventListener("foo", null, { signal: null }); });
143}, "Passing null as the signal should throw (listener is also null)");
144