test_eventemitter_abort_controller.js (6084B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const EventEmitter = require("resource://devtools/shared/event-emitter.js"); 7 8 add_task(function testAbortSingleListener() { 9 // Test a simple case with AbortController 10 info("Create an EventEmitter"); 11 const emitter = new EventEmitter(); 12 const abortController = new AbortController(); 13 const { signal } = abortController; 14 15 info("Setup an event listener on test-event, controlled by an AbortSignal"); 16 let eventsReceived = 0; 17 emitter.on("test-event", () => eventsReceived++, { signal }); 18 19 info("Emit test-event"); 20 emitter.emit("test-event"); 21 equal(eventsReceived, 1, "We received one event, as expected"); 22 23 info("Abort the AbortController…"); 24 abortController.abort(); 25 info("… and emit test-event again"); 26 emitter.emit("test-event"); 27 equal(eventsReceived, 1, "We didn't receive new event after aborting"); 28 }); 29 30 add_task(function testAbortSingleListenerOnce() { 31 // Test a simple case with AbortController and once 32 info("Create an EventEmitter"); 33 const emitter = new EventEmitter(); 34 const abortController = new AbortController(); 35 const { signal } = abortController; 36 37 info("Setup an event listener on test-event, controlled by an AbortSignal"); 38 let eventReceived = false; 39 emitter.once( 40 "test-event", 41 () => { 42 eventReceived = true; 43 }, 44 { signal } 45 ); 46 47 info("Abort the AbortController…"); 48 abortController.abort(); 49 info("… and emit test-event"); 50 emitter.emit("test-event"); 51 equal(eventReceived, false, "We didn't receive the event after aborting"); 52 }); 53 54 add_task(function testAbortMultipleListener() { 55 // Test aborting multiple event listeners with one call to abort 56 info("Create an EventEmitter"); 57 const emitter = new EventEmitter(); 58 const abortController = new AbortController(); 59 const { signal } = abortController; 60 61 info("Setup 3 event listeners controlled by an AbortSignal"); 62 let eventsReceived = 0; 63 emitter.on("test-event", () => eventsReceived++, { signal }); 64 emitter.on("test-event", () => eventsReceived++, { signal }); 65 emitter.on("other-test-event", () => eventsReceived++, { signal }); 66 67 info("Emit test-event and other-test-event"); 68 emitter.emit("test-event"); 69 emitter.emit("other-test-event"); 70 equal(eventsReceived, 3, "We received 3 events, as expected"); 71 72 info("Abort the AbortController…"); 73 abortController.abort(); 74 info("… and emit events again"); 75 emitter.emit("test-event"); 76 emitter.emit("other-test-event"); 77 equal(eventsReceived, 3, "We didn't receive new event after aborting"); 78 }); 79 80 add_task(function testAbortMultipleEmitter() { 81 // Test aborting multiple event listeners on different emitters with one call to abort 82 info("Create 2 EventEmitter"); 83 const emitter1 = new EventEmitter(); 84 const emitter2 = new EventEmitter(); 85 const abortController = new AbortController(); 86 const { signal } = abortController; 87 88 info("Setup 2 event listeners on test-event, controlled by an AbortSignal"); 89 let eventsReceived = 0; 90 emitter1.on("test-event", () => eventsReceived++, { signal }); 91 emitter2.on("other-test-event", () => eventsReceived++, { signal }); 92 93 info("Emit test-event and other-test-event"); 94 emitter1.emit("test-event"); 95 emitter2.emit("other-test-event"); 96 equal(eventsReceived, 2, "We received 2 events, as expected"); 97 98 info("Abort the AbortController…"); 99 abortController.abort(); 100 info("… and emit events again"); 101 emitter1.emit("test-event"); 102 emitter2.emit("other-test-event"); 103 equal(eventsReceived, 2, "We didn't receive new event after aborting"); 104 }); 105 106 add_task(function testAbortBeforeEmitting() { 107 // Check that aborting before emitting does unregister the event listener 108 info("Create an EventEmitter"); 109 const emitter = new EventEmitter(); 110 const abortController = new AbortController(); 111 const { signal } = abortController; 112 113 info("Setup an event listener on test-event, controlled by an AbortSignal"); 114 let eventsReceived = 0; 115 emitter.on("test-event", () => eventsReceived++, { signal }); 116 117 info("Abort the AbortController…"); 118 abortController.abort(); 119 120 info("… and emit test-event"); 121 emitter.emit("test-event"); 122 equal(eventsReceived, 0, "We didn't receive any event"); 123 }); 124 125 add_task(function testAbortBeforeSettingListener() { 126 // Check that aborting before creating the event listener won't register it 127 info("Create an EventEmitter"); 128 const emitter = new EventEmitter(); 129 130 info("Create an AbortController and abort it immediately"); 131 const abortController = new AbortController(); 132 const { signal } = abortController; 133 abortController.abort(); 134 135 info( 136 "Setup an event listener on test-event, controlled by the aborted AbortSignal" 137 ); 138 let eventsReceived = 0; 139 const off = emitter.on("test-event", () => eventsReceived++, { signal }); 140 141 info("Emit test-event"); 142 emitter.emit("test-event"); 143 equal(eventsReceived, 0, "We didn't receive any event"); 144 145 equal(typeof off, "function", "emitter.on still returned a function"); 146 // check that calling off does not throw 147 off(); 148 }); 149 150 add_task(function testAbortAfterEventListenerIsRemoved() { 151 // Check that aborting after there's no more event listener does not throw 152 info("Create an EventEmitter"); 153 const emitter = new EventEmitter(); 154 155 const abortController = new AbortController(); 156 const { signal } = abortController; 157 158 info( 159 "Setup an event listener on test-event, controlled by the aborted AbortSignal" 160 ); 161 let eventsReceived = 0; 162 const off = emitter.on("test-event", () => eventsReceived++, { signal }); 163 164 info("Emit test-event"); 165 emitter.emit("test-event"); 166 equal(eventsReceived, 1, "We received the expected event"); 167 168 info("Remove the event listener with the function returned by `on`"); 169 off(); 170 171 info("Emit test-event a second time"); 172 emitter.emit("test-event"); 173 equal( 174 eventsReceived, 175 1, 176 "We didn't receive new event after removing the event listener" 177 ); 178 179 info("Abort to check it doesn't throw"); 180 abortController.abort(); 181 });