From 78dc13fbf97e2e3003e6f3baacdd5ff60e8de3f7 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 16 Mar 2012 00:18:50 +0100 Subject: [PATCH] events: don't delete the listeners array The documentation implies that .removeAllListeners() leaves the listeners array untouched. Make it so. --- lib/events.js | 11 +++++++++-- test/simple/test-event-emitter-remove-all-listeners.js | 10 +++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/events.js b/lib/events.js index 1fff1e3..69e29ea 100644 --- a/lib/events.js +++ b/lib/events.js @@ -203,8 +203,15 @@ EventEmitter.prototype.removeAllListeners = function(type) { return this; } - // does not use listeners(), so no side effect of creating _events[type] - if (type && this._events && this._events[type]) this._events[type] = null; + var events = this._events && this._events[type]; + if (!events) return this; + + if (isArray(events)) { + events.splice(0); + } else { + this._events[type] = null; + } + return this; }; diff --git a/test/simple/test-event-emitter-remove-all-listeners.js b/test/simple/test-event-emitter-remove-all-listeners.js index f5676f4..39e6468 100644 --- a/test/simple/test-event-emitter-remove-all-listeners.js +++ b/test/simple/test-event-emitter-remove-all-listeners.js @@ -29,10 +29,14 @@ function listener() {} var e1 = new events.EventEmitter(); e1.on('foo', listener); e1.on('bar', listener); +var fooListeners = e1.listeners('foo'); +var barListeners = e1.listeners('bar'); e1.removeAllListeners('foo'); -assert.deepEqual([], e1.listeners('foo')); -assert.deepEqual([listener], e1.listeners('bar')); - +assert.deepEqual(e1.listeners('foo'), []); +assert.deepEqual(e1.listeners('bar'), [listener]); +// identity check, the array should not change +assert.equal(e1.listeners('foo'), fooListeners); +assert.equal(e1.listeners('bar'), barListeners); var e2 = new events.EventEmitter(); e2.on('foo', listener); -- 2.7.4