Index: remoting/webapp/me2mom/client_session.js |
diff --git a/remoting/webapp/me2mom/client_session.js b/remoting/webapp/me2mom/client_session.js |
index 2b566e337a5b45facddf8f1ace616213564afd1f..e862afa97ffbc38ab7219acdb0fab7a92092a0b3 100644 |
--- a/remoting/webapp/me2mom/client_session.js |
+++ b/remoting/webapp/me2mom/client_session.js |
@@ -22,10 +22,9 @@ var remoting = remoting || {}; |
* public key. |
* @param {string} accessCode The access code for the IT2Me connection. |
* @param {string} email The username for the talk network. |
- * @param {function(remoting.ClientSession.State):void} onStateChange |
- * The callback to invoke when the session changes state. This callback |
- * occurs after the state changes and is passed the previous state; the |
- * new state is accessible via ClientSession's |state| property. |
+ * @param {function(remoting.ClientSession.State, |
+ remoting.ClientSession.State):void} onStateChange |
+ * The callback to invoke when the session changes state. |
* @constructor |
*/ |
remoting.ClientSession = function(hostJid, hostPublicKey, accessCode, email, |
@@ -43,17 +42,21 @@ remoting.ClientSession = function(hostJid, hostPublicKey, accessCode, email, |
this.onStateChange = onStateChange; |
}; |
+// Note that the positive values in both of these enums are copied directly |
+// from chromoting_scriptable_object.h and must be kept in sync. The negative |
+// values represent states transitions that occur within the web-app that have |
+// no corresponding plugin state transition. |
/** @enum {number} */ |
remoting.ClientSession.State = { |
+ CREATED: -3, |
+ BAD_PLUGIN_VERSION: -2, |
+ UNKNOWN_PLUGIN_ERROR: -1, |
UNKNOWN: 0, |
- CREATED: 1, |
- BAD_PLUGIN_VERSION: 2, |
- UNKNOWN_PLUGIN_ERROR: 3, |
- CONNECTING: 4, |
- INITIALIZING: 5, |
- CONNECTED: 6, |
- CLOSED: 7, |
- CONNECTION_FAILED: 8 |
+ CONNECTING: 1, |
+ INITIALIZING: 2, |
+ CONNECTED: 3, |
+ CLOSED: 4, |
+ CONNECTION_FAILED: 5 |
}; |
/** @enum {number} */ |
@@ -62,8 +65,7 @@ remoting.ClientSession.ConnectionError = { |
HOST_IS_OFFLINE: 1, |
SESSION_REJECTED: 2, |
INCOMPATIBLE_PROTOCOL: 3, |
- NETWORK_FAILURE: 4, |
- OTHER: 5 |
+ NETWORK_FAILURE: 4 |
}; |
/** |
@@ -119,9 +121,11 @@ remoting.ClientSession.prototype.PLUGIN_ID = 'session-client-plugin'; |
/** |
* Callback to invoke when the state is changed. |
* |
- * @param {remoting.ClientSession.State} state The previous state. |
+ * @param {remoting.ClientSession.State} oldState The previous state. |
+ * @param {remoting.ClientSession.State} newState The current state. |
*/ |
-remoting.ClientSession.prototype.onStateChange = function(state) { }; |
+remoting.ClientSession.prototype.onStateChange = |
+ function(oldState, newState) { }; |
/** |
* Adds <embed> element to |container| and readies the sesion object. |
@@ -159,8 +163,12 @@ remoting.ClientSession.prototype.createPluginAndConnect = |
// TODO(ajwong): Is it even worth having this class handle these events? |
// Or would it be better to just allow users to pass in their own handlers |
// and leave these blank by default? |
- this.plugin.connectionInfoUpdate = function() { |
- that.connectionInfoUpdateCallback(); |
+ /** |
+ * @param {number} status The plugin status. |
+ * @param {number} error The plugin error status, if any. |
+ */ |
+ this.plugin.connectionInfoUpdate = function(status, error) { |
+ that.connectionInfoUpdateCallback(status, error); |
}; |
this.plugin.desktopSizeUpdate = function() { that.onDesktopSizeChanged_(); }; |
@@ -290,49 +298,39 @@ remoting.ClientSession.prototype.connectPluginToWcs_ = |
/** |
* Callback that the plugin invokes to indicate that the connection |
* status has changed. |
+ * |
+ * @param {number} status The plugin's status. |
+ * @param {number} error The plugin's error state, if any. |
*/ |
-remoting.ClientSession.prototype.connectionInfoUpdateCallback = function() { |
- var state = this.plugin.status; |
- |
- // TODO(ajwong): We're doing silly type translation here. Any way to avoid? |
- if (state == this.plugin.STATUS_UNKNOWN) { |
- this.setState_(remoting.ClientSession.State.UNKNOWN); |
- } else if (state == this.plugin.STATUS_CONNECTING) { |
- this.setState_(remoting.ClientSession.State.CONNECTING); |
- } else if (state == this.plugin.STATUS_INITIALIZING) { |
- this.setState_(remoting.ClientSession.State.INITIALIZING); |
- } else if (state == this.plugin.STATUS_CONNECTED) { |
+remoting.ClientSession.prototype.connectionInfoUpdateCallback = |
+ function(status, error) { |
+ // Old plugins didn't pass the status and error values, so get them directly. |
+ // Note that there is a race condition inherent in this approach. |
+ if (typeof(status) == 'undefined') { |
+ status = this.plugin.status; |
+ } |
+ if (typeof(error) == 'undefined') { |
+ error = this.plugin.error; |
+ } |
+ |
+ if (status == this.plugin.STATUS_CONNECTED) { |
this.onDesktopSizeChanged_(); |
- this.setState_(remoting.ClientSession.State.CONNECTED); |
- } else if (state == this.plugin.STATUS_CLOSED) { |
- this.setState_(remoting.ClientSession.State.CLOSED); |
- } else if (state == this.plugin.STATUS_FAILED) { |
- var error = this.plugin.error; |
- if (error == this.plugin.ERROR_HOST_IS_OFFLINE) { |
- this.error = remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE; |
- } else if (error == this.plugin.ERROR_SESSION_REJECTED) { |
- this.error = remoting.ClientSession.ConnectionError.SESSION_REJECTED; |
- } else if (error == this.plugin.ERROR_INCOMPATIBLE_PROTOCOL) { |
- this.error = remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL; |
- } else if (error == this.plugin.ERROR_NETWORK_FAILURE) { |
- this.error = remoting.ClientSession.ConnectionError.NETWORK_FAILURE; |
- } else { |
- this.error = remoting.ClientSession.ConnectionError.OTHER; |
- } |
- this.setState_(remoting.ClientSession.State.CONNECTION_FAILED); |
+ } else if (status == this.plugin.STATUS_FAILED) { |
+ this.error = /** @type {remoting.ClientSession.ConnectionError} */ (error); |
} |
+ this.setState_(/** @type {remoting.ClientSession.State} */ (status)); |
}; |
/** |
* @private |
- * @param {remoting.ClientSession.State} state The new state for the session. |
+ * @param {remoting.ClientSession.State} newState The new state for the session. |
* @return {void} Nothing. |
*/ |
-remoting.ClientSession.prototype.setState_ = function(state) { |
+remoting.ClientSession.prototype.setState_ = function(newState) { |
var oldState = this.state; |
- this.state = state; |
+ this.state = newState; |
if (this.onStateChange) { |
- this.onStateChange(oldState); |
+ this.onStateChange(oldState, newState); |
} |
this.logToServer.logClientSessionStateChange(this.state, this.error); |
}; |
@@ -343,9 +341,6 @@ remoting.ClientSession.prototype.setState_ = function(state) { |
* @return {void} Nothing. |
*/ |
remoting.ClientSession.prototype.onWindowSizeChanged = function() { |
- remoting.debug.log('window size changed: ' + |
- window.innerWidth + 'x' + |
- window.innerHeight); |
this.updateDimensions(); |
}; |