| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 user-facing aspects of the client session. | 7 * Class handling user-facing aspects of the client session. |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 'use strict'; | 10 'use strict'; |
| 11 | 11 |
| 12 /** @suppress {duplicate} */ | 12 /** @suppress {duplicate} */ |
| 13 var remoting = remoting || {}; | 13 var remoting = remoting || {}; |
| 14 | 14 |
| 15 /** | 15 /** |
| 16 * True to enable mouse lock. | 16 * True to enable mouse lock. |
| 17 * This is currently disabled because the current client plugin does not | 17 * This is currently disabled because the current client plugin does not |
| 18 * properly handle mouse lock and delegated large cursors at the same time. | 18 * properly handle mouse lock and delegated large cursors at the same time. |
| 19 * This should be re-enabled (by removing this flag) once a version of | 19 * This should be re-enabled (by removing this flag) once a version of |
| 20 * the plugin that supports both has reached Chrome Stable channel. | 20 * the plugin that supports both has reached Chrome Stable channel. |
| 21 * (crbug.com/429322). | 21 * (crbug.com/429322). |
| 22 * | 22 * |
| 23 * @type {boolean} | 23 * @type {boolean} |
| 24 */ | 24 */ |
| 25 remoting.enableMouseLock = false; | 25 remoting.enableMouseLock = false; |
| 26 | 26 |
| 27 /** | 27 /** |
| 28 * @param {remoting.ClientPlugin} plugin |
| 28 * @param {remoting.ClientSession} session | 29 * @param {remoting.ClientSession} session |
| 29 * @param {HTMLElement} container | 30 * @param {HTMLElement} container |
| 30 * @param {remoting.Host} host | 31 * @param {remoting.Host} host |
| 31 * @param {remoting.DesktopConnectedView.Mode} mode The mode of this connection. | 32 * @param {remoting.DesktopConnectedView.Mode} mode The mode of this connection. |
| 32 * @param {string} defaultRemapKeys The default set of remap keys, to use | 33 * @param {string} defaultRemapKeys The default set of remap keys, to use |
| 33 * when the client doesn't define any. | 34 * when the client doesn't define any. |
| 34 * @param {function(remoting.Error, remoting.ClientPlugin): void} onInitialized | |
| 35 * @constructor | 35 * @constructor |
| 36 * @extends {base.EventSourceImpl} | 36 * @extends {base.EventSourceImpl} |
| 37 */ | 37 */ |
| 38 remoting.DesktopConnectedView = function(session, container, host, mode, | 38 remoting.DesktopConnectedView = function(plugin, session, container, host, mode, |
| 39 defaultRemapKeys, onInitialized) { | 39 defaultRemapKeys) { |
| 40 this.session_ = session; | 40 this.session_ = session; |
| 41 | 41 |
| 42 /** @private {HTMLElement} */ | 42 /** @private {HTMLElement} */ |
| 43 this.container_ = container; | 43 this.container_ = container; |
| 44 | 44 |
| 45 /** @private {remoting.ClientPlugin} */ | 45 /** @private {remoting.ClientPlugin} */ |
| 46 this.plugin_ = null; | 46 this.plugin_ = plugin; |
| 47 | 47 |
| 48 /** @private */ | 48 /** @private */ |
| 49 this.host_ = host; | 49 this.host_ = host; |
| 50 | 50 |
| 51 /** @private */ | 51 /** @private */ |
| 52 this.mode_ = mode; | 52 this.mode_ = mode; |
| 53 | 53 |
| 54 /** @private {string} */ | 54 /** @private {string} */ |
| 55 this.defaultRemapKeys_ = defaultRemapKeys; | 55 this.defaultRemapKeys_ = defaultRemapKeys; |
| 56 | 56 |
| 57 /** | |
| 58 * Called when the UI is finished initializing. | |
| 59 * @type {function(remoting.Error, remoting.ClientPlugin):void} | |
| 60 */ | |
| 61 this.onInitialized_ = onInitialized; | |
| 62 | |
| 63 /** @private */ | 57 /** @private */ |
| 64 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); | 58 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); |
| 65 /** @private */ | 59 /** @private */ |
| 66 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); | 60 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); |
| 67 /** @private {Element} */ | 61 /** @private {Element} */ |
| 68 this.debugRegionContainer_ = | 62 this.debugRegionContainer_ = |
| 69 this.container_.querySelector('.debug-region-container'); | 63 this.container_.querySelector('.debug-region-container'); |
| 70 | 64 |
| 71 /** @private {Element} */ | 65 /** @private {Element} */ |
| 72 this.mouseCursorOverlay_ = | 66 this.mouseCursorOverlay_ = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 84 this.updateMouseCursorPosition_ = function(event) { | 78 this.updateMouseCursorPosition_ = function(event) { |
| 85 img.style.top = event.offsetY + 'px'; | 79 img.style.top = event.offsetY + 'px'; |
| 86 img.style.left = event.offsetX + 'px'; | 80 img.style.left = event.offsetX + 'px'; |
| 87 }; | 81 }; |
| 88 | 82 |
| 89 /** @private {remoting.VideoFrameRecorder} */ | 83 /** @private {remoting.VideoFrameRecorder} */ |
| 90 this.videoFrameRecorder_ = null; | 84 this.videoFrameRecorder_ = null; |
| 91 | 85 |
| 92 /** private {base.Disposable} */ | 86 /** private {base.Disposable} */ |
| 93 this.eventHooks_ = null; | 87 this.eventHooks_ = null; |
| 88 |
| 89 this.setupPlugin_(); |
| 94 }; | 90 }; |
| 95 | 91 |
| 96 // The mode of this session. | 92 // The mode of this session. |
| 97 /** @enum {number} */ | 93 /** @enum {number} */ |
| 98 remoting.DesktopConnectedView.Mode = { | 94 remoting.DesktopConnectedView.Mode = { |
| 99 IT2ME: 0, | 95 IT2ME: 0, |
| 100 ME2ME: 1, | 96 ME2ME: 1, |
| 101 APP_REMOTING: 2 | 97 APP_REMOTING: 2 |
| 102 }; | 98 }; |
| 103 | 99 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 */ | 145 */ |
| 150 remoting.DesktopConnectedView.prototype.getPluginContainer_ = function() { | 146 remoting.DesktopConnectedView.prototype.getPluginContainer_ = function() { |
| 151 return this.container_.querySelector('.client-plugin-container'); | 147 return this.container_.querySelector('.client-plugin-container'); |
| 152 }; | 148 }; |
| 153 | 149 |
| 154 /** @return {remoting.DesktopViewport} */ | 150 /** @return {remoting.DesktopViewport} */ |
| 155 remoting.DesktopConnectedView.prototype.getViewportForTesting = function() { | 151 remoting.DesktopConnectedView.prototype.getViewportForTesting = function() { |
| 156 return this.viewport_; | 152 return this.viewport_; |
| 157 }; | 153 }; |
| 158 | 154 |
| 159 /** | 155 /** @private */ |
| 160 * Adds <embed> element to the UI container and readies the session object. | 156 remoting.DesktopConnectedView.prototype.setupPlugin_ = function() { |
| 161 * | |
| 162 * @param {function(string, string):boolean} onExtensionMessage The handler for | |
| 163 * protocol extension messages. Returns true if a message is recognized; | |
| 164 * false otherwise. | |
| 165 * @param {Array<string>} requiredCapabilities A list of capabilities | |
| 166 * required by this application. | |
| 167 */ | |
| 168 remoting.DesktopConnectedView.prototype.createPluginAndConnect = | |
| 169 function(onExtensionMessage, requiredCapabilities) { | |
| 170 this.plugin_ = remoting.ClientPlugin.factory.createPlugin( | |
| 171 this.getPluginContainer_(), | |
| 172 onExtensionMessage, requiredCapabilities); | |
| 173 var that = this; | |
| 174 this.host_.options.load().then(function(){ | |
| 175 that.plugin_.initialize(that.onPluginInitialized_.bind(that)); | |
| 176 }); | |
| 177 }; | |
| 178 | |
| 179 /** | |
| 180 * @param {boolean} initialized | |
| 181 */ | |
| 182 remoting.DesktopConnectedView.prototype.onPluginInitialized_ = function( | |
| 183 initialized) { | |
| 184 if (!initialized) { | |
| 185 console.error('ERROR: remoting plugin not loaded'); | |
| 186 this.onInitialized_(remoting.Error.MISSING_PLUGIN, this.plugin_); | |
| 187 return; | |
| 188 } | |
| 189 | |
| 190 if (!this.plugin_.isSupportedVersion()) { | |
| 191 this.onInitialized_(remoting.Error.BAD_PLUGIN_VERSION, this.plugin_); | |
| 192 return; | |
| 193 } | |
| 194 | |
| 195 // Show the Send Keys menu only if the plugin has the injectKeyEvent feature, | 157 // Show the Send Keys menu only if the plugin has the injectKeyEvent feature, |
| 196 // and the Ctrl-Alt-Del button only in Me2Me mode. | 158 // and the Ctrl-Alt-Del button only in Me2Me mode. |
| 197 if (!this.plugin_.hasFeature( | 159 if (!this.plugin_.hasFeature( |
| 198 remoting.ClientPlugin.Feature.INJECT_KEY_EVENT)) { | 160 remoting.ClientPlugin.Feature.INJECT_KEY_EVENT)) { |
| 199 var sendKeysElement = document.getElementById('send-keys-menu'); | 161 var sendKeysElement = document.getElementById('send-keys-menu'); |
| 200 sendKeysElement.hidden = true; | 162 sendKeysElement.hidden = true; |
| 201 } else if (this.mode_ != remoting.DesktopConnectedView.Mode.ME2ME && | 163 } else if (this.mode_ != remoting.DesktopConnectedView.Mode.ME2ME && |
| 202 this.mode_ != remoting.DesktopConnectedView.Mode.APP_REMOTING) { | 164 this.mode_ != remoting.DesktopConnectedView.Mode.APP_REMOTING) { |
| 203 var sendCadElement = document.getElementById('send-ctrl-alt-del'); | 165 var sendCadElement = document.getElementById('send-ctrl-alt-del'); |
| 204 sendCadElement.hidden = true; | 166 sendCadElement.hidden = true; |
| 205 } | 167 } |
| 206 | 168 |
| 207 // Apply customized key remappings if the plugin supports remapKeys. | 169 // Apply customized key remappings if the plugin supports remapKeys. |
| 208 if (this.plugin_.hasFeature(remoting.ClientPlugin.Feature.REMAP_KEY)) { | 170 if (this.plugin_.hasFeature(remoting.ClientPlugin.Feature.REMAP_KEY)) { |
| 209 this.applyRemapKeys_(true); | 171 this.applyRemapKeys_(true); |
| 210 } | 172 } |
| 211 | 173 |
| 212 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. | 174 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. |
| 213 // Enable automatic mouse-lock. | 175 // Enable automatic mouse-lock. |
| 214 if (remoting.enableMouseLock && | 176 if (remoting.enableMouseLock && |
| 215 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { | 177 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { |
| 216 this.plugin_.allowMouseLock(); | 178 this.plugin_.allowMouseLock(); |
| 217 } | 179 } |
| 218 | 180 |
| 219 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this)); | 181 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this)); |
| 220 | |
| 221 this.onInitialized_(remoting.Error.NONE, this.plugin_); | |
| 222 }; | 182 }; |
| 223 | 183 |
| 224 /** | 184 /** |
| 225 * This is a callback that gets called when the window is resized. | 185 * This is a callback that gets called when the window is resized. |
| 226 * | 186 * |
| 227 * @return {void} Nothing. | 187 * @return {void} Nothing. |
| 228 * @private. | 188 * @private. |
| 229 */ | 189 */ |
| 230 remoting.DesktopConnectedView.prototype.onResize_ = function() { | 190 remoting.DesktopConnectedView.prototype.onResize_ = function() { |
| 231 if (this.viewport_) { | 191 if (this.viewport_) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 261 * disconnected by the Host. | 221 * disconnected by the Host. |
| 262 * | 222 * |
| 263 * @return {void} Nothing. | 223 * @return {void} Nothing. |
| 264 */ | 224 */ |
| 265 remoting.DesktopConnectedView.prototype.removePlugin = function() { | 225 remoting.DesktopConnectedView.prototype.removePlugin = function() { |
| 266 if (this.plugin_) { | 226 if (this.plugin_) { |
| 267 this.plugin_.element().removeEventListener( | 227 this.plugin_.element().removeEventListener( |
| 268 'focus', this.callPluginGotFocus_, false); | 228 'focus', this.callPluginGotFocus_, false); |
| 269 this.plugin_.element().removeEventListener( | 229 this.plugin_.element().removeEventListener( |
| 270 'blur', this.callPluginLostFocus_, false); | 230 'blur', this.callPluginLostFocus_, false); |
| 271 this.plugin_.dispose(); | |
| 272 this.plugin_ = null; | 231 this.plugin_ = null; |
| 273 } | 232 } |
| 274 | 233 |
| 275 this.updateClientSessionUi_(null); | 234 this.updateClientSessionUi_(null); |
| 276 }; | 235 }; |
| 277 | 236 |
| 278 /** | 237 /** |
| 279 * @param {remoting.ClientSession} clientSession The active session, or null if | 238 * @param {remoting.ClientSession} clientSession The active session, or null if |
| 280 * there is no connection. | 239 * there is no connection. |
| 281 */ | 240 */ |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 var rect = document.createElement('div'); | 556 var rect = document.createElement('div'); |
| 598 rect.classList.add('debug-region-rect'); | 557 rect.classList.add('debug-region-rect'); |
| 599 rect.style.left = rects[i][0] + 'px'; | 558 rect.style.left = rects[i][0] + 'px'; |
| 600 rect.style.top = rects[i][1] +'px'; | 559 rect.style.top = rects[i][1] +'px'; |
| 601 rect.style.width = rects[i][2] +'px'; | 560 rect.style.width = rects[i][2] +'px'; |
| 602 rect.style.height = rects[i][3] + 'px'; | 561 rect.style.height = rects[i][3] + 'px'; |
| 603 this.debugRegionContainer_.appendChild(rect); | 562 this.debugRegionContainer_.appendChild(rect); |
| 604 } | 563 } |
| 605 } | 564 } |
| 606 }; | 565 }; |
| OLD | NEW |