OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 /** |
| 6 * @fileoverview |
| 7 * Provides an interface to manage the Host Desktop of a remoting session. |
| 8 */ |
| 9 |
| 10 var remoting = remoting || {}; |
| 11 remoting.ClientPlugin = remoting.ClientPlugin || {}; |
| 12 |
| 13 (function() { |
| 14 |
| 15 'use strict'; |
| 16 |
| 17 /** |
| 18 * @param {remoting.ClientPluginImpl} plugin |
| 19 * @param {function(Object):void} postMessageCallback Callback to post a message |
| 20 * to the Client Plugin. |
| 21 * |
| 22 * @implements {remoting.HostDesktop} |
| 23 * @extends {base.EventSourceImpl} |
| 24 * @constructor |
| 25 */ |
| 26 remoting.ClientPlugin.HostDesktopImpl = function(plugin, postMessageCallback) { |
| 27 /** @private */ |
| 28 this.plugin_ = plugin; |
| 29 /** @private */ |
| 30 this.width_ = 0; |
| 31 /** @private */ |
| 32 this.height_ = 0; |
| 33 /** @private */ |
| 34 this.xDpi_ = 96; |
| 35 /** @private */ |
| 36 this.yDpi_ = 96; |
| 37 /** @private */ |
| 38 this.hasResizeRateLimit_ = false; |
| 39 /** @private */ |
| 40 this.postMessageCallback_ = postMessageCallback; |
| 41 |
| 42 this.defineEvents(Object.keys(remoting.HostDesktop.Events)); |
| 43 }; |
| 44 base.extend(remoting.ClientPlugin.HostDesktopImpl, base.EventSourceImpl); |
| 45 |
| 46 /** @return {boolean} */ |
| 47 remoting.ClientPlugin.HostDesktopImpl.prototype.hasResizeRateLimit = |
| 48 function() { |
| 49 return this.hasResizeRateLimit_; |
| 50 }; |
| 51 |
| 52 /** @return {boolean} Whether the host supports desktop resizing. */ |
| 53 remoting.ClientPlugin.HostDesktopImpl.prototype.isResizable = function() { |
| 54 return this.plugin_.hasFeature( |
| 55 remoting.ClientPlugin.Feature.NOTIFY_CLIENT_RESOLUTION); |
| 56 }; |
| 57 |
| 58 /** @return {{width:number, height:number, xDpi:number, yDpi:number}} */ |
| 59 remoting.ClientPlugin.HostDesktopImpl.prototype.getDimensions = function() { |
| 60 return { |
| 61 width: this.width_, |
| 62 height: this.height_, |
| 63 xDpi: this.xDpi_, |
| 64 yDpi: this.yDpi_ |
| 65 }; |
| 66 }; |
| 67 |
| 68 /** |
| 69 * @param {number} width |
| 70 * @param {number} height |
| 71 * @param {number} device_scale |
| 72 */ |
| 73 remoting.ClientPlugin.HostDesktopImpl.prototype.resize = function( |
| 74 width, height, device_scale) { |
| 75 if (this.isResizable()) { |
| 76 var dpi = Math.floor(device_scale * 96); |
| 77 this.postMessageCallback_({ |
| 78 method: 'notifyClientResolution', |
| 79 data: { |
| 80 width: Math.floor(width * device_scale), |
| 81 height: Math.floor(height * device_scale), |
| 82 x_dpi: dpi, |
| 83 y_dpi: dpi |
| 84 } |
| 85 }); |
| 86 } |
| 87 }; |
| 88 |
| 89 /** |
| 90 * @param {Array<string>} capabilities |
| 91 */ |
| 92 remoting.ClientPlugin.HostDesktopImpl.prototype.onSetCapabilities = function( |
| 93 capabilities) { |
| 94 this.hasResizeRateLimit_ = this.plugin_.hasCapability( |
| 95 remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS); |
| 96 }; |
| 97 |
| 98 /** |
| 99 * This function is called by |this.plugin_| when the size of the host |
| 100 * desktop is changed. |
| 101 * |
| 102 * @param {remoting.ClientPluginMessage} message |
| 103 */ |
| 104 remoting.ClientPlugin.HostDesktopImpl.prototype.onSizeUpdated = function( |
| 105 message) { |
| 106 this.width_ = getNumberAttr(message.data, 'width'); |
| 107 this.height_ = getNumberAttr(message.data, 'height'); |
| 108 this.xDpi_ = getNumberAttr(message.data, 'x_dpi', 96); |
| 109 this.yDpi_ = getNumberAttr(message.data, 'y_dpi', 96); |
| 110 this.raiseEvent(remoting.HostDesktop.Events.sizeChanged); |
| 111 }; |
| 112 |
| 113 /** |
| 114 * This function is called by |this.plugin_| when the shape of the host |
| 115 * desktop is changed. |
| 116 * |
| 117 * @param {remoting.ClientPluginMessage} message |
| 118 * @return {Array<{left:number, top:number, width:number, height:number}>} |
| 119 * rectangles of the desktop shape. |
| 120 */ |
| 121 remoting.ClientPlugin.HostDesktopImpl.prototype.onShapeUpdated = |
| 122 function(message) { |
| 123 var shapes = getArrayAttr(message.data, 'rects'); |
| 124 var rects = shapes.map( |
| 125 /** @param {Array.<number>} shape */ |
| 126 function(shape) { |
| 127 if (!Array.isArray(shape) || shape.length != 4) { |
| 128 throw 'Received invalid onDesktopShape message'; |
| 129 } |
| 130 var rect = {}; |
| 131 rect.left = shape[0]; |
| 132 rect.top = shape[1]; |
| 133 rect.width = shape[2]; |
| 134 rect.height = shape[3]; |
| 135 return rect; |
| 136 }); |
| 137 |
| 138 this.raiseEvent(remoting.HostDesktop.Events.shapeChanged, rects); |
| 139 return rects; |
| 140 }; |
| 141 |
| 142 }()); |
OLD | NEW |