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) { |
+ /** @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)); |
+}; |
+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 |
+ */ |
+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( |
+ 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( |
+ 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 = {}; |
+ 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; |
+}; |
+ |
+}()); |