Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: remoting/webapp/window_frame.js

Issue 265393005: Implement apps v2 custom window frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove unnecessary getElementById and work-around AppWindow.restore bug. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/webapp/window_frame.css ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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 * Apps v2 custom title bar implementation
8 */
9
10 'use strict';
11
12 /** @suppress {duplicate} */
13 var remoting = remoting || {};
14
15 /**
16 * @param {HTMLElement} titleBar The root node of the title-bar DOM hierarchy.
17 * @constructor
18 */
19 remoting.WindowFrame = function(titleBar) {
20 /**
21 * @type {boolean}
22 * @private
23 */
24 this.isConnected_ = false;
25
26 /**
27 * @type {HTMLElement}
28 * @private
29 */
30 this.titleBar_ = titleBar;
31
32 /**
33 * @type {HTMLElement}
34 * @private
35 */
36 this.hoverTarget_ = /** @type {HTMLElement} */
37 (titleBar.querySelector('.window-controls-hover-target'));
38 base.debug.assert(this.hoverTarget_ != null);
39
40 /**
41 * @type {HTMLElement}
42 * @private
43 */
44 this.maximizeRestoreControl_ = /** @type {HTMLElement} */
45 (titleBar.querySelector('.window-maximize-restore'));
46 base.debug.assert(this.maximizeRestoreControl_ != null);
47
48 /**
49 * @type {Array.<{cls:string, fn: function()}>}
50 */
51 var handlers = [
52 { cls: 'window-disconnect', fn: this.disconnectSession_.bind(this) },
53 { cls: 'window-maximize-restore',
54 fn: this.maximizeOrRestoreWindow_.bind(this) },
55 { cls: 'window-minimize', fn: this.minimizeWindow_.bind(this) },
56 { cls: 'window-close', fn: window.close.bind(window) },
57 { cls: 'window-controls-stub', fn: this.toggleWindowControls_.bind(this) }
58 ];
59 for (var i = 0; i < handlers.length; ++i) {
60 var element = titleBar.querySelector('.' + handlers[i].cls);
61 base.debug.assert(element != null);
62 element.addEventListener('click', handlers[i].fn, false);
63 }
64
65 // Ensure that tool-tips are always correct.
66 this.updateMaximizeOrRestoreIconTitle_();
67 chrome.app.window.current().onMaximized.addListener(
68 this.updateMaximizeOrRestoreIconTitle_.bind(this));
69 chrome.app.window.current().onRestored.addListener(
70 this.updateMaximizeOrRestoreIconTitle_.bind(this));
71 chrome.app.window.current().onFullscreened.addListener(
72 this.updateMaximizeOrRestoreIconTitle_.bind(this));
73 };
74
75 /**
76 * @param {boolean} isConnected True if there is a connection active.
77 */
78 remoting.WindowFrame.prototype.setConnected = function(isConnected) {
79 this.isConnected_ = isConnected;
80 if (this.isConnected_) {
81 document.body.classList.add('connected');
82 } else {
83 document.body.classList.remove('connected');
84 }
85 this.updateMaximizeOrRestoreIconTitle_();
86 };
87
88 /**
89 * @return {{width: number, height: number}} The size of the window, ignoring
90 * the title-bar and window borders, if visible.
91 */
92 remoting.WindowFrame.prototype.getClientArea = function() {
93 if (chrome.app.window.current().isFullscreen()) {
94 return { 'height': window.innerHeight, 'width': window.innerWidth };
95 } else {
96 var kBorderWidth = 1;
97 var titleHeight = this.titleBar_.clientHeight;
98 return {
99 'height': window.innerHeight - titleHeight - 2 * kBorderWidth,
100 'width': window.innerWidth - 2 * kBorderWidth
101 };
102 }
103 };
104
105 /**
106 * @private
107 */
108 remoting.WindowFrame.prototype.disconnectSession_ = function() {
109 // When the user disconnects, exit full-screen mode. This should not be
kelvinp 2014/05/07 18:44:11 Nit: Do we have a bug number? We should file one
Jamie 2014/05/07 19:31:15 I agree, but I don't have a minimal repro yet. I w
110 // necessary, as we do the same thing in client_session.js when the plugin
111 // is removed. However, there seems to be a bug in chrome.AppWindow.restore
112 // that causes it to get stuck in full-screen mode without this.
113 if (chrome.app.window.current().isFullscreen()) {
114 chrome.app.window.current().restore();
115 chrome.app.window.current().restore();
116 }
117 remoting.disconnect();
118 };
119
120 /**
121 * @private
122 */
123 remoting.WindowFrame.prototype.maximizeOrRestoreWindow_ = function() {
124 /** @type {boolean} */
125 var restore =
126 chrome.app.window.current().isFullscreen() ||
127 chrome.app.window.current().isMaximized();
128 if (restore) {
129 // Restore twice: once to exit full-screen and once to exit maximized.
130 // If the app is not full-screen, or went full-screen without first
131 // being maximized, then the second restore has no effect.
132 chrome.app.window.current().restore();
133 chrome.app.window.current().restore();
134 } else {
135 chrome.app.window.current().maximize();
136 }
137 };
138
139 /**
140 * @private
141 */
142 remoting.WindowFrame.prototype.minimizeWindow_ = function() {
143 chrome.app.window.current().minimize();
144 };
145
146 /**
147 * @private
148 */
149 remoting.WindowFrame.prototype.toggleWindowControls_ = function() {
150 this.hoverTarget_.classList.toggle('opened');
151 };
152
153 /**
154 * Update the tool-top for the maximize/full-screen/restore icon to reflect
155 * its current behaviour.
156 *
157 * @private
158 */
159 remoting.WindowFrame.prototype.updateMaximizeOrRestoreIconTitle_ = function() {
160 /** @type {string} */
161 var tag = '';
162 if (chrome.app.window.current().isFullscreen()) {
163 tag = /*i18n-content*/'EXIT_FULL_SCREEN';
164 } else if (chrome.app.window.current().isMaximized()) {
165 tag = /*i18n-content*/'RESTORE_WINDOW';
166 } else if (this.isConnected_) {
167 tag = /*i18n-content*/'FULL_SCREEN';
168 } else {
169 tag = /*i18n-content*/'MAXIMIZE_WINDOW';
170 }
171 this.maximizeRestoreControl_.title = l10n.getTranslationOrError(tag);
172 };
173
174 /** @type {remoting.WindowFrame} */
175 remoting.windowFrame = null;
OLDNEW
« no previous file with comments | « remoting/webapp/window_frame.css ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698