| 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'; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 // Bump-scroll test variables. Override to use a fake value for the width | 107 // Bump-scroll test variables. Override to use a fake value for the width |
| 108 // and height of the client plugin so that bump-scrolling can be tested | 108 // and height of the client plugin so that bump-scrolling can be tested |
| 109 // without relying on the actual size of the host desktop. | 109 // without relying on the actual size of the host desktop. |
| 110 /** @type {number} @private */ | 110 /** @type {number} @private */ |
| 111 this.pluginWidthForBumpScrollTesting = 0; | 111 this.pluginWidthForBumpScrollTesting = 0; |
| 112 /** @type {number} @private */ | 112 /** @type {number} @private */ |
| 113 this.pluginHeightForBumpScrollTesting = 0; | 113 this.pluginHeightForBumpScrollTesting = 0; |
| 114 | 114 |
| 115 /** @type {remoting.VideoFrameRecorder} @private */ | 115 /** @type {remoting.VideoFrameRecorder} @private */ |
| 116 this.videoFrameRecorder_ = null; | 116 this.videoFrameRecorder_ = null; |
| 117 |
| 118 /** @private {base.Disposables} */ |
| 119 this.eventHooks_ = null; |
| 117 }; | 120 }; |
| 118 | 121 |
| 119 base.extend(remoting.DesktopConnectedView, base.EventSourceImpl); | 122 base.extend(remoting.DesktopConnectedView, base.EventSourceImpl); |
| 120 | 123 |
| 121 /** @enum {string} */ | 124 /** @enum {string} */ |
| 122 remoting.DesktopConnectedView.Events = { | 125 remoting.DesktopConnectedView.Events = { |
| 123 bumpScrollStarted: 'bumpScrollStarted', | 126 bumpScrollStarted: 'bumpScrollStarted', |
| 124 bumpScrollStopped: 'bumpScrollStopped' | 127 bumpScrollStopped: 'bumpScrollStopped' |
| 125 }; | 128 }; |
| 126 | 129 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 { 'width': window.innerWidth, 'height': window.innerHeight }; | 190 { 'width': window.innerWidth, 'height': window.innerHeight }; |
| 188 }; | 191 }; |
| 189 | 192 |
| 190 /** | 193 /** |
| 191 * Notifies the host of the client's current dimensions and DPI. | 194 * Notifies the host of the client's current dimensions and DPI. |
| 192 * Also takes into account per-host scaling factor, if configured. | 195 * Also takes into account per-host scaling factor, if configured. |
| 193 * TODO: private | 196 * TODO: private |
| 194 */ | 197 */ |
| 195 remoting.DesktopConnectedView.prototype.notifyClientResolution_ = function() { | 198 remoting.DesktopConnectedView.prototype.notifyClientResolution_ = function() { |
| 196 var clientArea = this.getClientArea_(); | 199 var clientArea = this.getClientArea_(); |
| 197 this.plugin_.notifyClientResolution(clientArea.width * this.desktopScale_, | 200 this.plugin_.hostDesktop().resize(clientArea.width * this.desktopScale_, |
| 198 clientArea.height * this.desktopScale_, | 201 clientArea.height * this.desktopScale_, |
| 199 window.devicePixelRatio); | 202 window.devicePixelRatio); |
| 200 }; | 203 }; |
| 201 | 204 |
| 202 /** | 205 /** |
| 203 * Adds <embed> element to the UI container and readies the session object. | 206 * Adds <embed> element to the UI container and readies the session object. |
| 204 * | 207 * |
| 205 * @param {function(string, string):boolean} onExtensionMessage The handler for | 208 * @param {function(string, string):boolean} onExtensionMessage The handler for |
| 206 * protocol extension messages. Returns true if a message is recognized; | 209 * protocol extension messages. Returns true if a message is recognized; |
| 207 * false otherwise. | 210 * false otherwise. |
| 208 * @param {Array<string>} requiredCapabilities A list of capabilities | 211 * @param {Array<string>} requiredCapabilities A list of capabilities |
| 209 * required by this application. | 212 * required by this application. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 this.applyRemapKeys_(true); | 289 this.applyRemapKeys_(true); |
| 287 } | 290 } |
| 288 | 291 |
| 289 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. | 292 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. |
| 290 // Enable automatic mouse-lock. | 293 // Enable automatic mouse-lock. |
| 291 if (remoting.enableMouseLock && | 294 if (remoting.enableMouseLock && |
| 292 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { | 295 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { |
| 293 this.plugin_.allowMouseLock(); | 296 this.plugin_.allowMouseLock(); |
| 294 } | 297 } |
| 295 | 298 |
| 296 this.plugin_.setDesktopShapeUpdateHandler( | 299 base.dispose(this.eventHooks_); |
| 297 this.onDesktopShapeChanged_.bind(this)); | 300 var hostDesktop = this.plugin_.hostDesktop(); |
| 298 this.plugin_.setDesktopSizeUpdateHandler( | 301 this.eventHooks_ = new base.Disposables( |
| 299 this.onDesktopSizeChanged_.bind(this)); | 302 new base.EventHook( |
| 303 hostDesktop, remoting.HostDesktop.Events.sizeChanged, |
| 304 this.onDesktopSizeChanged_.bind(this)), |
| 305 new base.EventHook( |
| 306 hostDesktop, remoting.HostDesktop.Events.shapeChanged, |
| 307 this.onDesktopShapeChanged_.bind(this))); |
| 308 |
| 300 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this)); | 309 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this)); |
| 301 | 310 |
| 302 this.onInitialized_(remoting.Error.NONE, this.plugin_); | 311 this.onInitialized_(remoting.Error.NONE, this.plugin_); |
| 303 }; | 312 }; |
| 304 | 313 |
| 305 /** | 314 /** |
| 306 * This is a callback that gets called when the plugin notifies us of a change | 315 * This is a callback that gets called when the plugin notifies us of a change |
| 307 * in the size of the remote desktop. | 316 * in the size of the remote desktop. |
| 308 * | 317 * |
| 309 * @return {void} Nothing. | 318 * @return {void} Nothing. |
| 310 * @private | 319 * @private |
| 311 */ | 320 */ |
| 312 remoting.DesktopConnectedView.prototype.onDesktopSizeChanged_ = function() { | 321 remoting.DesktopConnectedView.prototype.onDesktopSizeChanged_ = function() { |
| 322 var desktop = this.plugin_.hostDesktop().getDimensions(); |
| 313 console.log('desktop size changed: ' + | 323 console.log('desktop size changed: ' + |
| 314 this.plugin_.getDesktopWidth() + 'x' + | 324 desktop.width + 'x' + |
| 315 this.plugin_.getDesktopHeight() +' @ ' + | 325 desktop.height +' @ ' + |
| 316 this.plugin_.getDesktopXDpi() + 'x' + | 326 desktop.xDpi + 'x' + |
| 317 this.plugin_.getDesktopYDpi() + ' DPI'); | 327 desktop.yDpi + ' DPI'); |
| 318 this.updateDimensions(); | 328 this.updateDimensions(); |
| 319 this.updateScrollbarVisibility(); | 329 this.updateScrollbarVisibility(); |
| 320 }; | 330 }; |
| 321 | 331 |
| 322 /** | 332 /** |
| 323 * Sets the non-click-through area of the client in response to notifications | 333 * Sets the non-click-through area of the client in response to notifications |
| 324 * from the plugin of desktop shape changes. | 334 * from the plugin of desktop shape changes. |
| 325 * | 335 * |
| 326 * @param {Array<Array<number>>} rects List of rectangles comprising the | 336 * @param {Array<Array<number>>} rects List of rectangles comprising the |
| 327 * desktop shape. | 337 * desktop shape. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 354 | 364 |
| 355 if (this.notifyClientResolutionTimer_) { | 365 if (this.notifyClientResolutionTimer_) { |
| 356 window.clearTimeout(this.notifyClientResolutionTimer_); | 366 window.clearTimeout(this.notifyClientResolutionTimer_); |
| 357 this.notifyClientResolutionTimer_ = null; | 367 this.notifyClientResolutionTimer_ = null; |
| 358 } | 368 } |
| 359 | 369 |
| 360 // Defer notifying the host of the change until the window stops resizing, to | 370 // Defer notifying the host of the change until the window stops resizing, to |
| 361 // avoid overloading the control channel with notifications. | 371 // avoid overloading the control channel with notifications. |
| 362 if (this.resizeToClient_) { | 372 if (this.resizeToClient_) { |
| 363 var kResizeRateLimitMs = 1000; | 373 var kResizeRateLimitMs = 1000; |
| 364 if (this.session_.hasCapability( | 374 if (this.plugin_.hostDesktop().hasResizeRateLimit()) { |
| 365 remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS)) { | |
| 366 kResizeRateLimitMs = 250; | 375 kResizeRateLimitMs = 250; |
| 367 } | 376 } |
| 368 var clientArea = this.getClientArea_(); | 377 var clientArea = this.getClientArea_(); |
| 369 this.notifyClientResolutionTimer_ = window.setTimeout( | 378 this.notifyClientResolutionTimer_ = window.setTimeout( |
| 370 this.notifyClientResolution_.bind(this), | 379 this.notifyClientResolution_.bind(this), |
| 371 kResizeRateLimitMs); | 380 kResizeRateLimitMs); |
| 372 } | 381 } |
| 373 | 382 |
| 374 // If bump-scrolling is enabled, adjust the plugin margins to fully utilize | 383 // If bump-scrolling is enabled, adjust the plugin margins to fully utilize |
| 375 // the new window area. | 384 // the new window area. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 394 | 403 |
| 395 /** | 404 /** |
| 396 * Deletes the <embed> element from the container, without sending a | 405 * Deletes the <embed> element from the container, without sending a |
| 397 * session_terminate request. This is to be called when the session was | 406 * session_terminate request. This is to be called when the session was |
| 398 * disconnected by the Host. | 407 * disconnected by the Host. |
| 399 * | 408 * |
| 400 * @return {void} Nothing. | 409 * @return {void} Nothing. |
| 401 */ | 410 */ |
| 402 remoting.DesktopConnectedView.prototype.removePlugin = function() { | 411 remoting.DesktopConnectedView.prototype.removePlugin = function() { |
| 403 if (this.plugin_) { | 412 if (this.plugin_) { |
| 413 base.dispose(this.eventHooks_); |
| 414 this.eventHooks_ = null; |
| 404 this.plugin_.element().removeEventListener( | 415 this.plugin_.element().removeEventListener( |
| 405 'focus', this.callPluginGotFocus_, false); | 416 'focus', this.callPluginGotFocus_, false); |
| 406 this.plugin_.element().removeEventListener( | 417 this.plugin_.element().removeEventListener( |
| 407 'blur', this.callPluginLostFocus_, false); | 418 'blur', this.callPluginLostFocus_, false); |
| 408 this.plugin_.dispose(); | 419 this.plugin_.dispose(); |
| 409 this.plugin_ = null; | 420 this.plugin_ = null; |
| 410 } | 421 } |
| 411 | 422 |
| 412 this.updateClientSessionUi_(null); | 423 this.updateClientSessionUi_(null); |
| 413 }; | 424 }; |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 return stopX.stop && stopY.stop; | 738 return stopX.stop && stopY.stop; |
| 728 }; | 739 }; |
| 729 | 740 |
| 730 /** | 741 /** |
| 731 * Refreshes the plugin's dimensions, taking into account the sizes of the | 742 * Refreshes the plugin's dimensions, taking into account the sizes of the |
| 732 * remote desktop and client window, and the current scale-to-fit setting. | 743 * remote desktop and client window, and the current scale-to-fit setting. |
| 733 * | 744 * |
| 734 * @return {void} Nothing. | 745 * @return {void} Nothing. |
| 735 */ | 746 */ |
| 736 remoting.DesktopConnectedView.prototype.updateDimensions = function() { | 747 remoting.DesktopConnectedView.prototype.updateDimensions = function() { |
| 737 if (this.plugin_.getDesktopWidth() == 0 || | 748 var desktopSize = this.plugin_.hostDesktop().getDimensions(); |
| 738 this.plugin_.getDesktopHeight() == 0) { | 749 |
| 750 if (desktopSize.width === 0 || |
| 751 desktopSize.height === 0) { |
| 739 return; | 752 return; |
| 740 } | 753 } |
| 741 | 754 |
| 742 var desktopSize = { width: this.plugin_.getDesktopWidth(), | 755 var desktopDpi = { x: desktopSize.xDpi, |
| 743 height: this.plugin_.getDesktopHeight() }; | 756 y: desktopSize.yDpi }; |
| 744 var desktopDpi = { x: this.plugin_.getDesktopXDpi(), | |
| 745 y: this.plugin_.getDesktopYDpi() }; | |
| 746 var newSize = remoting.DesktopConnectedView.choosePluginSize( | 757 var newSize = remoting.DesktopConnectedView.choosePluginSize( |
| 747 this.getClientArea_(), window.devicePixelRatio, | 758 this.getClientArea_(), window.devicePixelRatio, |
| 748 desktopSize, desktopDpi, this.desktopScale_, | 759 desktopSize, desktopDpi, this.desktopScale_, |
| 749 remoting.fullscreen.isActive(), this.shrinkToFit_); | 760 remoting.fullscreen.isActive(), this.shrinkToFit_); |
| 750 | 761 |
| 751 // Resize the plugin if necessary. | 762 // Resize the plugin if necessary. |
| 752 console.log('plugin dimensions:' + newSize.width + 'x' + newSize.height); | 763 console.log('plugin dimensions:' + newSize.width + 'x' + newSize.height); |
| 753 this.plugin_.element().style.width = newSize.width + 'px'; | 764 this.plugin_.element().style.width = newSize.width + 'px'; |
| 754 this.plugin_.element().style.height = newSize.height + 'px'; | 765 this.plugin_.element().style.height = newSize.height + 'px'; |
| 755 | 766 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 if (!scroller) { | 914 if (!scroller) { |
| 904 return; | 915 return; |
| 905 } | 916 } |
| 906 | 917 |
| 907 var needsVerticalScroll = false; | 918 var needsVerticalScroll = false; |
| 908 var needsHorizontalScroll = false; | 919 var needsHorizontalScroll = false; |
| 909 if (!this.shrinkToFit_) { | 920 if (!this.shrinkToFit_) { |
| 910 // Determine whether or not horizontal or vertical scrollbars are | 921 // Determine whether or not horizontal or vertical scrollbars are |
| 911 // required, taking into account their width. | 922 // required, taking into account their width. |
| 912 var clientArea = this.getClientArea_(); | 923 var clientArea = this.getClientArea_(); |
| 913 needsVerticalScroll = clientArea.height < this.plugin_.getDesktopHeight(); | 924 var desktopSize = this.plugin_.hostDesktop().getDimensions(); |
| 914 needsHorizontalScroll = clientArea.width < this.plugin_.getDesktopWidth(); | 925 needsVerticalScroll = clientArea.height < desktopSize.height; |
| 926 needsHorizontalScroll = clientArea.width < desktopSize.width; |
| 915 var kScrollBarWidth = 16; | 927 var kScrollBarWidth = 16; |
| 916 if (needsHorizontalScroll && !needsVerticalScroll) { | 928 if (needsHorizontalScroll && !needsVerticalScroll) { |
| 917 needsVerticalScroll = | 929 needsVerticalScroll = |
| 918 clientArea.height - kScrollBarWidth < this.plugin_.getDesktopHeight(); | 930 clientArea.height - kScrollBarWidth < desktopSize.height; |
| 919 } else if (!needsHorizontalScroll && needsVerticalScroll) { | 931 } else if (!needsHorizontalScroll && needsVerticalScroll) { |
| 920 needsHorizontalScroll = | 932 needsHorizontalScroll = |
| 921 clientArea.width - kScrollBarWidth < this.plugin_.getDesktopWidth(); | 933 clientArea.width - kScrollBarWidth < desktopSize.width; |
| 922 } | 934 } |
| 923 } | 935 } |
| 924 | 936 |
| 925 if (needsHorizontalScroll) { | 937 if (needsHorizontalScroll) { |
| 926 scroller.classList.remove('no-horizontal-scroll'); | 938 scroller.classList.remove('no-horizontal-scroll'); |
| 927 } else { | 939 } else { |
| 928 scroller.classList.add('no-horizontal-scroll'); | 940 scroller.classList.add('no-horizontal-scroll'); |
| 929 } | 941 } |
| 930 if (needsVerticalScroll) { | 942 if (needsVerticalScroll) { |
| 931 scroller.classList.remove('no-vertical-scroll'); | 943 scroller.classList.remove('no-vertical-scroll'); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 * @param {Object} message The parsed extension message data. | 1100 * @param {Object} message The parsed extension message data. |
| 1089 * @return {boolean} True if the message was recognized, false otherwise. | 1101 * @return {boolean} True if the message was recognized, false otherwise. |
| 1090 */ | 1102 */ |
| 1091 remoting.DesktopConnectedView.prototype.handleExtensionMessage = | 1103 remoting.DesktopConnectedView.prototype.handleExtensionMessage = |
| 1092 function(type, message) { | 1104 function(type, message) { |
| 1093 if (this.videoFrameRecorder_) { | 1105 if (this.videoFrameRecorder_) { |
| 1094 return this.videoFrameRecorder_.handleMessage(type, message); | 1106 return this.videoFrameRecorder_.handleMessage(type, message); |
| 1095 } | 1107 } |
| 1096 return false; | 1108 return false; |
| 1097 }; | 1109 }; |
| OLD | NEW |