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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 * properly handle mouse lock and delegated large cursors at the same time. | 44 * properly handle mouse lock and delegated large cursors at the same time. |
45 * This should be re-enabled (by removing this flag) once a version of | 45 * This should be re-enabled (by removing this flag) once a version of |
46 * the plugin that supports both has reached Chrome Stable channel. | 46 * the plugin that supports both has reached Chrome Stable channel. |
47 * (crbug.com/429322). | 47 * (crbug.com/429322). |
48 * | 48 * |
49 * @type {boolean} | 49 * @type {boolean} |
50 */ | 50 */ |
51 remoting.enableMouseLock = false; | 51 remoting.enableMouseLock = false; |
52 | 52 |
53 /** | 53 /** |
54 * True to enable MediaSource rendering, if available. | |
55 * The plugin also needs to support MediaSource rendering. | |
56 * | |
57 * TODO(sergeyu): Remove mediaSource renderer from the plugin and | |
58 * everywhere else. | |
59 * | |
60 * @type {boolean} | |
61 */ | |
62 remoting.enableMediaSourceRendering = false; | |
63 | |
64 /** | |
65 * @param {remoting.SignalStrategy} signalStrategy Signal strategy. | 54 * @param {remoting.SignalStrategy} signalStrategy Signal strategy. |
66 * @param {HTMLElement} container Container element for the client view. | 55 * @param {HTMLElement} container Container element for the client view. |
67 * @param {string} hostDisplayName A human-readable name for the host. | 56 * @param {string} hostDisplayName A human-readable name for the host. |
68 * @param {string} accessCode The IT2Me access code. Blank for Me2Me. | 57 * @param {string} accessCode The IT2Me access code. Blank for Me2Me. |
69 * @param {function(boolean, function(string): void): void} fetchPin | 58 * @param {function(boolean, function(string): void): void} fetchPin |
70 * Called by Me2Me connections when a PIN needs to be obtained | 59 * Called by Me2Me connections when a PIN needs to be obtained |
71 * interactively. | 60 * interactively. |
72 * @param {function(string, string, string, | 61 * @param {function(string, string, string, |
73 * function(string, string): void): void} | 62 * function(string, string): void): void} |
74 * fetchThirdPartyToken Called by Me2Me connections when a third party | 63 * fetchThirdPartyToken Called by Me2Me connections when a third party |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 */ | 165 */ |
177 this.logHostOfflineErrors_ = true; | 166 this.logHostOfflineErrors_ = true; |
178 | 167 |
179 /** @private */ | 168 /** @private */ |
180 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); | 169 this.callPluginLostFocus_ = this.pluginLostFocus_.bind(this); |
181 /** @private */ | 170 /** @private */ |
182 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); | 171 this.callPluginGotFocus_ = this.pluginGotFocus_.bind(this); |
183 /** @private */ | 172 /** @private */ |
184 this.callOnFullScreenChanged_ = this.onFullScreenChanged_.bind(this) | 173 this.callOnFullScreenChanged_ = this.onFullScreenChanged_.bind(this) |
185 | 174 |
186 /** @type {HTMLMediaElement} @private */ | |
187 this.video_ = null; | |
188 | |
189 /** @type {Element} @private */ | 175 /** @type {Element} @private */ |
190 this.mouseCursorOverlay_ = | 176 this.mouseCursorOverlay_ = |
191 this.container_.querySelector('.mouse-cursor-overlay'); | 177 this.container_.querySelector('.mouse-cursor-overlay'); |
192 | 178 |
193 /** @type {Element} */ | 179 /** @type {Element} */ |
194 var img = this.mouseCursorOverlay_; | 180 var img = this.mouseCursorOverlay_; |
195 /** @param {Event} event @private */ | 181 /** @param {Event} event @private */ |
196 this.updateMouseCursorPosition_ = function(event) { | 182 this.updateMouseCursorPosition_ = function(event) { |
197 img.style.top = event.y + 'px'; | 183 img.style.top = event.y + 'px'; |
198 img.style.left = event.x + 'px'; | 184 img.style.left = event.x + 'px'; |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 this.applyRemapKeys_(true); | 562 this.applyRemapKeys_(true); |
577 } | 563 } |
578 | 564 |
579 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. | 565 // TODO(wez): Only allow mouse lock if the app has the pointerLock permission. |
580 // Enable automatic mouse-lock. | 566 // Enable automatic mouse-lock. |
581 if (remoting.enableMouseLock && | 567 if (remoting.enableMouseLock && |
582 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { | 568 this.plugin_.hasFeature(remoting.ClientPlugin.Feature.ALLOW_MOUSE_LOCK)) { |
583 this.plugin_.allowMouseLock(); | 569 this.plugin_.allowMouseLock(); |
584 } | 570 } |
585 | 571 |
586 // MediaSource-based rendering is only supported on Chrome 37 and above. | |
587 var chromeVersionMajor = | |
588 parseInt((remoting.getChromeVersion() || '0').split('.')[0], 10); | |
589 if (chromeVersionMajor >= 37 && | |
590 remoting.enableMediaSourceRendering && | |
591 this.plugin_.hasFeature( | |
592 remoting.ClientPlugin.Feature.MEDIA_SOURCE_RENDERING)) { | |
593 this.video_ = /** @type {HTMLMediaElement} */( | |
594 this.container_.querySelector('video')); | |
595 // Make sure that the <video> element is hidden until we get the first | |
596 // frame. | |
597 this.video_.style.width = '0px'; | |
598 this.video_.style.height = '0px'; | |
599 | |
600 var renderer = new remoting.MediaSourceRenderer(this.video_); | |
601 this.plugin_.enableMediaSourceRendering(renderer); | |
602 this.container_.classList.add('mediasource-rendering'); | |
603 } else { | |
604 this.container_.classList.remove('mediasource-rendering'); | |
605 } | |
606 | |
607 this.plugin_.setOnOutgoingIqHandler(this.sendIq_.bind(this)); | 572 this.plugin_.setOnOutgoingIqHandler(this.sendIq_.bind(this)); |
608 this.plugin_.setOnDebugMessageHandler(this.onDebugMessage_.bind(this)); | 573 this.plugin_.setOnDebugMessageHandler(this.onDebugMessage_.bind(this)); |
609 | 574 |
610 this.plugin_.setConnectionStatusUpdateHandler( | 575 this.plugin_.setConnectionStatusUpdateHandler( |
611 this.onConnectionStatusUpdate_.bind(this)); | 576 this.onConnectionStatusUpdate_.bind(this)); |
612 this.plugin_.setRouteChangedHandler(this.onRouteChanged_.bind(this)); | 577 this.plugin_.setRouteChangedHandler(this.onRouteChanged_.bind(this)); |
613 this.plugin_.setConnectionReadyHandler(this.onConnectionReady_.bind(this)); | 578 this.plugin_.setConnectionReadyHandler(this.onConnectionReady_.bind(this)); |
614 this.plugin_.setDesktopShapeUpdateHandler( | 579 this.plugin_.setDesktopShapeUpdateHandler( |
615 this.onDesktopShapeChanged_.bind(this)); | 580 this.onDesktopShapeChanged_.bind(this)); |
616 this.plugin_.setDesktopSizeUpdateHandler( | 581 this.plugin_.setDesktopSizeUpdateHandler( |
(...skipping 26 matching lines...) Expand all Loading... |
643 | 608 |
644 // Leave full-screen mode, and stop listening for related events. | 609 // Leave full-screen mode, and stop listening for related events. |
645 var listener = this.callOnFullScreenChanged_; | 610 var listener = this.callOnFullScreenChanged_; |
646 remoting.fullscreen.activate( | 611 remoting.fullscreen.activate( |
647 false, | 612 false, |
648 function() { | 613 function() { |
649 remoting.fullscreen.removeListener(listener); | 614 remoting.fullscreen.removeListener(listener); |
650 }); | 615 }); |
651 this.updateClientSessionUi_(null); | 616 this.updateClientSessionUi_(null); |
652 | 617 |
653 // Remove mediasource-rendering class from the container - this will also | |
654 // hide the <video> element. | |
655 this.container_.classList.remove('mediasource-rendering'); | |
656 | |
657 this.container_.removeEventListener('mousemove', | 618 this.container_.removeEventListener('mousemove', |
658 this.updateMouseCursorPosition_, | 619 this.updateMouseCursorPosition_, |
659 true); | 620 true); |
660 }; | 621 }; |
661 | 622 |
662 /** | 623 /** |
663 * @param {remoting.ClientSession} clientSession The active session, or null if | 624 * @param {remoting.ClientSession} clientSession The active session, or null if |
664 * there is no connection. | 625 * there is no connection. |
665 */ | 626 */ |
666 remoting.ClientSession.prototype.updateClientSessionUi_ = function( | 627 remoting.ClientSession.prototype.updateClientSessionUi_ = function( |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 } | 1299 } |
1339 if (scale <= scaleFitWidth * 0.65) { | 1300 if (scale <= scaleFitWidth * 0.65) { |
1340 scale = scaleFitWidth; | 1301 scale = scaleFitWidth; |
1341 } | 1302 } |
1342 } | 1303 } |
1343 } | 1304 } |
1344 | 1305 |
1345 var pluginWidth = Math.round(desktopWidth * scale); | 1306 var pluginWidth = Math.round(desktopWidth * scale); |
1346 var pluginHeight = Math.round(desktopHeight * scale); | 1307 var pluginHeight = Math.round(desktopHeight * scale); |
1347 | 1308 |
1348 if (this.video_) { | |
1349 this.video_.style.width = pluginWidth + 'px'; | |
1350 this.video_.style.height = pluginHeight + 'px'; | |
1351 } | |
1352 | |
1353 // Resize the plugin if necessary. | 1309 // Resize the plugin if necessary. |
1354 // TODO(wez): Handle high-DPI to high-DPI properly (crbug.com/135089). | 1310 // TODO(wez): Handle high-DPI to high-DPI properly (crbug.com/135089). |
1355 this.plugin_.element().style.width = pluginWidth + 'px'; | 1311 this.plugin_.element().style.width = pluginWidth + 'px'; |
1356 this.plugin_.element().style.height = pluginHeight + 'px'; | 1312 this.plugin_.element().style.height = pluginHeight + 'px'; |
1357 | 1313 |
1358 // Position the container. | 1314 // Position the container. |
1359 // Note that clientWidth/Height take into account scrollbars. | 1315 // Note that clientWidth/Height take into account scrollbars. |
1360 var clientWidth = document.documentElement.clientWidth; | 1316 var clientWidth = document.documentElement.clientWidth; |
1361 var clientHeight = document.documentElement.clientHeight; | 1317 var clientHeight = document.documentElement.clientHeight; |
1362 var parentNode = this.plugin_.element().parentNode; | 1318 var parentNode = this.plugin_.element().parentNode; |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 * @param {string} data Contents of the extension message. | 1724 * @param {string} data Contents of the extension message. |
1769 * @return {boolean} True if the message was recognized, false otherwise. | 1725 * @return {boolean} True if the message was recognized, false otherwise. |
1770 */ | 1726 */ |
1771 remoting.ClientSession.prototype.handleExtensionMessage = | 1727 remoting.ClientSession.prototype.handleExtensionMessage = |
1772 function(type, data) { | 1728 function(type, data) { |
1773 if (this.videoFrameRecorder_) { | 1729 if (this.videoFrameRecorder_) { |
1774 return this.videoFrameRecorder_.handleMessage(type, data); | 1730 return this.videoFrameRecorder_.handleMessage(type, data); |
1775 } | 1731 } |
1776 return false; | 1732 return false; |
1777 } | 1733 } |
OLD | NEW |