diff options
author | Jacob Swanner <jacob@jacobswanner.com> | 2015-01-08 15:25:55 -0500 |
---|---|---|
committer | Jacob Swanner <jacob@jacobswanner.com> | 2015-01-08 15:25:55 -0500 |
commit | 155d78b39933a396d2555376f4e70f976c30b86d (patch) | |
tree | fbe0b0dcc7d5663ea36e88eed00ac1da001ec8e2 | |
parent | fc00821eba469641c6c94706726c3d78e46460a2 (diff) | |
download | novnc-155d78b39933a396d2555376f4e70f976c30b86d.tar.gz |
Unregister event listeners from websock.
Prevents possible memory and event notification leaks when tearing down
connection and reestablishing a new one.
-rw-r--r-- | include/rfb.js | 4 | ||||
-rw-r--r-- | include/websock.js | 4 | ||||
-rw-r--r-- | tests/test.rfb.js | 26 |
3 files changed, 34 insertions, 0 deletions
diff --git a/include/rfb.js b/include/rfb.js index 59fd785..f461aff 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -197,6 +197,7 @@ var RFB; } else { this._fail("Server disconnected" + msg); } + this._sock.off('close'); }.bind(this)); this._sock.on('error', function (e) { Util.Warn("WebSocket on-error event"); @@ -239,6 +240,9 @@ var RFB; disconnect: function () { this._updateState('disconnect', 'Disconnecting'); + this._sock.off('error'); + this._sock.off('message'); + this._sock.off('open'); }, sendPassword: function (passwd) { diff --git a/include/websock.js b/include/websock.js index 1b89a91..cc82e5a 100644 --- a/include/websock.js +++ b/include/websock.js @@ -200,6 +200,10 @@ function Websock() { }, // Event Handlers + off: function (evt) { + this._eventHandlers[evt] = function () {}; + }, + on: function (evt, handler) { this._eventHandlers[evt] = handler; }, diff --git a/tests/test.rfb.js b/tests/test.rfb.js index d80e3d5..d777a86 100644 --- a/tests/test.rfb.js +++ b/tests/test.rfb.js @@ -62,6 +62,24 @@ describe('Remote Frame Buffer Protocol Client', function() { expect(client._updateState).to.have.been.calledOnce; expect(client._updateState).to.have.been.calledWith('disconnect'); }); + + it('should unregister error event handler', function () { + sinon.spy(client._sock, 'off'); + client.disconnect(); + expect(client._sock.off).to.have.been.calledWith('error'); + }); + + it('should unregister message event handler', function () { + sinon.spy(client._sock, 'off'); + client.disconnect(); + expect(client._sock.off).to.have.been.calledWith('message'); + }); + + it('should unregister open event handler', function () { + sinon.spy(client._sock, 'off'); + client.disconnect(); + expect(client._sock.off).to.have.been.calledWith('open'); + }); }); describe('#sendPassword', function () { @@ -1710,6 +1728,14 @@ describe('Remote Frame Buffer Protocol Client', function() { expect(client._rfb_state).to.equal('failed'); }); + it('should unregister close event handler', function () { + sinon.spy(client._sock, 'off'); + client.connect('host', 8675); + client._rfb_state = 'disconnect'; + client._sock._websocket.close(); + expect(client._sock.off).to.have.been.calledWith('close'); + }); + // error events do nothing }); }); |