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