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..2d39fc96a5423c5563c8254972e6017d9136034f |
| --- /dev/null |
| +++ b/remoting/webapp/crd/js/client_plugin_host_desktop_impl.js |
| @@ -0,0 +1,142 @@ |
| +// 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) { |
|
Jamie
2015/02/18 23:06:19
The fact that you need an explicit reference to th
kelvinp
2015/02/19 20:58:15
As discussed, the intent of this class is to separ
|
| + /** @private */ |
| + this.plugin_ = plugin; |
| + /** @private */ |
| + this.width_ = 0; |
| + /** @private */ |
| + this.height_ = 0; |
| + /** @private */ |
| + this.xDpi_ = 96; |
| + /** @private */ |
| + this.yDpi_ = 96; |
| + /** @private */ |
| + this.hasResizeRateLimit_ = false; |
| + /** @private */ |
| + this.postMessageCallback_ = postMessageCallback; |
| + |
| + this.defineEvents(Object.keys(remoting.HostDesktop.Events)); |
|
Jamie
2015/02/18 23:06:19
s/Object.keys/base.values/
kelvinp
2015/02/19 20:58:15
Done.
|
| +}; |
| +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} device_scale |
|
Jamie
2015/02/18 23:06:19
The API declares this parameter as |dpi|, and it r
kelvinp
2015/02/19 20:58:15
Done.
|
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.resize = function( |
| + width, height, device_scale) { |
| + if (this.isResizable()) { |
| + var dpi = Math.floor(device_scale * 96); |
| + this.postMessageCallback_({ |
| + method: 'notifyClientResolution', |
| + data: { |
| + width: Math.floor(width * device_scale), |
| + height: Math.floor(height * device_scale), |
| + x_dpi: dpi, |
| + y_dpi: dpi |
| + } |
| + }); |
| + } |
| +}; |
| + |
| +/** |
| + * @param {Array<string>} capabilities |
| + */ |
| +remoting.ClientPlugin.HostDesktopImpl.prototype.onSetCapabilities = function( |
|
Jamie
2015/02/18 23:06:19
I think this method is only used to set hasResizeR
kelvinp
2015/02/19 20:58:15
Done.
|
| + capabilities) { |
| + this.hasResizeRateLimit_ = this.plugin_.hasCapability( |
| + remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS); |
| +}; |
| + |
| +/** |
| + * 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( |
|
Jamie
2015/02/18 23:06:19
This method is not declared on the interface and s
kelvinp
2015/02/19 20:58:15
This class is under the clientPlugin namespace and
|
| + 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 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'; |
| + } |
| + var rect = {}; |
|
Jamie
2015/02/18 23:06:19
Optional: Elsewhere, we have code to force left, r
kelvinp
2015/02/19 20:58:15
Done.
|
| + rect.left = shape[0]; |
| + rect.top = shape[1]; |
| + rect.width = shape[2]; |
| + rect.height = shape[3]; |
| + return rect; |
| + }); |
| + |
| + this.raiseEvent(remoting.HostDesktop.Events.shapeChanged, rects); |
| + return rects; |
| +}; |
| + |
| +}()); |