From 1bd93f0c9cdd2118553817bbbea36ecc7d97d0b4 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Fri, 16 Jul 2021 17:20:52 +0200 Subject: [PATCH] [major] Ignore listeners not added with `Websocket#addEventListener()` Make `Websocket.prototype.removeEventListener()` only remove listeners added with `Websocket.prototype.removeEventListener()` and only one at time. --- doc/ws.md | 4 +++- lib/event-target.js | 3 ++- test/websocket.test.js | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) 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) => {