Chromium Code Reviews
[email protected] (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: chrome/browser/resources/chromeos/login/oobe.js

Issue 7980012: [ChromeOS] Reland - Make WebUI login use only needed resources. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview Out of the box experience flow (OOBE). 6 * @fileoverview Out of the box experience flow (OOBE).
7 * This is the main code for the OOBE WebUI implementation. 7 * This is the main code for the OOBE WebUI implementation.
8 */ 8 */
9 9
10 var localStrings = new LocalStrings(); 10 var localStrings = new LocalStrings();
11 11
12
13 cr.define('cr.ui', function() { 12 cr.define('cr.ui', function() {
14 const SCREEN_SIGNIN = 'signin'; 13 var DisplayManager = cr.ui.login.DisplayManager;
15 const SCREEN_GAIA_SIGNIN = 'gaia-signin';
16 const SCREEN_ACCOUNT_PICKER = 'account-picker';
17
18 /* Accelerator identifiers. Must be kept in sync with webui_login_view.cc. */
19 const ACCELERATOR_ACCESSIBILITY = 'accessibility';
20 const ACCELERATOR_CANCEL = 'cancel';
21 const ACCELERATOR_ENROLLMENT = 'enrollment';
22 14
23 /** 15 /**
24 * Constructs an Out of box controller. It manages initialization of screens, 16 * Constructs an Out of box controller. It manages initialization of screens,
25 * transitions, error messages display. 17 * transitions, error messages display.
26 * 18 * @extends {DisplayManager}
27 * @constructor 19 * @constructor
28 */ 20 */
29 function Oobe() { 21 function Oobe() {
30 } 22 }
31 23
32 cr.addSingletonGetter(Oobe); 24 cr.addSingletonGetter(Oobe);
33 25
34 Oobe.prototype = { 26 Oobe.prototype = {
35 /** 27 __proto__: DisplayManager.prototype,
36 * Registered screens.
37 */
38 screens_: [],
39
40 /**
41 * Current OOBE step, index in the screens array.
42 * @type {number}
43 */
44 currentStep_: 0,
45
46 /**
47 * Gets current screen element.
48 * @type {HTMLElement}
49 */
50 get currentScreen() {
51 return $(this.screens_[this.currentStep_]);
52 },
53
54 /**
55 * Hides/shows header (Shutdown/Add User/Cancel buttons).
56 * @param {bool} hidden Whether header is hidden.
57 */
58 set headerHidden(hidden) {
59 $('login-header-bar').hidden = hidden;
60 },
61
62 /**
63 * Handle accelerators.
64 * @param {string} name Accelerator name.
65 */
66 handleAccelerator: function(name) {
67 if (name == ACCELERATOR_ACCESSIBILITY) {
68 chrome.send('toggleAccessibility', []);
69 } else if (name == ACCELERATOR_CANCEL) {
70 if (this.currentScreen.cancel) {
71 this.currentScreen.cancel();
72 }
73 } else if (ACCELERATOR_ENROLLMENT) {
74 var currentStepId = this.screens_[this.currentStep_];
75 if (currentStepId == SCREEN_SIGNIN ||
76 currentStepId == SCREEN_GAIA_SIGNIN) {
77 chrome.send('toggleEnrollmentScreen', []);
78 }
79 }
80 },
81
82 /**
83 * Appends buttons to the button strip.
84 * @param {Array} buttons Array with the buttons to append.
85 */
86 appendButtons_ : function(buttons) {
87 if (buttons) {
88 var buttonStrip = $('button-strip');
89 for (var i = 0; i < buttons.length; ++i) {
90 var button = buttons[i];
91 buttonStrip.appendChild(button);
92 }
93 }
94 },
95
96 /**
97 * Updates a step's css classes to reflect left, current, or right position.
98 * @param {number} stepIndex step index.
99 * @param {string} state one of 'left', 'current', 'right'.
100 */
101 updateStep_: function(stepIndex, state) {
102 var stepId = this.screens_[stepIndex];
103 var step = $(stepId);
104 var header = $('header-' + stepId);
105 var states = [ 'left', 'right', 'current' ];
106 for (var i = 0; i < states.length; ++i) {
107 if (states[i] != state) {
108 step.classList.remove(states[i]);
109 header.classList.remove(states[i]);
110 }
111 }
112 step.classList.add(state);
113 header.classList.add(state);
114 },
115
116 /**
117 * Switches to the next OOBE step.
118 * @param {number} nextStepIndex Index of the next step.
119 */
120 toggleStep_: function(nextStepIndex, screenData) {
121 var currentStepId = this.screens_[this.currentStep_];
122 var nextStepId = this.screens_[nextStepIndex];
123 var oldStep = $(currentStepId);
124 var newStep = $(nextStepId);
125 var newHeader = $('header-' + nextStepId);
126
127 if (oldStep.onBeforeHide)
128 oldStep.onBeforeHide();
129
130 if (newStep.onBeforeShow)
131 newStep.onBeforeShow(screenData);
132
133 newStep.classList.remove('hidden');
134
135 if (Oobe.isOobeUI()) {
136 // Start gliding animation for OOBE steps.
137 if (nextStepIndex > this.currentStep_) {
138 for (var i = this.currentStep_; i < nextStepIndex; ++i)
139 this.updateStep_(i, 'left');
140 this.updateStep_(nextStepIndex, 'current');
141 } else if (nextStepIndex < this.currentStep_) {
142 for (var i = this.currentStep_; i > nextStepIndex; --i)
143 this.updateStep_(i, 'right');
144 this.updateStep_(nextStepIndex, 'current');
145 }
146 } else {
147 // Start fading animation for login display.
148 oldStep.classList.add('faded');
149 newStep.classList.remove('faded');
150 }
151
152 // Adjust inner container height based on new step's height.
153 $('inner-container').style.height = newStep.offsetHeight + 'px';
154
155 if (this.currentStep_ != nextStepIndex &&
156 !oldStep.classList.contains('hidden')) {
157 oldStep.addEventListener('webkitTransitionEnd', function f(e) {
158 oldStep.removeEventListener('webkitTransitionEnd', f);
159 oldStep.classList.add('hidden');
160 });
161 } else {
162 // First screen on OOBE launch.
163 newHeader.classList.remove('right');
164 }
165 this.currentStep_ = nextStepIndex;
166 $('oobe').className = nextStepId;
167 },
168
169 /**
170 * Show screen of given screen id.
171 * @param {Object} screen Screen params dict,
172 * e.g. {id: screenId, data: data}
173 */
174 showScreen: function(screen) {
175 var screenId = screen.id;
176
177 // Show sign-in screen instead of account picker if pod row is empty.
178 if (screenId == SCREEN_ACCOUNT_PICKER && $('pod-row').pods.length == 0) {
179 Oobe.showSigninUI();
180 return;
181 }
182
183 var data = screen.data;
184 var index = this.getScreenIndex_(screenId);
185 if (index >= 0)
186 this.toggleStep_(index, data);
187 $('offline-message').update();
188 },
189
190 /**
191 * Gets index of given screen id in screens_.
192 * @param {string} screenId Id of the screen to look up.
193 * @private
194 */
195 getScreenIndex_: function(screenId) {
196 for (var i = 0; i < this.screens_.length; ++i) {
197 if (this.screens_[i] == screenId)
198 return i;
199 }
200 return -1;
201 },
202
203 /**
204 * Register an oobe screen.
205 * @param {Element} el Decorated screen element.
206 */
207 registerScreen: function(el) {
208 var screenId = el.id;
209 this.screens_.push(screenId);
210
211 var header = document.createElement('span');
212 header.id = 'header-' + screenId;
213 header.className = 'header-section right';
214 header.textContent = el.header ? el.header : '';
215 $('header-sections').appendChild(header);
216
217 var dot = document.createElement('div');
218 dot.id = screenId + '-dot';
219 dot.className = 'progdot';
220 $('progress').appendChild(dot);
221
222 this.appendButtons_(el.buttons);
223 },
224
225 /**
226 * Updates headers and buttons of the screens.
227 * Should be executed on language change.
228 */
229 updateHeadersAndButtons_: function() {
230 $('button-strip').innerHTML = '';
231 for (var i = 0, screenId; screenId = this.screens_[i]; ++i) {
232 var screen = $(screenId);
233 $('header-' + screenId).textContent = screen.header;
234 this.appendButtons_(screen.buttons);
235 }
236 },
237
238 /**
239 * Prepares screens to use in login display.
240 */
241 prepareForLoginDisplay_ : function() {
242 for (var i = 0, screenId; screenId = this.screens_[i]; ++i) {
243 var screen = $(screenId);
244 screen.classList.add('faded');
245 screen.classList.remove('right');
246 screen.classList.remove('left');
247 }
248 }
249 }; 28 };
250 29
251 /** 30 /**
252 * Setups given "select" element using the list and adds callback. 31 * Setups given "select" element using the list and adds callback.
253 * @param {!Element} select Select object to be updated. 32 * @param {!Element} select Select object to be updated.
254 * @param {!Object} list List of the options to be added. 33 * @param {!Object} list List of the options to be added.
255 * @param {string} callback Callback name which should be send to Chrome or 34 * @param {string} callback Callback name which should be send to Chrome or
256 * an empty string if the event listener shouldn't be added. 35 * an empty string if the event listener shouldn't be added.
257 */ 36 */
258 Oobe.setupSelect = function(select, list, callback) { 37 Oobe.setupSelect = function(select, list, callback) {
259 select.options.length = 0; 38 select.options.length = 0;
260 for (var i = 0; i < list.length; ++i) { 39 for (var i = 0; i < list.length; ++i) {
261 var item = list[i]; 40 var item = list[i];
262 var option = 41 var option =
263 new Option(item.title, item.value, item.selected, item.selected); 42 new Option(item.title, item.value, item.selected, item.selected);
264 select.appendChild(option); 43 select.appendChild(option);
265 } 44 }
266 if (callback) { 45 if (callback) {
267 select.addEventListener('change', function(event) { 46 select.addEventListener('change', function(event) {
268 chrome.send(callback, [select.options[select.selectedIndex].value]); 47 chrome.send(callback, [select.options[select.selectedIndex].value]);
269 }); 48 });
270 } 49 }
271 } 50 }
272 51
273 /** 52 /**
274 * Returns offset (top, left) of the element.
275 * @param {!Element} element HTML element
276 * @return {!Object} The offset (top, left).
277 */
278 Oobe.getOffset = function(element) {
279 var x = 0;
280 var y = 0;
281 while(element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
282 x += element.offsetLeft - element.scrollLeft;
283 y += element.offsetTop - element.scrollTop;
284 element = element.offsetParent;
285 }
286 return { top: y, left: x };
287 };
288
289 /**
290 * Initializes the OOBE flow. This will cause all C++ handlers to 53 * Initializes the OOBE flow. This will cause all C++ handlers to
291 * be invoked to do final setup. 54 * be invoked to do final setup.
292 */ 55 */
293 Oobe.initialize = function() { 56 Oobe.initialize = function() {
294 oobe.NetworkScreen.register(); 57 oobe.NetworkScreen.register();
295 oobe.EulaScreen.register(); 58 oobe.EulaScreen.register();
296 oobe.UpdateScreen.register(); 59 oobe.UpdateScreen.register();
297 oobe.EnrollmentScreen.register(); 60 oobe.EnrollmentScreen.register();
298 oobe.OAuthEnrollmentScreen.register(); 61 oobe.OAuthEnrollmentScreen.register();
299 login.AccountPickerScreen.register(); 62 login.AccountPickerScreen.register();
300 if (localStrings.getString('authType') == 'webui') 63 login.GaiaSigninScreen.register();
301 login.SigninScreen.register();
302 else
303 login.GaiaSigninScreen.register();
304 oobe.UserImageScreen.register(); 64 oobe.UserImageScreen.register();
305 login.OfflineMessageScreen.register(); 65 login.OfflineMessageScreen.register();
306 66
307 cr.ui.Bubble.decorate($('bubble')); 67 cr.ui.Bubble.decorate($('bubble'));
68 login.HeaderBar.decorate($('login-header-bar'));
308 69
309 $('security-link').addEventListener('click', function(event) { 70 $('security-link').addEventListener('click', function(event) {
310 chrome.send('eulaOnTpmPopupOpened', []); 71 chrome.send('eulaOnTpmPopupOpened', []);
311 $('popup-overlay').hidden = false; 72 $('popup-overlay').hidden = false;
312 }); 73 });
313 $('security-ok-button').addEventListener('click', function(event) { 74 $('security-ok-button').addEventListener('click', function(event) {
314 $('popup-overlay').hidden = true; 75 $('popup-overlay').hidden = true;
315 }); 76 });
316 77
317 $('shutdown-button').addEventListener('click', function(e) {
318 chrome.send('shutdownSystem');
319 });
320 $('add-user-button').addEventListener('click', function(e) {
321 if (window.navigator.onLine) {
322 Oobe.showSigninUI();
323 } else {
324 $('bubble').showTextForElement($('add-user-button'),
325 localStrings.getString('addUserOfflineMessage'));
326 }
327 });
328 $('cancel-add-user-button').addEventListener('click', function(e) {
329 this.hidden = true;
330 $('add-user-button').hidden = false;
331 Oobe.showScreen({id: SCREEN_ACCOUNT_PICKER});
332 });
333
334 chrome.send('screenStateInitialize', []); 78 chrome.send('screenStateInitialize', []);
335 }; 79 };
336 80
337 /** 81 /**
338 * Handle accelerators. These are passed from native code instead of a JS 82 * Handle accelerators. These are passed from native code instead of a JS
339 * event handler in order to make sure that embedded iframes cannot swallow 83 * event handler in order to make sure that embedded iframes cannot swallow
340 * them. 84 * them.
341 * @param {string} name Accelerator name. 85 * @param {string} name Accelerator name.
342 */ 86 */
343 Oobe.handleAccelerator = function(name) { 87 Oobe.handleAccelerator = function(name) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 } else { 199 } else {
456 document.body.classList.add('login-display'); 200 document.body.classList.add('login-display');
457 Oobe.getInstance().prepareForLoginDisplay_(); 201 Oobe.getInstance().prepareForLoginDisplay_();
458 } 202 }
459 203
460 // Don't show header bar for OOBE. 204 // Don't show header bar for OOBE.
461 Oobe.getInstance().headerHidden = showOobe; 205 Oobe.getInstance().headerHidden = showOobe;
462 }; 206 };
463 207
464 /** 208 /**
465 * Returns true if Oobe UI is shown.
466 */
467 Oobe.isOobeUI = function() {
468 return !document.body.classList.contains('login-display');
469 };
470
471 /**
472 * Shows signin UI. 209 * Shows signin UI.
473 * @param {string} opt_email An optional email for signin UI. 210 * @param {string} opt_email An optional email for signin UI.
474 */ 211 */
475 Oobe.showSigninUI = function(opt_email) { 212 Oobe.showSigninUI = function(opt_email) {
476 $('add-user-button').hidden = true; 213 DisplayManager.showSigninUI(opt_email);
477 $('cancel-add-user-button').hidden = false;
478 $('add-user-header-bar-item').hidden = $('pod-row').pods.length == 0;
479 chrome.send('showAddUser', [opt_email]);
480 }; 214 };
481 215
482 /** 216 /**
483 * Resets sign-in input fields. 217 * Resets sign-in input fields.
484 */ 218 */
485 Oobe.resetSigninUI = function() { 219 Oobe.resetSigninUI = function() {
486 var currentScreenId = Oobe.getInstance().currentScreen.id; 220 DisplayManager.resetSigninUI();
487
488 if (localStrings.getString('authType') == 'webui')
489 $(SCREEN_SIGNIN).reset(currentScreenId == SCREEN_SIGNIN);
490 else
491 $(SCREEN_GAIA_SIGNIN).reset(currentScreenId == SCREEN_GAIA_SIGNIN);
492
493 $('pod-row').reset(currentScreenId == SCREEN_ACCOUNT_PICKER);
494 }; 221 };
495 222
496 /** 223 /**
497 * Shows sign-in error bubble. 224 * Shows sign-in error bubble.
498 * @param {number} loginAttempts Number of login attemps tried. 225 * @param {number} loginAttempts Number of login attemps tried.
499 * @param {string} message Error message to show. 226 * @param {string} message Error message to show.
500 * @param {string} link Text to use for help link. 227 * @param {string} link Text to use for help link.
501 * @param {number} helpId Help topic Id associated with help link. 228 * @param {number} helpId Help topic Id associated with help link.
502 */ 229 */
503 Oobe.showSignInError = function(loginAttempts, message, link, helpId) { 230 Oobe.showSignInError = function(loginAttempts, message, link, helpId) {
504 var currentScreenId = Oobe.getInstance().currentScreen.id; 231 DisplayManager.showSignInError(loginAttempts, message, link, helpId);
505 var anchor = undefined;
506 var anchorPos = undefined;
507 if (currentScreenId == SCREEN_SIGNIN) {
508 anchor = $('email');
509
510 // Show email field so that bubble shows up at the right location.
511 $(SCREEN_SIGNIN).reset(true);
512 } else if (currentScreenId == SCREEN_GAIA_SIGNIN) {
513 // Use anchorPos since we won't be able to get the input fields of Gaia.
514 anchorPos = Oobe.getOffset(Oobe.getInstance().currentScreen);
515
516 // Ideally, we should just use
517 // anchorPos = Oobe.getOffset($('signin-frame'));
518 // to get a good anchor point. However, this always gives (0,0) on
519 // the device.
520 // TODO(xiyuan): Figure out why the above fails and get rid of this.
521 anchorPos.left += 150; // (640 - 340) / 2
522
523 // TODO(xiyuan): Find a reliable way to align with Gaia UI.
524 anchorPos.left += 60;
525 anchorPos.top += 105;
526 } else if (currentScreenId == SCREEN_ACCOUNT_PICKER &&
527 $('pod-row').activated) {
528 const MAX_LOGIN_ATTEMMPTS_IN_POD = 3;
529 if (loginAttempts > MAX_LOGIN_ATTEMMPTS_IN_POD) {
530 Oobe.showSigninUI($('pod-row').activated.user.emailAddress);
531 return;
532 }
533
534 anchor = $('pod-row').activated.mainInput;
535 }
536 if (!anchor && !anchorPos) {
537 console.log('Warning: Failed to find anchor for error :' +
538 message);
539 return;
540 }
541
542 var error = document.createElement('div');
543
544 var messageDiv = document.createElement('div');
545 messageDiv.className = 'error-message';
546 messageDiv.textContent = message;
547 error.appendChild(messageDiv);
548
549 if (link) {
550 messageDiv.classList.add('error-message-padding');
551
552 var helpLink = document.createElement('a');
553 helpLink.href = '#';
554 helpLink.textContent = link;
555 helpLink.onclick = function(e) {
556 chrome.send('launchHelpApp', [helpId]);
557 }
558 error.appendChild(helpLink);
559 }
560
561 if (anchor)
562 $('bubble').showContentForElement(anchor, error);
563 else if (anchorPos)
564 $('bubble').showContentAt(anchorPos.left, anchorPos.top, error);
565 }; 232 };
566 233
567 /** 234 /**
568 * Clears error bubble. 235 * Clears error bubble.
569 */ 236 */
570 Oobe.clearErrors = function() { 237 Oobe.clearErrors = function() {
571 $('bubble').hide(); 238 DisplayManager.clearErrors();
572 }; 239 };
573 240
574 /** 241 /**
575 * Handles login success notification. 242 * Handles login success notification.
576 */ 243 */
577 Oobe.onLoginSuccess = function(username) { 244 Oobe.onLoginSuccess = function(username) {
578 if (Oobe.getInstance().currentScreen.id == SCREEN_ACCOUNT_PICKER) { 245 if (Oobe.getInstance().currentScreen.id == SCREEN_ACCOUNT_PICKER) {
579 // TODO(nkostylev): Enable animation back when session start jank 246 // TODO(nkostylev): Enable animation back when session start jank
580 // is reduced. See http://crosbug.com/11116 http://crosbug.com/18307 247 // is reduced. See http://crosbug.com/11116 http://crosbug.com/18307
581 // $('pod-row').startAuthenticatedAnimation(); 248 // $('pod-row').startAuthenticatedAnimation();
582 } 249 }
583 }; 250 };
584 251
585 /** 252 /**
586 * Sets text content for a div with |labelId|. 253 * Sets text content for a div with |labelId|.
587 * @param {string} labelId Id of the label div. 254 * @param {string} labelId Id of the label div.
588 * @param {string} labelText Text for the label. 255 * @param {string} labelText Text for the label.
589 */ 256 */
590 Oobe.setLabelText = function(labelId, labelText) { 257 Oobe.setLabelText = function(labelId, labelText) {
591 $(labelId).textContent = labelText; 258 DisplayManager.setLabelText(labelId, labelText);
592 }; 259 };
593 260
594 // Export 261 // Export
595 return { 262 return {
596 Oobe: Oobe 263 Oobe: Oobe
597 }; 264 };
598 }); 265 });
599 266
600 var Oobe = cr.ui.Oobe; 267 var Oobe = cr.ui.Oobe;
601 268
602 disableTextSelectAndDrag(); 269 disableTextSelectAndDrag();
603 270
604 document.addEventListener('DOMContentLoaded', cr.ui.Oobe.initialize); 271 document.addEventListener('DOMContentLoaded', cr.ui.Oobe.initialize);
OLDNEW
« no previous file with comments | « chrome/browser/resources/chromeos/login/oobe.html ('k') | chrome/browser/resources/chromeos/login/screen_gaia_signin.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698