OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview | 6 * @fileoverview |
7 * Class handling creation and teardown of a remoting client session. | 7 * Class handling creation and teardown of a remoting client session. |
8 * | 8 * |
9 * The ClientSession class controls lifetime of the client plugin | 9 * The ClientSession class controls lifetime of the client plugin |
10 * object and provides the plugin with the functionality it needs to | 10 * object and provides the plugin with the functionality it needs to |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 * would not be useful, for example, when using a cached host JID. | 162 * would not be useful, for example, when using a cached host JID. |
163 * | 163 * |
164 * @type {boolean} @private | 164 * @type {boolean} @private |
165 */ | 165 */ |
166 this.logHostOfflineErrors_ = true; | 166 this.logHostOfflineErrors_ = true; |
167 | 167 |
168 /** @private */ | 168 /** @private */ |
169 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); | 169 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); |
170 /** @private */ | 170 /** @private */ |
171 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); | 171 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); |
172 /** @private */ | 172 /** |
| 173 * @type {function(boolean=):void} |
| 174 * @private |
| 175 */ |
173 this.callOnFullScreenChanged_ = this.onFullScreenChanged_.bind(this) | 176 this.callOnFullScreenChanged_ = this.onFullScreenChanged_.bind(this) |
174 | 177 |
175 /** @type {Element} @private */ | 178 /** @type {Element} @private */ |
176 this.mouseCursorOverlay_ = | 179 this.mouseCursorOverlay_ = |
177 this.container_.querySelector('.mouse-cursor-overlay'); | 180 this.container_.querySelector('.mouse-cursor-overlay'); |
178 | 181 |
179 /** @type {Element} */ | 182 /** @type {Element} */ |
180 var img = this.mouseCursorOverlay_; | 183 var img = this.mouseCursorOverlay_; |
181 /** @param {Event} event @private */ | 184 /** @param {Event} event @private */ |
182 this.updateMouseCursorPosition_ = function(event) { | 185 this.updateMouseCursorPosition_ = function(event) { |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 remoting.ClientSession.prototype.createPluginAndConnect = | 471 remoting.ClientSession.prototype.createPluginAndConnect = |
469 function(onExtensionMessage, requiredCapabilities) { | 472 function(onExtensionMessage, requiredCapabilities) { |
470 this.plugin_ = remoting.ClientPlugin.factory.createPlugin( | 473 this.plugin_ = remoting.ClientPlugin.factory.createPlugin( |
471 this.container_.querySelector('.client-plugin-container'), | 474 this.container_.querySelector('.client-plugin-container'), |
472 onExtensionMessage, requiredCapabilities); | 475 onExtensionMessage, requiredCapabilities); |
473 remoting.HostSettings.load(this.hostId_, | 476 remoting.HostSettings.load(this.hostId_, |
474 this.onHostSettingsLoaded_.bind(this)); | 477 this.onHostSettingsLoaded_.bind(this)); |
475 }; | 478 }; |
476 | 479 |
477 /** | 480 /** |
478 * @param {Object.<string>} options The current options for the host, or {} | 481 * @param {Object.<string|boolean|number>} options The current options for the |
479 * if this client has no saved settings for the host. | 482 * host, or {} if this client has no saved settings for the host. |
480 * @private | 483 * @private |
481 */ | 484 */ |
482 remoting.ClientSession.prototype.onHostSettingsLoaded_ = function(options) { | 485 remoting.ClientSession.prototype.onHostSettingsLoaded_ = function(options) { |
483 if (remoting.ClientSession.KEY_REMAP_KEYS in options && | 486 if (remoting.ClientSession.KEY_REMAP_KEYS in options && |
484 typeof(options[remoting.ClientSession.KEY_REMAP_KEYS]) == | 487 typeof(options[remoting.ClientSession.KEY_REMAP_KEYS]) == |
485 'string') { | 488 'string') { |
486 this.remapKeys_ = /** @type {string} */ | 489 this.remapKeys_ = /** @type {string} */ |
487 options[remoting.ClientSession.KEY_REMAP_KEYS]; | 490 (options[remoting.ClientSession.KEY_REMAP_KEYS]); |
488 } | 491 } |
489 if (remoting.ClientSession.KEY_RESIZE_TO_CLIENT in options && | 492 if (remoting.ClientSession.KEY_RESIZE_TO_CLIENT in options && |
490 typeof(options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT]) == | 493 typeof(options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT]) == |
491 'boolean') { | 494 'boolean') { |
492 this.resizeToClient_ = /** @type {boolean} */ | 495 this.resizeToClient_ = /** @type {boolean} */ |
493 options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT]; | 496 (options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT]); |
494 } | 497 } |
495 if (remoting.ClientSession.KEY_SHRINK_TO_FIT in options && | 498 if (remoting.ClientSession.KEY_SHRINK_TO_FIT in options && |
496 typeof(options[remoting.ClientSession.KEY_SHRINK_TO_FIT]) == | 499 typeof(options[remoting.ClientSession.KEY_SHRINK_TO_FIT]) == |
497 'boolean') { | 500 'boolean') { |
498 this.shrinkToFit_ = /** @type {boolean} */ | 501 this.shrinkToFit_ = /** @type {boolean} */ |
499 options[remoting.ClientSession.KEY_SHRINK_TO_FIT]; | 502 (options[remoting.ClientSession.KEY_SHRINK_TO_FIT]); |
500 } | 503 } |
501 if (remoting.ClientSession.KEY_DESKTOP_SCALE in options && | 504 if (remoting.ClientSession.KEY_DESKTOP_SCALE in options && |
502 typeof(options[remoting.ClientSession.KEY_DESKTOP_SCALE]) == | 505 typeof(options[remoting.ClientSession.KEY_DESKTOP_SCALE]) == |
503 'number') { | 506 'number') { |
504 this.desktopScale_ = /** @type {number} */ | 507 this.desktopScale_ = /** @type {number} */ |
505 options[remoting.ClientSession.KEY_DESKTOP_SCALE]; | 508 (options[remoting.ClientSession.KEY_DESKTOP_SCALE]); |
506 } | 509 } |
507 | 510 |
508 /** @param {boolean} result */ | 511 /** @param {boolean} result */ |
509 this.plugin_.initialize(this.onPluginInitialized_.bind(this)); | 512 this.plugin_.initialize(this.onPluginInitialized_.bind(this)); |
510 }; | 513 }; |
511 | 514 |
512 /** | 515 /** |
513 * Constrains the focus to the plugin element. | 516 * Constrains the focus to the plugin element. |
514 * @private | 517 * @private |
515 */ | 518 */ |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 * @return {remoting.Error} The current error code. | 710 * @return {remoting.Error} The current error code. |
708 */ | 711 */ |
709 remoting.ClientSession.prototype.getError = function() { | 712 remoting.ClientSession.prototype.getError = function() { |
710 return this.error_; | 713 return this.error_; |
711 }; | 714 }; |
712 | 715 |
713 /** | 716 /** |
714 * Sends a key combination to the remoting client, by sending down events for | 717 * Sends a key combination to the remoting client, by sending down events for |
715 * the given keys, followed by up events in reverse order. | 718 * the given keys, followed by up events in reverse order. |
716 * | 719 * |
| 720 * @param {Array.<number>} keys Key codes to be sent. |
| 721 * @return {void} Nothing. |
717 * @private | 722 * @private |
718 * @param {[number]} keys Key codes to be sent. | |
719 * @return {void} Nothing. | |
720 */ | 723 */ |
721 remoting.ClientSession.prototype.sendKeyCombination_ = function(keys) { | 724 remoting.ClientSession.prototype.sendKeyCombination_ = function(keys) { |
722 for (var i = 0; i < keys.length; i++) { | 725 for (var i = 0; i < keys.length; i++) { |
723 this.plugin_.injectKeyEvent(keys[i], true); | 726 this.plugin_.injectKeyEvent(keys[i], true); |
724 } | 727 } |
725 for (var i = 0; i < keys.length; i++) { | 728 for (var i = 0; i < keys.length; i++) { |
726 this.plugin_.injectKeyEvent(keys[i], false); | 729 this.plugin_.injectKeyEvent(keys[i], false); |
727 } | 730 } |
728 } | 731 } |
729 | 732 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 /** | 877 /** |
875 * @return {boolean} Whether the client has received a video buffer. | 878 * @return {boolean} Whether the client has received a video buffer. |
876 */ | 879 */ |
877 remoting.ClientSession.prototype.hasReceivedFrame = function() { | 880 remoting.ClientSession.prototype.hasReceivedFrame = function() { |
878 return this.hasReceivedFrame_; | 881 return this.hasReceivedFrame_; |
879 }; | 882 }; |
880 | 883 |
881 /** | 884 /** |
882 * Sends a signaling message. | 885 * Sends a signaling message. |
883 * | 886 * |
884 * @private | |
885 * @param {string} message XML string of IQ stanza to send to server. | 887 * @param {string} message XML string of IQ stanza to send to server. |
886 * @return {void} Nothing. | 888 * @return {void} Nothing. |
| 889 * @private |
887 */ | 890 */ |
888 remoting.ClientSession.prototype.sendIq_ = function(message) { | 891 remoting.ClientSession.prototype.sendIq_ = function(message) { |
889 // Extract the session id, so we can close the session later. | 892 // Extract the session id, so we can close the session later. |
890 var parser = new DOMParser(); | 893 var parser = new DOMParser(); |
891 var iqNode = parser.parseFromString(message, 'text/xml').firstChild; | 894 var iqNode = parser.parseFromString(message, 'text/xml').firstChild; |
892 var jingleNode = iqNode.firstChild; | 895 var jingleNode = iqNode.firstChild; |
893 if (jingleNode) { | 896 if (jingleNode) { |
894 var action = jingleNode.getAttribute('action'); | 897 var action = jingleNode.getAttribute('action'); |
895 if (jingleNode.nodeName == 'jingle' && action == 'session-initiate') { | 898 if (jingleNode.nodeName == 'jingle' && action == 'session-initiate') { |
896 this.sessionId_ = jingleNode.getAttribute('sid'); | 899 this.sessionId_ = jingleNode.getAttribute('sid'); |
897 } | 900 } |
898 } | 901 } |
899 | 902 |
900 console.log(remoting.timestamp(), remoting.formatIq.prettifySendIq(message)); | 903 console.log(remoting.timestamp(), remoting.formatIq.prettifySendIq(message)); |
901 if (this.signalStrategy_.getState() != | 904 if (this.signalStrategy_.getState() != |
902 remoting.SignalStrategy.State.CONNECTED) { | 905 remoting.SignalStrategy.State.CONNECTED) { |
903 console.log("Message above is dropped because signaling is not connected."); | 906 console.log("Message above is dropped because signaling is not connected."); |
904 return; | 907 return; |
905 } | 908 } |
906 | 909 |
907 this.signalStrategy_.sendMessage(message); | 910 this.signalStrategy_.sendMessage(message); |
908 }; | 911 }; |
909 | 912 |
910 /** | 913 /** |
| 914 * @param {string} msg |
911 * @private | 915 * @private |
912 * @param {string} msg | |
913 */ | 916 */ |
914 remoting.ClientSession.prototype.onDebugMessage_ = function(msg) { | 917 remoting.ClientSession.prototype.onDebugMessage_ = function(msg) { |
915 console.log('plugin: ' + msg.trimRight()); | 918 console.log('plugin: ' + msg.trimRight()); |
916 }; | 919 }; |
917 | 920 |
918 /** | 921 /** |
| 922 * @param {Element} message |
919 * @private | 923 * @private |
920 * @param {Element} message | |
921 */ | 924 */ |
922 remoting.ClientSession.prototype.onIncomingMessage_ = function(message) { | 925 remoting.ClientSession.prototype.onIncomingMessage_ = function(message) { |
923 if (!this.plugin_) { | 926 if (!this.plugin_) { |
924 return; | 927 return; |
925 } | 928 } |
926 var formatted = new XMLSerializer().serializeToString(message); | 929 var formatted = new XMLSerializer().serializeToString(message); |
927 console.log(remoting.timestamp(), | 930 console.log(remoting.timestamp(), |
928 remoting.formatIq.prettifyReceiveIq(formatted)); | 931 remoting.formatIq.prettifyReceiveIq(formatted)); |
929 this.plugin_.onIncomingIq(formatted); | 932 this.plugin_.onIncomingIq(formatted); |
930 } | 933 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 // Clients that don't support asking for a PIN asynchronously also don't | 987 // Clients that don't support asking for a PIN asynchronously also don't |
985 // support pairing, so request the PIN now without offering to remember it. | 988 // support pairing, so request the PIN now without offering to remember it. |
986 this.fetchPin_(false, callback); | 989 this.fetchPin_(false, callback); |
987 } | 990 } |
988 }; | 991 }; |
989 | 992 |
990 /** | 993 /** |
991 * Callback that the plugin invokes to indicate that the connection | 994 * Callback that the plugin invokes to indicate that the connection |
992 * status has changed. | 995 * status has changed. |
993 * | 996 * |
994 * @private | |
995 * @param {number} status The plugin's status. | 997 * @param {number} status The plugin's status. |
996 * @param {number} error The plugin's error state, if any. | 998 * @param {number} error The plugin's error state, if any. |
| 999 * @private |
997 */ | 1000 */ |
998 remoting.ClientSession.prototype.onConnectionStatusUpdate_ = | 1001 remoting.ClientSession.prototype.onConnectionStatusUpdate_ = |
999 function(status, error) { | 1002 function(status, error) { |
1000 if (status == remoting.ClientSession.State.CONNECTED) { | 1003 if (status == remoting.ClientSession.State.CONNECTED) { |
1001 this.setFocusHandlers_(); | 1004 this.setFocusHandlers_(); |
1002 this.onDesktopSizeChanged_(); | 1005 this.onDesktopSizeChanged_(); |
1003 if (this.resizeToClient_) { | 1006 if (this.resizeToClient_) { |
1004 this.notifyClientResolution_(); | 1007 this.notifyClientResolution_(); |
1005 } | 1008 } |
1006 // Activate full-screen related UX. | 1009 // Activate full-screen related UX. |
(...skipping 24 matching lines...) Expand all Loading... |
1031 this.error_ = remoting.Error.UNEXPECTED; | 1034 this.error_ = remoting.Error.UNEXPECTED; |
1032 } | 1035 } |
1033 } | 1036 } |
1034 this.setState_(/** @type {remoting.ClientSession.State} */ (status)); | 1037 this.setState_(/** @type {remoting.ClientSession.State} */ (status)); |
1035 }; | 1038 }; |
1036 | 1039 |
1037 /** | 1040 /** |
1038 * Callback that the plugin invokes to indicate that the connection type for | 1041 * Callback that the plugin invokes to indicate that the connection type for |
1039 * a channel has changed. | 1042 * a channel has changed. |
1040 * | 1043 * |
1041 * @private | |
1042 * @param {string} channel The channel name. | 1044 * @param {string} channel The channel name. |
1043 * @param {string} connectionType The new connection type. | 1045 * @param {string} connectionType The new connection type. |
| 1046 * @private |
1044 */ | 1047 */ |
1045 remoting.ClientSession.prototype.onRouteChanged_ = | 1048 remoting.ClientSession.prototype.onRouteChanged_ = |
1046 function(channel, connectionType) { | 1049 function(channel, connectionType) { |
1047 console.log('plugin: Channel ' + channel + ' using ' + | 1050 console.log('plugin: Channel ' + channel + ' using ' + |
1048 connectionType + ' connection.'); | 1051 connectionType + ' connection.'); |
1049 this.logToServer.setConnectionType(connectionType); | 1052 this.logToServer.setConnectionType(connectionType); |
1050 }; | 1053 }; |
1051 | 1054 |
1052 /** | 1055 /** |
1053 * Callback that the plugin invokes to indicate when the connection is | 1056 * Callback that the plugin invokes to indicate when the connection is |
1054 * ready. | 1057 * ready. |
1055 * | 1058 * |
| 1059 * @param {boolean} ready True if the connection is ready. |
1056 * @private | 1060 * @private |
1057 * @param {boolean} ready True if the connection is ready. | |
1058 */ | 1061 */ |
1059 remoting.ClientSession.prototype.onConnectionReady_ = function(ready) { | 1062 remoting.ClientSession.prototype.onConnectionReady_ = function(ready) { |
1060 // TODO(jamiewalch): Currently, the logic for determining whether or not the | 1063 // TODO(jamiewalch): Currently, the logic for determining whether or not the |
1061 // connection is available is based solely on whether or not any video frames | 1064 // connection is available is based solely on whether or not any video frames |
1062 // have been received recently. which leads to poor UX on slow connections. | 1065 // have been received recently. which leads to poor UX on slow connections. |
1063 // Re-enable this once crbug.com/435315 has been fixed. | 1066 // Re-enable this once crbug.com/435315 has been fixed. |
1064 var ignoreVideoChannelState = true; | 1067 var ignoreVideoChannelState = true; |
1065 if (ignoreVideoChannelState) { | 1068 if (ignoreVideoChannelState) { |
1066 console.log('Video channel ' + (ready ? '' : 'not ') + 'ready.'); | 1069 console.log('Video channel ' + (ready ? '' : 'not ') + 'ready.'); |
1067 return; | 1070 return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 if (this.hasCapability_(remoting.ClientSession.Capability.GOOGLE_DRIVE)) { | 1102 if (this.hasCapability_(remoting.ClientSession.Capability.GOOGLE_DRIVE)) { |
1100 this.sendGoogleDriveAccessToken_(); | 1103 this.sendGoogleDriveAccessToken_(); |
1101 } | 1104 } |
1102 if (this.hasCapability_( | 1105 if (this.hasCapability_( |
1103 remoting.ClientSession.Capability.VIDEO_RECORDER)) { | 1106 remoting.ClientSession.Capability.VIDEO_RECORDER)) { |
1104 this.videoFrameRecorder_ = new remoting.VideoFrameRecorder(this.plugin_); | 1107 this.videoFrameRecorder_ = new remoting.VideoFrameRecorder(this.plugin_); |
1105 } | 1108 } |
1106 }; | 1109 }; |
1107 | 1110 |
1108 /** | 1111 /** |
1109 * @private | |
1110 * @param {remoting.ClientSession.State} newState The new state for the session. | 1112 * @param {remoting.ClientSession.State} newState The new state for the session. |
1111 * @return {void} Nothing. | 1113 * @return {void} Nothing. |
| 1114 * @private |
1112 */ | 1115 */ |
1113 remoting.ClientSession.prototype.setState_ = function(newState) { | 1116 remoting.ClientSession.prototype.setState_ = function(newState) { |
1114 var oldState = this.state_; | 1117 var oldState = this.state_; |
1115 this.state_ = newState; | 1118 this.state_ = newState; |
1116 var state = this.state_; | 1119 var state = this.state_; |
1117 if (oldState == remoting.ClientSession.State.CONNECTING) { | 1120 if (oldState == remoting.ClientSession.State.CONNECTING) { |
1118 if (this.state_ == remoting.ClientSession.State.CLOSED) { | 1121 if (this.state_ == remoting.ClientSession.State.CLOSED) { |
1119 state = remoting.ClientSession.State.CONNECTION_CANCELED; | 1122 state = remoting.ClientSession.State.CONNECTION_CANCELED; |
1120 } else if (this.state_ == remoting.ClientSession.State.FAILED && | 1123 } else if (this.state_ == remoting.ClientSession.State.FAILED && |
1121 this.error_ == remoting.Error.HOST_IS_OFFLINE && | 1124 this.error_ == remoting.Error.HOST_IS_OFFLINE && |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 remoting.ClientSession.prototype.pauseAudio = function(pause) { | 1198 remoting.ClientSession.prototype.pauseAudio = function(pause) { |
1196 if (this.plugin_) { | 1199 if (this.plugin_) { |
1197 this.plugin_.pauseAudio(pause) | 1200 this.plugin_.pauseAudio(pause) |
1198 } | 1201 } |
1199 } | 1202 } |
1200 | 1203 |
1201 /** | 1204 /** |
1202 * This is a callback that gets called when the plugin notifies us of a change | 1205 * This is a callback that gets called when the plugin notifies us of a change |
1203 * in the size of the remote desktop. | 1206 * in the size of the remote desktop. |
1204 * | 1207 * |
| 1208 * @return {void} Nothing. |
1205 * @private | 1209 * @private |
1206 * @return {void} Nothing. | |
1207 */ | 1210 */ |
1208 remoting.ClientSession.prototype.onDesktopSizeChanged_ = function() { | 1211 remoting.ClientSession.prototype.onDesktopSizeChanged_ = function() { |
1209 console.log('desktop size changed: ' + | 1212 console.log('desktop size changed: ' + |
1210 this.plugin_.getDesktopWidth() + 'x' + | 1213 this.plugin_.getDesktopWidth() + 'x' + |
1211 this.plugin_.getDesktopHeight() +' @ ' + | 1214 this.plugin_.getDesktopHeight() +' @ ' + |
1212 this.plugin_.getDesktopXDpi() + 'x' + | 1215 this.plugin_.getDesktopXDpi() + 'x' + |
1213 this.plugin_.getDesktopYDpi() + ' DPI'); | 1216 this.plugin_.getDesktopYDpi() + ' DPI'); |
1214 this.updateDimensions(); | 1217 this.updateDimensions(); |
1215 this.updateScrollbarVisibility(); | 1218 this.updateScrollbarVisibility(); |
1216 }; | 1219 }; |
1217 | 1220 |
1218 /** | 1221 /** |
1219 * Sets the non-click-through area of the client in response to notifications | 1222 * Sets the non-click-through area of the client in response to notifications |
1220 * from the plugin of desktop shape changes. | 1223 * from the plugin of desktop shape changes. |
1221 * | 1224 * |
1222 * @private | |
1223 * @param {Array.<Array.<number>>} rects List of rectangles comprising the | 1225 * @param {Array.<Array.<number>>} rects List of rectangles comprising the |
1224 * desktop shape. | 1226 * desktop shape. |
1225 * @return {void} Nothing. | 1227 * @return {void} Nothing. |
| 1228 * @private |
1226 */ | 1229 */ |
1227 remoting.ClientSession.prototype.onDesktopShapeChanged_ = function(rects) { | 1230 remoting.ClientSession.prototype.onDesktopShapeChanged_ = function(rects) { |
1228 // Build the list of rects for the input region. | 1231 // Build the list of rects for the input region. |
1229 var inputRegion = []; | 1232 var inputRegion = []; |
1230 for (var i = 0; i < rects.length; ++i) { | 1233 for (var i = 0; i < rects.length; ++i) { |
1231 var rect = {}; | 1234 var rect = {}; |
1232 rect.left = rects[i][0]; | 1235 rect.left = rects[i][0]; |
1233 rect.top = rects[i][1]; | 1236 rect.top = rects[i][1]; |
1234 rect.width = rects[i][2]; | 1237 rect.width = rects[i][2]; |
1235 rect.height = rects[i][3]; | 1238 rect.height = rects[i][3]; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 remoting.ClientSession.prototype.requestPairing = function(clientName, onDone) { | 1372 remoting.ClientSession.prototype.requestPairing = function(clientName, onDone) { |
1370 if (this.plugin_) { | 1373 if (this.plugin_) { |
1371 this.plugin_.requestPairing(clientName, onDone); | 1374 this.plugin_.requestPairing(clientName, onDone); |
1372 } | 1375 } |
1373 }; | 1376 }; |
1374 | 1377 |
1375 /** | 1378 /** |
1376 * Called when the full-screen status has changed, either via the | 1379 * Called when the full-screen status has changed, either via the |
1377 * remoting.Fullscreen class, or via a system event such as the Escape key | 1380 * remoting.Fullscreen class, or via a system event such as the Escape key |
1378 * | 1381 * |
1379 * @param {boolean} fullscreen True if the app is entering full-screen mode; | 1382 * @param {boolean=} fullscreen True if the app is entering full-screen mode; |
1380 * false if it is leaving it. | 1383 * false if it is leaving it. |
1381 * @private | 1384 * @private |
1382 */ | 1385 */ |
1383 remoting.ClientSession.prototype.onFullScreenChanged_ = function (fullscreen) { | 1386 remoting.ClientSession.prototype.onFullScreenChanged_ = function (fullscreen) { |
1384 this.enableBumpScroll_(fullscreen); | 1387 this.enableBumpScroll_(fullscreen); |
1385 }; | 1388 }; |
1386 | 1389 |
1387 /** | 1390 /** |
1388 * Scroll the client plugin by the specified amount, keeping it visible. | 1391 * Scroll the client plugin by the specified amount, keeping it visible. |
1389 * Note that this is only used in content full-screen mode (not windowed or | 1392 * Note that this is only used in content full-screen mode (not windowed or |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 }; | 1436 }; |
1434 | 1437 |
1435 remoting.ClientSession.prototype.resetScroll_ = function() { | 1438 remoting.ClientSession.prototype.resetScroll_ = function() { |
1436 this.container_.style.marginTop = '0px'; | 1439 this.container_.style.marginTop = '0px'; |
1437 this.container_.style.marginLeft = '0px'; | 1440 this.container_.style.marginLeft = '0px'; |
1438 }; | 1441 }; |
1439 | 1442 |
1440 /** | 1443 /** |
1441 * Enable or disable bump-scrolling. When disabling bump scrolling, also reset | 1444 * Enable or disable bump-scrolling. When disabling bump scrolling, also reset |
1442 * the scroll offsets to (0, 0). | 1445 * the scroll offsets to (0, 0). |
| 1446 * @param {boolean=} enable True to enable bump-scrolling, false to disable it. |
1443 * @private | 1447 * @private |
1444 * @param {boolean} enable True to enable bump-scrolling, false to disable it. | |
1445 */ | 1448 */ |
1446 remoting.ClientSession.prototype.enableBumpScroll_ = function(enable) { | 1449 remoting.ClientSession.prototype.enableBumpScroll_ = function(enable) { |
1447 var element = /*@type{HTMLElement} */ document.documentElement; | 1450 var element = /** @type{HTMLElement} */ (document.documentElement); |
1448 if (enable) { | 1451 if (enable) { |
1449 /** @type {null|function(Event):void} */ | 1452 /** @type {null|function(Event):void} */ |
1450 this.onMouseMoveRef_ = this.onMouseMove_.bind(this); | 1453 this.onMouseMoveRef_ = this.onMouseMove_.bind(this); |
1451 element.addEventListener('mousemove', this.onMouseMoveRef_, false); | 1454 element.addEventListener('mousemove', this.onMouseMoveRef_, false); |
1452 } else { | 1455 } else { |
1453 element.removeEventListener('mousemove', this.onMouseMoveRef_, false); | 1456 element.removeEventListener('mousemove', this.onMouseMoveRef_, false); |
1454 this.onMouseMoveRef_ = null; | 1457 this.onMouseMoveRef_ = null; |
1455 this.resetScroll_(); | 1458 this.resetScroll_(); |
1456 } | 1459 } |
1457 }; | 1460 }; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 | 1552 |
1550 /** | 1553 /** |
1551 * Process a remote gnubby auth request. | 1554 * Process a remote gnubby auth request. |
1552 * @param {string} data Remote gnubby request data. | 1555 * @param {string} data Remote gnubby request data. |
1553 * @private | 1556 * @private |
1554 */ | 1557 */ |
1555 remoting.ClientSession.prototype.processGnubbyAuthMessage_ = function(data) { | 1558 remoting.ClientSession.prototype.processGnubbyAuthMessage_ = function(data) { |
1556 if (this.gnubbyAuthHandler_) { | 1559 if (this.gnubbyAuthHandler_) { |
1557 try { | 1560 try { |
1558 this.gnubbyAuthHandler_.onMessage(data); | 1561 this.gnubbyAuthHandler_.onMessage(data); |
1559 } catch (err) { | 1562 } catch (/** @type {*} */ err) { |
1560 console.error('Failed to process gnubby message: ', | 1563 console.error('Failed to process gnubby message: ', err); |
1561 /** @type {*} */ (err)); | |
1562 } | 1564 } |
1563 } else { | 1565 } else { |
1564 console.error('Received unexpected gnubby message'); | 1566 console.error('Received unexpected gnubby message'); |
1565 } | 1567 } |
1566 }; | 1568 }; |
1567 | 1569 |
1568 /** | 1570 /** |
1569 * Create a gnubby auth handler and inform the host that gnubby auth is | 1571 * Create a gnubby auth handler and inform the host that gnubby auth is |
1570 * supported. | 1572 * supported. |
1571 * @private | 1573 * @private |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1665 | 1667 |
1666 /** | 1668 /** |
1667 * Process a remote Cast extension message from the host. | 1669 * Process a remote Cast extension message from the host. |
1668 * @param {string} data Remote cast extension data message. | 1670 * @param {string} data Remote cast extension data message. |
1669 * @private | 1671 * @private |
1670 */ | 1672 */ |
1671 remoting.ClientSession.prototype.processCastExtensionMessage_ = function(data) { | 1673 remoting.ClientSession.prototype.processCastExtensionMessage_ = function(data) { |
1672 if (this.castExtensionHandler_) { | 1674 if (this.castExtensionHandler_) { |
1673 try { | 1675 try { |
1674 this.castExtensionHandler_.onMessage(data); | 1676 this.castExtensionHandler_.onMessage(data); |
1675 } catch (err) { | 1677 } catch (/** @type {*} */ err) { |
1676 console.error('Failed to process cast message: ', | 1678 console.error('Failed to process cast message: ', err); |
1677 /** @type {*} */ (err)); | |
1678 } | 1679 } |
1679 } else { | 1680 } else { |
1680 console.error('Received unexpected cast message'); | 1681 console.error('Received unexpected cast message'); |
1681 } | 1682 } |
1682 }; | 1683 }; |
1683 | 1684 |
1684 /** | 1685 /** |
1685 * Create a CastExtensionHandler and inform the host that cast extension | 1686 * Create a CastExtensionHandler and inform the host that cast extension |
1686 * is supported. | 1687 * is supported. |
1687 * @private | 1688 * @private |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1726 * @param {Object} message The parsed extension message data. | 1727 * @param {Object} message The parsed extension message data. |
1727 * @return {boolean} True if the message was recognized, false otherwise. | 1728 * @return {boolean} True if the message was recognized, false otherwise. |
1728 */ | 1729 */ |
1729 remoting.ClientSession.prototype.handleExtensionMessage = | 1730 remoting.ClientSession.prototype.handleExtensionMessage = |
1730 function(type, message) { | 1731 function(type, message) { |
1731 if (this.videoFrameRecorder_) { | 1732 if (this.videoFrameRecorder_) { |
1732 return this.videoFrameRecorder_.handleMessage(type, message); | 1733 return this.videoFrameRecorder_.handleMessage(type, message); |
1733 } | 1734 } |
1734 return false; | 1735 return false; |
1735 } | 1736 } |
OLD | NEW |