diff --git a/guacamole-common-js/src/main/webapp/modules/Tunnel.js b/guacamole-common-js/src/main/webapp/modules/Tunnel.js index 508aa4c28..2b1826dde 100644 --- a/guacamole-common-js/src/main/webapp/modules/Tunnel.js +++ b/guacamole-common-js/src/main/webapp/modules/Tunnel.js @@ -54,6 +54,25 @@ Guacamole.Tunnel = function() { */ this.sendMessage = function(elements) {}; + /** + * Changes the stored numeric state of this tunnel, firing the onstatechange + * event if the new state is different and a handler has been defined. + * + * @private + * @param {Number} state + * The new state of this tunnel. + */ + this.setState = function(state) { + + // Notify only if state changes + if (state !== this.state) { + this.state = state; + if (this.onstatechange) + this.onstatechange(state); + } + + }; + /** * The current state of this tunnel. * @@ -239,14 +258,11 @@ Guacamole.HTTPTunnel = function(tunnelURL, crossDomain) { } - // Mark as closed - tunnel.state = Guacamole.Tunnel.State.CLOSED; - // Reset output message buffer sendingMessages = false; - if (tunnel.onstatechange) - tunnel.onstatechange(tunnel.state); + // Mark as closed + tunnel.setState(Guacamole.Tunnel.State.CLOSED); } @@ -548,6 +564,9 @@ Guacamole.HTTPTunnel = function(tunnelURL, crossDomain) { // Start waiting for connect reset_timeout(); + // Mark the tunnel as connecting + tunnel.setState(Guacamole.Tunnel.State.CONNECTING); + // Start tunnel and connect var connect_xmlhttprequest = new XMLHttpRequest(); connect_xmlhttprequest.onreadystatechange = function() { @@ -566,9 +585,8 @@ Guacamole.HTTPTunnel = function(tunnelURL, crossDomain) { // Get UUID from response tunnel.uuid = connect_xmlhttprequest.responseText; - tunnel.state = Guacamole.Tunnel.State.OPEN; - if (tunnel.onstatechange) - tunnel.onstatechange(tunnel.state); + // Mark as open + tunnel.setState(Guacamole.Tunnel.State.OPEN); // Start reading data handleResponse(makeRequest()); @@ -698,9 +716,7 @@ Guacamole.WebSocketTunnel = function(tunnelURL) { tunnel.onerror(status); // Mark as closed - tunnel.state = Guacamole.Tunnel.State.CLOSED; - if (tunnel.onstatechange) - tunnel.onstatechange(tunnel.state); + tunnel.setState(Guacamole.Tunnel.State.CLOSED); socket.close(); @@ -747,6 +763,9 @@ Guacamole.WebSocketTunnel = function(tunnelURL) { reset_timeout(); + // Mark the tunnel as connecting + tunnel.setState(Guacamole.Tunnel.State.CONNECTING); + // Connect socket socket = new WebSocket(tunnelURL + "?" + data, "guacamole"); @@ -814,9 +833,7 @@ Guacamole.WebSocketTunnel = function(tunnelURL) { tunnel.uuid = elements[0]; // Tunnel is now open and UUID is available - tunnel.state = Guacamole.Tunnel.State.OPEN; - if (tunnel.onstatechange) - tunnel.onstatechange(tunnel.state); + tunnel.setState(Guacamole.Tunnel.State.OPEN); } @@ -1059,25 +1076,6 @@ Guacamole.StaticHTTPTunnel = function StaticHTTPTunnel(url, crossDomain) { */ var xhr = null; - /** - * Changes the stored numeric state of this tunnel, firing the onstatechange - * event if the new state is different and a handler has been defined. - * - * @private - * @param {Number} state - * The new state of this tunnel. - */ - var setState = function setState(state) { - - // Notify only if state changes - if (state !== tunnel.state) { - tunnel.state = state; - if (tunnel.onstatechange) - tunnel.onstatechange(state); - } - - }; - /** * Returns the Guacamole protocol status code which most closely * represents the given HTTP status code. @@ -1133,7 +1131,7 @@ Guacamole.StaticHTTPTunnel = function StaticHTTPTunnel(url, crossDomain) { tunnel.disconnect(); // Connection is now starting - setState(Guacamole.Tunnel.State.CONNECTING); + tunnel.setState(Guacamole.Tunnel.State.CONNECTING); // Start a new connection xhr = new XMLHttpRequest(); @@ -1160,7 +1158,7 @@ Guacamole.StaticHTTPTunnel = function StaticHTTPTunnel(url, crossDomain) { if (xhr.readyState === 3 || xhr.readyState === 4) { // Connection is open - setState(Guacamole.Tunnel.State.OPEN); + tunnel.setState(Guacamole.Tunnel.State.OPEN); var buffer = xhr.responseText; var length = buffer.length; @@ -1200,7 +1198,7 @@ Guacamole.StaticHTTPTunnel = function StaticHTTPTunnel(url, crossDomain) { } // Connection is now closed - setState(Guacamole.Tunnel.State.CLOSED); + tunnel.setState(Guacamole.Tunnel.State.CLOSED); };