events: fix TypeError in removeAllListeners
authorJeremy Martin <jmar777@gmail.com>
Fri, 22 Nov 2013 14:17:16 +0000 (09:17 -0500)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 22 Nov 2013 16:42:34 +0000 (17:42 +0100)
Check that `listeners` is actually an array before trying to manipulate it
because it won't be if no regular event listeners have been registered yet
but there are 'removeListener' event listeners.

lib/events.js
test/simple/test-event-emitter-remove-all-listeners.js

index f43df09..781748b 100644 (file)
@@ -263,7 +263,7 @@ EventEmitter.prototype.removeAllListeners = function(type) {
 
   if (typeof listeners === 'function') {
     this.removeListener(type, listeners);
-  } else {
+  } else if (Array.isArray(listeners)) {
     // LIFO order
     while (listeners.length)
       this.removeListener(type, listeners[listeners.length - 1]);
index 2cd31eb..f9848d6 100644 (file)
@@ -71,3 +71,10 @@ e2.removeAllListeners();
 console.error(e2);
 assert.deepEqual([], e2.listeners('foo'));
 assert.deepEqual([], e2.listeners('bar'));
+
+var e3 = new events.EventEmitter();
+e3.on('removeListener', listener);
+// check for regression where removeAllListeners throws when
+// there exists a removeListener listener, but there exists
+// no listeners for the provided event type
+assert.doesNotThrow(e3.removeAllListeners.bind(e3, 'foo'));