diff --git a/doc/ws.md b/doc/ws.md index 110980816..d657ceeee 100644 --- a/doc/ws.md +++ b/doc/ws.md @@ -476,7 +476,9 @@ The current state of the connection. This is one of the ready state constants. - `type` {String} A string representing the event type to remove. - `listener` {Function} The listener to remove. -Removes an event listener emulating the `EventTarget` interface. +Removes an event listener emulating the `EventTarget` interface. This method +only removes listeners added with +[`websocket.addEventListener()`](#websocketaddeventlistenertype-listener-options). ### websocket.send(data[, options][, callback]) diff --git a/lib/event-target.js b/lib/event-target.js index 6987d5b5c..7230a2081 100644 --- a/lib/event-target.js +++ b/lib/event-target.js @@ -173,8 +173,9 @@ const EventTarget = { */ removeEventListener(type, handler) { for (const listener of this.listeners(type)) { - if (listener === handler || listener[kListener] === handler) { + if (listener[kListener] === handler) { this.removeListener(type, listener); + break; } } } diff --git a/test/websocket.test.js b/test/websocket.test.js index e409e8fca..1af00252b 100644 --- a/test/websocket.test.js +++ b/test/websocket.test.js @@ -2233,6 +2233,30 @@ describe('WebSocket', () => { assert.strictEqual(ws.listenerCount('message'), 0); assert.strictEqual(ws.listenerCount('open'), 0); + + // Multiple listeners. + ws.addEventListener('message', NOOP); + ws.addEventListener('message', NOOP); + + assert.strictEqual(ws.listeners('message')[0][kListener], NOOP); + assert.strictEqual(ws.listeners('message')[1][kListener], NOOP); + + ws.removeEventListener('message', NOOP); + + assert.strictEqual(ws.listeners('message')[0][kListener], NOOP); + + ws.removeEventListener('message', NOOP); + + assert.strictEqual(ws.listenerCount('message'), 0); + + // Listeners not added with `websocket.addEventListener()`. + ws.on('message', NOOP); + + assert.deepStrictEqual(ws.listeners('message'), [NOOP]); + + ws.removeEventListener('message', NOOP); + + assert.deepStrictEqual(ws.listeners('message'), [NOOP]); }); it('wraps text data in a `MessageEvent`', (done) => {