Chromium Code Reviews| Index: remoting/webapp/base/js/window_shape.js |
| diff --git a/remoting/webapp/base/js/window_shape.js b/remoting/webapp/base/js/window_shape.js |
| index ee15a0f436c85c13ed0ad815cdc4cda1cebeef66..677038d027a87c182ace83fdb83171061a5bd607 100644 |
| --- a/remoting/webapp/base/js/window_shape.js |
| +++ b/remoting/webapp/base/js/window_shape.js |
| @@ -20,7 +20,7 @@ remoting.WindowShape = function() { |
| this.desktopRects_ = []; |
| /** @private {Array<remoting.WindowShape.ClientUI>} */ |
| - this.clientUICallbacks_ = []; |
| + this.clientUIs_ = []; |
| }; |
| /** |
| @@ -31,15 +31,67 @@ remoting.WindowShape.isSupported = function() { |
| return base.isAppsV2() && |
| typeof(chrome.app.window.current().setShape) != 'undefined' && |
| !remoting.platformIsMac(); |
| -} |
| +}; |
| /** |
| - * Add a client-side UI measurement callback. |
| + * Adds a client-side UI. |
|
garykac
2015/05/19 00:39:53
The other comments are active: "Center align the..
|
| * |
| * @param {remoting.WindowShape.ClientUI} callback |
| */ |
| -remoting.WindowShape.prototype.addCallback = function(callback) { |
| - this.clientUICallbacks_.push(callback); |
| +remoting.WindowShape.prototype.registerClientUI = function(callback) { |
| + if (this.clientUIs_.indexOf(callback) === -1) { |
| + this.clientUIs_.push(callback); |
| + this.updateClientWindowShape(); |
| + } |
| +}; |
| + |
| +/** |
| + * Removes a client-side UI. |
| + * |
| + * @param {remoting.WindowShape.ClientUI} callback |
| + */ |
| +remoting.WindowShape.prototype.unregisterClientUI = function(callback) { |
| + var index = this.clientUIs_.indexOf(callback); |
| + this.clientUIs_.splice(index, 1); |
| + this.updateClientWindowShape(); |
| +}; |
| + |
| +/** |
| + * Center align a DOM element to the desktop shape. |
| + * |
| + * @param {HTMLElement} element |
| + */ |
| +remoting.WindowShape.prototype.centerToDesktop = function(element) { |
| + var desktop = { |
| + left: Number.MAX_VALUE, |
| + right: Number.MIN_VALUE, |
| + top: Number.MAX_VALUE, |
| + bottom: Number.MIN_VALUE |
| + }; |
| + |
| + // If there is no desktop window, center it to the current viewport. |
| + if (this.desktopRects_.length === 0) { |
| + desktop.left = 0; |
| + desktop.right = window.innerWidth; |
| + desktop.top = 0; |
| + desktop.bottom = window.innerHeight; |
| + } else { |
| + // Compute the union of the bounding rects of all desktop windows. |
| + this.desktopRects_.forEach(function( |
| + /**{left: number, top: number, width: number, height: number}*/ rect) { |
| + desktop.left = Math.min(rect.left, desktop.left); |
| + desktop.right = Math.max(rect.left + rect.width, desktop.right); |
| + desktop.top = Math.min(rect.top, desktop.top); |
| + desktop.bottom = Math.max(rect.top + rect.height, desktop.bottom); |
| + }); |
| + } |
| + |
| + // Center the element to the desktop window bounding rect. |
| + var rect = element.getBoundingClientRect(); |
| + var left = (desktop.right - desktop.left - rect.width) / 2 + desktop.left; |
| + var top = (desktop.bottom - desktop.top - rect.height) / 2 + desktop.top; |
| + element.style.left = left + 'px'; |
| + element.style.top = top + 'px'; |
| this.updateClientWindowShape(); |
| }; |
| @@ -63,8 +115,8 @@ remoting.WindowShape.prototype.updateClientWindowShape = function() { |
| } |
| var rects = this.desktopRects_.slice(); |
| - for (var i = 0; i < this.clientUICallbacks_.length; ++i) { |
| - this.clientUICallbacks_[i].addToRegion(rects); |
| + for (var i = 0; i < this.clientUIs_.length; ++i) { |
| + this.clientUIs_[i].addToRegion(rects); |
| } |
| for (var i = 0; i < rects.length; ++i) { |
| var rect = /** @type {ClientRect} */ (rects[i]); |