summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Swanner <jacob@jacobswanner.com>2015-01-08 15:25:55 -0500
committerJacob Swanner <jacob@jacobswanner.com>2015-01-08 15:25:55 -0500
commit155d78b39933a396d2555376f4e70f976c30b86d (patch)
treefbe0b0dcc7d5663ea36e88eed00ac1da001ec8e2
parentfc00821eba469641c6c94706726c3d78e46460a2 (diff)
downloadnovnc-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.js4
-rw-r--r--include/websock.js4
-rw-r--r--tests/test.rfb.js26
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
});
});