Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Side by Side Diff: remoting/webapp/crd/js/desktop_connected_view.js

Issue 929323003: Separate host desktop related functionality into remoting.HostDesktop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Jamie's feedback Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 this.pluginHeightForBumpScrollTesting_ = height; 200 this.pluginHeightForBumpScrollTesting_ = height;
198 } 201 }
199 202
200 /** 203 /**
201 * Notifies the host of the client's current dimensions and DPI. 204 * Notifies the host of the client's current dimensions and DPI.
202 * Also takes into account per-host scaling factor, if configured. 205 * Also takes into account per-host scaling factor, if configured.
203 * TODO: private 206 * TODO: private
204 */ 207 */
205 remoting.DesktopConnectedView.prototype.notifyClientResolution_ = function() { 208 remoting.DesktopConnectedView.prototype.notifyClientResolution_ = function() {
206 var clientArea = this.getClientArea_(); 209 var clientArea = this.getClientArea_();
207 this.plugin_.notifyClientResolution(clientArea.width * this.desktopScale_, 210 this.plugin_.hostDesktop().resize(clientArea.width * this.desktopScale_,
208 clientArea.height * this.desktopScale_, 211 clientArea.height * this.desktopScale_,
209 window.devicePixelRatio); 212 window.devicePixelRatio);
210 }; 213 };
211 214
212 /** 215 /**
213 * Adds <embed> element to the UI container and readies the session object. 216 * Adds <embed> element to the UI container and readies the session object.
214 * 217 *
215 * @param {function(string, string):boolean} onExtensionMessage The handler for 218 * @param {function(string, string):boolean} onExtensionMessage The handler for
216 * protocol extension messages. Returns true if a message is recognized; 219 * protocol extension messages. Returns true if a message is recognized;
217 * false otherwise. 220 * false otherwise.
218 * @param {Array<string>} requiredCapabilities A list of capabilities 221 * @param {Array<string>} requiredCapabilities A list of capabilities
219 * required by this application. 222 * required by this application.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 this.applyRemapKeys_(true); 299 this.applyRemapKeys_(true);
297 } 300 }
298 301
299 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. 302 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission.
300 // Enable automatic mouse-lock. 303 // Enable automatic mouse-lock.
301 if (remoting.enableMouseLock && 304 if (remoting.enableMouseLock &&
302 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { 305 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) {
303 this.plugin_.allowMouseLock(); 306 this.plugin_.allowMouseLock();
304 } 307 }
305 308
306 this.plugin_.setDesktopShapeUpdateHandler( 309 base.dispose(this.eventHooks_);
307 this.onDesktopShapeChanged_.bind(this)); 310 var hostDesktop = this.plugin_.hostDesktop();
308 this.plugin_.setDesktopSizeUpdateHandler( 311 this.eventHooks_ = new base.Disposables(
309 this.onDesktopSizeChanged_.bind(this)); 312 new base.EventHook(
313 hostDesktop, remoting.HostDesktop.Events.sizeChanged,
314 this.onDesktopSizeChanged_.bind(this)),
315 new base.EventHook(
316 hostDesktop, remoting.HostDesktop.Events.shapeChanged,
317 this.onDesktopShapeChanged_.bind(this)));
318
310 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this)); 319 this.plugin_.setMouseCursorHandler(this.updateMouseCursorImage_.bind(this));
311 320
312 this.onInitialized_(remoting.Error.NONE, this.plugin_); 321 this.onInitialized_(remoting.Error.NONE, this.plugin_);
313 }; 322 };
314 323
315 /** 324 /**
316 * This is a callback that gets called when the plugin notifies us of a change 325 * This is a callback that gets called when the plugin notifies us of a change
317 * in the size of the remote desktop. 326 * in the size of the remote desktop.
318 * 327 *
319 * @return {void} Nothing. 328 * @return {void} Nothing.
320 * @private 329 * @private
321 */ 330 */
322 remoting.DesktopConnectedView.prototype.onDesktopSizeChanged_ = function() { 331 remoting.DesktopConnectedView.prototype.onDesktopSizeChanged_ = function() {
332 var desktop = this.plugin_.hostDesktop().getDimensions();
323 console.log('desktop size changed: ' + 333 console.log('desktop size changed: ' +
324 this.plugin_.getDesktopWidth() + 'x' + 334 desktop.width + 'x' +
325 this.plugin_.getDesktopHeight() +' @ ' + 335 desktop.height +' @ ' +
326 this.plugin_.getDesktopXDpi() + 'x' + 336 desktop.xDpi + 'x' +
327 this.plugin_.getDesktopYDpi() + ' DPI'); 337 desktop.yDpi + ' DPI');
328 this.updateDimensions(); 338 this.updateDimensions();
329 this.updateScrollbarVisibility(); 339 this.updateScrollbarVisibility();
330 }; 340 };
331 341
332 /** 342 /**
333 * Sets the non-click-through area of the client in response to notifications 343 * Sets the non-click-through area of the client in response to notifications
334 * from the plugin of desktop shape changes. 344 * from the plugin of desktop shape changes.
335 * 345 *
336 * @param {Array<Array<number>>} rects List of rectangles comprising the 346 * @param {Array<Array<number>>} rects List of rectangles comprising the
337 * desktop shape. 347 * desktop shape.
(...skipping 25 matching lines...) Expand all
363 this.updateDimensions(); 373 this.updateDimensions();
364 374
365 if (this.notifyClientResolutionTimer_) { 375 if (this.notifyClientResolutionTimer_) {
366 window.clearTimeout(this.notifyClientResolutionTimer_); 376 window.clearTimeout(this.notifyClientResolutionTimer_);
367 this.notifyClientResolutionTimer_ = null; 377 this.notifyClientResolutionTimer_ = null;
368 } 378 }
369 379
370 // Defer notifying the host of the change until the window stops resizing, to 380 // Defer notifying the host of the change until the window stops resizing, to
371 // avoid overloading the control channel with notifications. 381 // avoid overloading the control channel with notifications.
372 if (this.resizeToClient_) { 382 if (this.resizeToClient_) {
373 var kResizeRateLimitMs = 1000; 383 var kResizeRateLimitMs = 250;
374 if (this.session_.hasCapability(
375 remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS)) {
376 kResizeRateLimitMs = 250;
377 }
378 var clientArea = this.getClientArea_(); 384 var clientArea = this.getClientArea_();
379 this.notifyClientResolutionTimer_ = window.setTimeout( 385 this.notifyClientResolutionTimer_ = window.setTimeout(
380 this.notifyClientResolution_.bind(this), 386 this.notifyClientResolution_.bind(this),
381 kResizeRateLimitMs); 387 kResizeRateLimitMs);
382 } 388 }
383 389
384 // If bump-scrolling is enabled, adjust the plugin margins to fully utilize 390 // If bump-scrolling is enabled, adjust the plugin margins to fully utilize
385 // the new window area. 391 // the new window area.
386 this.resetScroll_(); 392 this.resetScroll_();
387 393
(...skipping 16 matching lines...) Expand all
404 410
405 /** 411 /**
406 * Deletes the <embed> element from the container, without sending a 412 * Deletes the <embed> element from the container, without sending a
407 * session_terminate request. This is to be called when the session was 413 * session_terminate request. This is to be called when the session was
408 * disconnected by the Host. 414 * disconnected by the Host.
409 * 415 *
410 * @return {void} Nothing. 416 * @return {void} Nothing.
411 */ 417 */
412 remoting.DesktopConnectedView.prototype.removePlugin = function() { 418 remoting.DesktopConnectedView.prototype.removePlugin = function() {
413 if (this.plugin_) { 419 if (this.plugin_) {
420 base.dispose(this.eventHooks_);
421 this.eventHooks_ = null;
414 this.plugin_.element().removeEventListener( 422 this.plugin_.element().removeEventListener(
415 'focus', this.callPluginGotFocus_, false); 423 'focus', this.callPluginGotFocus_, false);
416 this.plugin_.element().removeEventListener( 424 this.plugin_.element().removeEventListener(
417 'blur', this.callPluginLostFocus_, false); 425 'blur', this.callPluginLostFocus_, false);
418 this.plugin_.dispose(); 426 this.plugin_.dispose();
419 this.plugin_ = null; 427 this.plugin_ = null;
420 } 428 }
421 429
422 this.updateClientSessionUi_(null); 430 this.updateClientSessionUi_(null);
423 }; 431 };
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 return stopX.stop && stopY.stop; 745 return stopX.stop && stopY.stop;
738 }; 746 };
739 747
740 /** 748 /**
741 * Refreshes the plugin's dimensions, taking into account the sizes of the 749 * Refreshes the plugin's dimensions, taking into account the sizes of the
742 * remote desktop and client window, and the current scale-to-fit setting. 750 * remote desktop and client window, and the current scale-to-fit setting.
743 * 751 *
744 * @return {void} Nothing. 752 * @return {void} Nothing.
745 */ 753 */
746 remoting.DesktopConnectedView.prototype.updateDimensions = function() { 754 remoting.DesktopConnectedView.prototype.updateDimensions = function() {
747 if (this.plugin_.getDesktopWidth() == 0 || 755 var desktopSize = this.plugin_.hostDesktop().getDimensions();
748 this.plugin_.getDesktopHeight() == 0) { 756
757 if (desktopSize.width === 0 ||
758 desktopSize.height === 0) {
749 return; 759 return;
750 } 760 }
751 761
752 var desktopSize = { width: this.plugin_.getDesktopWidth(), 762 var desktopDpi = { x: desktopSize.xDpi,
753 height: this.plugin_.getDesktopHeight() }; 763 y: desktopSize.yDpi };
754 var desktopDpi = { x: this.plugin_.getDesktopXDpi(),
755 y: this.plugin_.getDesktopYDpi() };
756 var newSize = remoting.DesktopConnectedView.choosePluginSize( 764 var newSize = remoting.DesktopConnectedView.choosePluginSize(
757 this.getClientArea_(), window.devicePixelRatio, 765 this.getClientArea_(), window.devicePixelRatio,
758 desktopSize, desktopDpi, this.desktopScale_, 766 desktopSize, desktopDpi, this.desktopScale_,
759 remoting.fullscreen.isActive(), this.shrinkToFit_); 767 remoting.fullscreen.isActive(), this.shrinkToFit_);
760 768
761 // Resize the plugin if necessary. 769 // Resize the plugin if necessary.
762 console.log('plugin dimensions:' + newSize.width + 'x' + newSize.height); 770 console.log('plugin dimensions:' + newSize.width + 'x' + newSize.height);
763 this.plugin_.element().style.width = newSize.width + 'px'; 771 this.plugin_.element().style.width = newSize.width + 'px';
764 this.plugin_.element().style.height = newSize.height + 'px'; 772 this.plugin_.element().style.height = newSize.height + 'px';
765 773
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 if (!scroller) { 921 if (!scroller) {
914 return; 922 return;
915 } 923 }
916 924
917 var needsVerticalScroll = false; 925 var needsVerticalScroll = false;
918 var needsHorizontalScroll = false; 926 var needsHorizontalScroll = false;
919 if (!this.shrinkToFit_) { 927 if (!this.shrinkToFit_) {
920 // Determine whether or not horizontal or vertical scrollbars are 928 // Determine whether or not horizontal or vertical scrollbars are
921 // required, taking into account their width. 929 // required, taking into account their width.
922 var clientArea = this.getClientArea_(); 930 var clientArea = this.getClientArea_();
923 needsVerticalScroll = clientArea.height < this.plugin_.getDesktopHeight(); 931 var desktopSize = this.plugin_.hostDesktop().getDimensions();
924 needsHorizontalScroll = clientArea.width < this.plugin_.getDesktopWidth(); 932 needsVerticalScroll = clientArea.height < desktopSize.height;
933 needsHorizontalScroll = clientArea.width < desktopSize.width;
925 var kScrollBarWidth = 16; 934 var kScrollBarWidth = 16;
926 if (needsHorizontalScroll && !needsVerticalScroll) { 935 if (needsHorizontalScroll && !needsVerticalScroll) {
927 needsVerticalScroll = 936 needsVerticalScroll =
928 clientArea.height - kScrollBarWidth < this.plugin_.getDesktopHeight(); 937 clientArea.height - kScrollBarWidth < desktopSize.height;
929 } else if (!needsHorizontalScroll && needsVerticalScroll) { 938 } else if (!needsHorizontalScroll && needsVerticalScroll) {
930 needsHorizontalScroll = 939 needsHorizontalScroll =
931 clientArea.width - kScrollBarWidth < this.plugin_.getDesktopWidth(); 940 clientArea.width - kScrollBarWidth < desktopSize.width;
932 } 941 }
933 } 942 }
934 943
935 if (needsHorizontalScroll) { 944 if (needsHorizontalScroll) {
936 scroller.classList.remove('no-horizontal-scroll'); 945 scroller.classList.remove('no-horizontal-scroll');
937 } else { 946 } else {
938 scroller.classList.add('no-horizontal-scroll'); 947 scroller.classList.add('no-horizontal-scroll');
939 } 948 }
940 if (needsVerticalScroll) { 949 if (needsVerticalScroll) {
941 scroller.classList.remove('no-vertical-scroll'); 950 scroller.classList.remove('no-vertical-scroll');
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 * @param {Object} message The parsed extension message data. 1107 * @param {Object} message The parsed extension message data.
1099 * @return {boolean} True if the message was recognized, false otherwise. 1108 * @return {boolean} True if the message was recognized, false otherwise.
1100 */ 1109 */
1101 remoting.DesktopConnectedView.prototype.handleExtensionMessage = 1110 remoting.DesktopConnectedView.prototype.handleExtensionMessage =
1102 function(type, message) { 1111 function(type, message) {
1103 if (this.videoFrameRecorder_) { 1112 if (this.videoFrameRecorder_) {
1104 return this.videoFrameRecorder_.handleMessage(type, message); 1113 return this.videoFrameRecorder_.handleMessage(type, message);
1105 } 1114 }
1106 return false; 1115 return false;
1107 }; 1116 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698