Commit 155d78b3 authored by Jacob Swanner's avatar Jacob Swanner

Unregister event listeners from websock.

Prevents possible memory and event notification leaks when tearing down
connection and reestablishing a new one.
parent fc00821e
...@@ -197,6 +197,7 @@ var RFB; ...@@ -197,6 +197,7 @@ var RFB;
} else { } else {
this._fail("Server disconnected" + msg); this._fail("Server disconnected" + msg);
} }
this._sock.off('close');
}.bind(this)); }.bind(this));
this._sock.on('error', function (e) { this._sock.on('error', function (e) {
Util.Warn("WebSocket on-error event"); Util.Warn("WebSocket on-error event");
...@@ -239,6 +240,9 @@ var RFB; ...@@ -239,6 +240,9 @@ var RFB;
disconnect: function () { disconnect: function () {
this._updateState('disconnect', 'Disconnecting'); this._updateState('disconnect', 'Disconnecting');
this._sock.off('error');
this._sock.off('message');
this._sock.off('open');
}, },
sendPassword: function (passwd) { sendPassword: function (passwd) {
......
...@@ -200,6 +200,10 @@ function Websock() { ...@@ -200,6 +200,10 @@ function Websock() {
}, },
// Event Handlers // Event Handlers
off: function (evt) {
this._eventHandlers[evt] = function () {};
},
on: function (evt, handler) { on: function (evt, handler) {
this._eventHandlers[evt] = handler; this._eventHandlers[evt] = handler;
}, },
......
...@@ -62,6 +62,24 @@ describe('Remote Frame Buffer Protocol Client', function() { ...@@ -62,6 +62,24 @@ describe('Remote Frame Buffer Protocol Client', function() {
expect(client._updateState).to.have.been.calledOnce; expect(client._updateState).to.have.been.calledOnce;
expect(client._updateState).to.have.been.calledWith('disconnect'); 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 () { describe('#sendPassword', function () {
...@@ -1710,6 +1728,14 @@ describe('Remote Frame Buffer Protocol Client', function() { ...@@ -1710,6 +1728,14 @@ describe('Remote Frame Buffer Protocol Client', function() {
expect(client._rfb_state).to.equal('failed'); 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 // error events do nothing
}); });
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment