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

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

Issue 9310050: [cros] Error bubble on login is displayed to the left of Gaia frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Whitespace. Created 8 years, 10 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 Display manager for WebUI OOBE and login. 6 * @fileoverview Display manager for WebUI OOBE and login.
7 */ 7 */
8 8
9 // TODO(xiyuan): Find a better to share those constants. 9 // TODO(xiyuan): Find a better to share those constants.
10 const SCREEN_SIGNIN = 'signin';
11 const SCREEN_GAIA_SIGNIN = 'gaia-signin'; 10 const SCREEN_GAIA_SIGNIN = 'gaia-signin';
12 const SCREEN_ACCOUNT_PICKER = 'account-picker'; 11 const SCREEN_ACCOUNT_PICKER = 'account-picker';
13 12
14 /* Accelerator identifiers. Must be kept in sync with webui_login_view.cc. */ 13 /* Accelerator identifiers. Must be kept in sync with webui_login_view.cc. */
15 const ACCELERATOR_ACCESSIBILITY = 'accessibility'; 14 const ACCELERATOR_ACCESSIBILITY = 'accessibility';
16 const ACCELERATOR_CANCEL = 'cancel'; 15 const ACCELERATOR_CANCEL = 'cancel';
17 const ACCELERATOR_ENROLLMENT = 'enrollment'; 16 const ACCELERATOR_ENROLLMENT = 'enrollment';
18 const ACCELERATOR_EXIT = 'exit'; 17 const ACCELERATOR_EXIT = 'exit';
19 const ACCELERATOR_VERSION = 'version'; 18 const ACCELERATOR_VERSION = 'version';
20 19
21 cr.define('cr.ui.login', function() { 20 cr.define('cr.ui.login', function() {
21 var Bubble = cr.ui.Bubble;
22
22 /** 23 /**
23 * Constructor a display manager that manages initialization of screens, 24 * Constructor a display manager that manages initialization of screens,
24 * transitions, error messages display. 25 * transitions, error messages display.
25 * 26 *
26 * @constructor 27 * @constructor
27 */ 28 */
28 function DisplayManager() { 29 function DisplayManager() {
29 } 30 }
30 31
31 DisplayManager.prototype = { 32 DisplayManager.prototype = {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 */ 79 */
79 handleAccelerator: function(name) { 80 handleAccelerator: function(name) {
80 if (name == ACCELERATOR_ACCESSIBILITY) { 81 if (name == ACCELERATOR_ACCESSIBILITY) {
81 chrome.send('toggleAccessibility', []); 82 chrome.send('toggleAccessibility', []);
82 } else if (name == ACCELERATOR_CANCEL) { 83 } else if (name == ACCELERATOR_CANCEL) {
83 if (this.currentScreen.cancel) { 84 if (this.currentScreen.cancel) {
84 this.currentScreen.cancel(); 85 this.currentScreen.cancel();
85 } 86 }
86 } else if (name == ACCELERATOR_ENROLLMENT) { 87 } else if (name == ACCELERATOR_ENROLLMENT) {
87 var currentStepId = this.screens_[this.currentStep_]; 88 var currentStepId = this.screens_[this.currentStep_];
88 if (currentStepId == SCREEN_SIGNIN || 89 if (currentStepId == SCREEN_GAIA_SIGNIN)
89 currentStepId == SCREEN_GAIA_SIGNIN) {
90 chrome.send('toggleEnrollmentScreen', []); 90 chrome.send('toggleEnrollmentScreen', []);
91 }
92 } else if (name == ACCELERATOR_EXIT) { 91 } else if (name == ACCELERATOR_EXIT) {
93 if (this.currentScreen.exit) { 92 if (this.currentScreen.exit) {
94 this.currentScreen.exit(); 93 this.currentScreen.exit();
95 } 94 }
96 } else if (name == ACCELERATOR_VERSION) { 95 } else if (name == ACCELERATOR_VERSION) {
97 if (this.allowToggleVersion_) 96 if (this.allowToggleVersion_)
98 $('version-labels').hidden = !$('version-labels').hidden; 97 $('version-labels').hidden = !$('version-labels').hidden;
99 } 98 }
100 }, 99 },
101 100
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 * Returns true if Oobe UI is shown. 288 * Returns true if Oobe UI is shown.
290 */ 289 */
291 isOobeUI: function() { 290 isOobeUI: function() {
292 return !document.body.classList.contains('login-display'); 291 return !document.body.classList.contains('login-display');
293 } 292 }
294 }; 293 };
295 294
296 /** 295 /**
297 * Returns offset (top, left) of the element. 296 * Returns offset (top, left) of the element.
298 * @param {!Element} element HTML element. 297 * @param {!Element} element HTML element.
299 * @return {!Object} The offset (top, left). 298 * @return {!Object} The offset (top, left, right, bottom).
altimofeev 2012/02/03 11:49:30 Seems like it is not true.
Ivan Korotkov 2012/02/07 17:18:00 Fixed.
300 */ 299 */
301 DisplayManager.getOffset = function(element) { 300 DisplayManager.getOffset = function(element) {
302 var x = 0; 301 var x = 0;
303 var y = 0; 302 var y = 0;
304 while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { 303 while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
305 x += element.offsetLeft - element.scrollLeft; 304 x += element.offsetLeft - element.scrollLeft;
306 y += element.offsetTop - element.scrollTop; 305 y += element.offsetTop - element.scrollTop;
307 element = element.offsetParent; 306 element = element.offsetParent;
308 } 307 }
309 return { top: y, left: x }; 308 return { top: y, left: x };
310 }; 309 };
311 310
312 /** 311 /**
312 * Returns position (top, left, right, bottom) of the element.
313 * @param {!Element} element HTML element.
314 * @return {!Object} Element position (top, left, right, bottom).
315 */
316 DisplayManager.getPosition = function(element) {
317 var offset = DisplayManager.getOffset(element);
318 return { top: offset.top,
319 right: window.innerWidth - element.offsetWidth - offset.left,
320 bottom: window.innerHeight - element.offsetHeight - offset.top,
321 left: offset.left };
322 };
323
324 /**
313 * Disables signin UI. 325 * Disables signin UI.
314 */ 326 */
315 DisplayManager.disableSigninUI = function() { 327 DisplayManager.disableSigninUI = function() {
316 $('login-header-bar').disabled = true; 328 $('login-header-bar').disabled = true;
317 $('pod-row').disabled = true; 329 $('pod-row').disabled = true;
318 }; 330 };
319 331
320 /** 332 /**
321 * Shows signin UI. 333 * Shows signin UI.
322 * @param {string} opt_email An optional email for signin UI. 334 * @param {string} opt_email An optional email for signin UI.
(...skipping 20 matching lines...) Expand all
343 355
344 /** 356 /**
345 * Shows sign-in error bubble. 357 * Shows sign-in error bubble.
346 * @param {number} loginAttempts Number of login attemps tried. 358 * @param {number} loginAttempts Number of login attemps tried.
347 * @param {string} message Error message to show. 359 * @param {string} message Error message to show.
348 * @param {string} link Text to use for help link. 360 * @param {string} link Text to use for help link.
349 * @param {number} helpId Help topic Id associated with help link. 361 * @param {number} helpId Help topic Id associated with help link.
350 */ 362 */
351 DisplayManager.showSignInError = function(loginAttempts, message, link, 363 DisplayManager.showSignInError = function(loginAttempts, message, link,
352 helpId) { 364 helpId) {
353 var currentScreenId = Oobe.getInstance().currentScreen.id;
354 var anchor = undefined;
355 var anchorPos = undefined;
356 if (currentScreenId == SCREEN_SIGNIN) {
357 anchor = $('email');
358
359 // Show email field so that bubble shows up at the right location.
360 $(SCREEN_SIGNIN).reset(true);
361 } else if (currentScreenId == SCREEN_GAIA_SIGNIN) {
362 if ($(SCREEN_GAIA_SIGNIN).isLocal) {
363 $('add-user-button').hidden = true;
364 $('cancel-add-user-button').hidden = false;
365 // Reload offline version of the sign-in extension, which will show
366 // error itself.
367 chrome.send('offlineLogin', [$(SCREEN_GAIA_SIGNIN).email]);
368 return;
369 }
370 // Use anchorPos since we won't be able to get the input fields of Gaia.
371 anchorPos = DisplayManager.getOffset(Oobe.getInstance().currentScreen);
372
373 // Ideally, we should just use
374 // anchorPos = DisplayManager.getOffset($('signin-frame'));
375 // to get a good anchor point. However, this always gives (0,0) on
376 // the device.
377 // TODO(xiyuan): Figure out why the above fails and get rid of this.
378 anchorPos.left += 150; // (640 - 340) / 2
379
380 // TODO(xiyuan): Find a reliable way to align with Gaia UI.
381 anchorPos.left += 60;
382 anchorPos.top += 105;
383 } else if (currentScreenId == SCREEN_ACCOUNT_PICKER &&
384 $('pod-row').activatedPod) {
385 const MAX_LOGIN_ATTEMMPTS_IN_POD = 3;
386 if (loginAttempts > MAX_LOGIN_ATTEMMPTS_IN_POD) {
387 $('pod-row').activatedPod.showSigninUI();
388 return;
389 }
390
391 anchor = $('pod-row').activatedPod.mainInput;
392 }
393 if (!anchor && !anchorPos) {
394 console.log('Warning: Failed to find anchor for error :' +
395 message);
396 return;
397 }
398
399 var error = document.createElement('div'); 365 var error = document.createElement('div');
400 366
401 var messageDiv = document.createElement('div'); 367 var messageDiv = document.createElement('div');
402 messageDiv.className = 'error-message'; 368 messageDiv.className = 'error-message';
403 messageDiv.textContent = message; 369 messageDiv.textContent = message;
404 error.appendChild(messageDiv); 370 error.appendChild(messageDiv);
405 371
406 if (link) { 372 if (link) {
407 messageDiv.classList.add('error-message-padding'); 373 messageDiv.classList.add('error-message-padding');
408 374
409 var helpLink = document.createElement('a'); 375 var helpLink = document.createElement('a');
410 helpLink.href = '#'; 376 helpLink.href = '#';
411 helpLink.textContent = link; 377 helpLink.textContent = link;
412 helpLink.onclick = function(e) { 378 helpLink.addEventListener('click', function(e) {
413 chrome.send('launchHelpApp', [helpId]); 379 chrome.send('launchHelpApp', [helpId]);
414 }; 380 e.preventDefault();
381 });
415 error.appendChild(helpLink); 382 error.appendChild(helpLink);
416 } 383 }
417 384
418 if (anchor) 385 var currentScreenId = Oobe.getInstance().currentScreen.id;
419 $('bubble').showContentForElement(anchor, error); 386 $(currentScreenId).showErrorBubble(loginAttempts, error);
420 else if (anchorPos)
421 $('bubble').showContentAt(anchorPos.left, anchorPos.top, error);
422 }; 387 };
423 388
424 /** 389 /**
425 * Clears error bubble. 390 * Clears error bubble.
426 */ 391 */
427 DisplayManager.clearErrors = function() { 392 DisplayManager.clearErrors = function() {
428 $('bubble').hide(); 393 $('bubble').hide();
429 }; 394 };
430 395
431 /** 396 /**
432 * Sets text content for a div with |labelId|. 397 * Sets text content for a div with |labelId|.
433 * @param {string} labelId Id of the label div. 398 * @param {string} labelId Id of the label div.
434 * @param {string} labelText Text for the label. 399 * @param {string} labelText Text for the label.
435 */ 400 */
436 DisplayManager.setLabelText = function(labelId, labelText) { 401 DisplayManager.setLabelText = function(labelId, labelText) {
437 $(labelId).textContent = labelText; 402 $(labelId).textContent = labelText;
438 }; 403 };
439 404
440 // Export 405 // Export
441 return { 406 return {
442 DisplayManager: DisplayManager 407 DisplayManager: DisplayManager
443 }; 408 };
444 }); 409 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698