Chromium Code Reviews| Index: remoting/webapp/crd/js/client_plugin_host_desktop_impl.js |
| diff --git a/remoting/webapp/crd/js/client_plugin_host_desktop_impl.js b/remoting/webapp/crd/js/client_plugin_host_desktop_impl.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..35363d9f483912ceb3aa8e885bbb566c0ac1c9ff |
| --- /dev/null |
| +++ b/remoting/webapp/crd/js/client_plugin_host_desktop_impl.js |
| @@ -0,0 +1,141 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * @fileoverview |
| + * Provides an interface to manage the Host Desktop of a remoting session. |
| + */ |
| + |
| +var remoting = remoting || {}; |
| +remoting.ClientPlugin = remoting.ClientPlugin || {}; |
| + |
| +(function() { |
| + |
| +'use strict'; |
| + |
| +/** |
| + * @param {remoting.ClientPluginImpl} plugin |
| + * @param {function(Object):void} postMessageCallback Callback to post a message |
| + * to the Client Plugin. |
| + * |
| + * @implements {remoting.HostDesktop} |
| + * @extends {base.EventSourceImpl} |
| + * @constructor |
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl = function(plugin, postMessageCallback) { |
| + /** @private */ |
| + this.plugin_ = plugin; |
| + /** @private */ |
| + this.width_ = 0; |
| + /** @private */ |
| + this.height_ = 0; |
| + /** @private */ |
| + this.xDpi_ = 96; |
| + /** @private */ |
| + this.yDpi_ = 96; |
| + /** @private */ |
| + this.hasResizeRateLimit_ = false; |
|
Jamie
2015/02/19 22:44:04
You don't need this (or the accessor) anymore.
kelvinp
2015/02/19 23:36:20
Done.
|
| + /** @private */ |
| + this.postMessageCallback_ = postMessageCallback; |
| + |
| + this.defineEvents(base.values(remoting.HostDesktop.Events)); |
| +}; |
| +base.extend(remoting.ClientPlugin.HostDesktopImpl, base.EventSourceImpl); |
| + |
| +/** @return {boolean} */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.hasResizeRateLimit = |
| + function() { |
| + return this.hasResizeRateLimit_; |
| +}; |
| + |
| +/** @return {boolean} Whether the host supports desktop resizing. */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.isResizable = function() { |
| + return this.plugin_.hasFeature( |
| + remoting.ClientPlugin.Feature.NOTIFY_CLIENT_RESOLUTION); |
| +}; |
| + |
| +/** @return {{width:number, height:number, xDpi:number, yDpi:number}} */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.getDimensions = function() { |
| + return { |
| + width: this.width_, |
| + height: this.height_, |
| + xDpi: this.xDpi_, |
| + yDpi: this.yDpi_ |
| + }; |
| +}; |
| + |
| +/** |
| + * @param {number} width |
| + * @param {number} height |
| + * @param {number} deviceScale |
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.resize = function( |
| + width, height, deviceScale) { |
| + if (this.isResizable()) { |
| + var dpi = Math.floor(deviceScale * 96); |
| + this.postMessageCallback_({ |
| + method: 'notifyClientResolution', |
| + data: { |
| + width: Math.floor(width * deviceScale), |
| + height: Math.floor(height * deviceScale), |
| + x_dpi: dpi, |
| + y_dpi: dpi |
| + } |
| + }); |
| + } |
| +}; |
| + |
| +/** |
| + * This function is called by |this.plugin_| when the size of the host |
| + * desktop is changed. |
| + * |
| + * @param {remoting.ClientPluginMessage} message |
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.onSizeUpdated = function( |
| + message) { |
| + this.width_ = getNumberAttr(message.data, 'width'); |
| + this.height_ = getNumberAttr(message.data, 'height'); |
| + this.xDpi_ = getNumberAttr(message.data, 'x_dpi', 96); |
| + this.yDpi_ = getNumberAttr(message.data, 'y_dpi', 96); |
| + this.raiseEvent(remoting.HostDesktop.Events.sizeChanged, |
| + this.getDimensions()); |
| +}; |
| + |
| +/** |
| + * This function is called by |this.plugin_| when the shape of the host |
| + * desktop is changed. |
| + * |
| + * @param {remoting.ClientPluginMessage} message |
| + * @return {Array<{left:number, top:number, width:number, height:number}>} |
| + * rectangles of the desktop shape. |
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.onShapeUpdated = |
| + function(message) { |
| + var shapes = getArrayAttr(message.data, 'rects'); |
| + var rects = shapes.map( |
| + /** @param {Array.<number>} shape */ |
| + function(shape) { |
| + if (!Array.isArray(shape) || shape.length != 4) { |
| + throw 'Received invalid onDesktopShape message'; |
| + } |
| + |
| + // Convert the values to integers. |
| + var left = Math.floor(shape[0]); |
| + var right = Math.ceil(shape[0] + shape[2]); |
| + var top = Math.floor(shape[1]); |
| + var bottom = Math.ceil(shape[1] + shape[3]); |
| + |
| + return { |
| + left: left, |
| + top: top, |
| + width: right - left, |
| + height: bottom - top |
| + }; |
| + }); |
| + |
| + this.raiseEvent(remoting.HostDesktop.Events.shapeChanged, rects); |
| + return rects; |
| +}; |
| + |
| +}()); |