Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 User pod row implementation. | 6 * @fileoverview User pod row implementation. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 cr.define('login', function() { | 9 cr.define('login', function() { |
| 10 /** | 10 /** |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 * @type {number} | 42 * @type {number} |
| 43 * @const | 43 * @const |
| 44 */ | 44 */ |
| 45 var MAX_NUMBER_OF_ROWS_UNDER_SIGNIN_BANNER = 2; | 45 var MAX_NUMBER_OF_ROWS_UNDER_SIGNIN_BANNER = 2; |
| 46 | 46 |
| 47 /** | 47 /** |
| 48 * Variables used for pod placement processing. Width and height should be | 48 * Variables used for pod placement processing. Width and height should be |
| 49 * synced with computed CSS sizes of pods. | 49 * synced with computed CSS sizes of pods. |
| 50 */ | 50 */ |
| 51 var POD_WIDTH = 180; | 51 var POD_WIDTH = 180; |
| 52 var PUBLIC_EXPANDED_WIDTH = 420; | 52 var PUBLIC_EXPANDED_BASIC_WIDTH = 500; |
| 53 var CROS_POD_HEIGHT = 213; | 53 var CROS_POD_HEIGHT = 213; |
| 54 var DESKTOP_POD_HEIGHT = 216; | 54 var DESKTOP_POD_HEIGHT = 226; |
| 55 var POD_ROW_PADDING = 10; | 55 var POD_ROW_PADDING = 10; |
| 56 var DESKTOP_ROW_PADDING = 15; | 56 var DESKTOP_ROW_PADDING = 15; |
| 57 | 57 |
| 58 /** | 58 /** |
| 59 * Minimal padding between user pod and virtual keyboard. | 59 * Minimal padding between user pod and virtual keyboard. |
| 60 * @type {number} | 60 * @type {number} |
| 61 * @const | 61 * @const |
| 62 */ | 62 */ |
| 63 var USER_POD_KEYBOARD_MIN_PADDING = 20; | 63 var USER_POD_KEYBOARD_MIN_PADDING = 20; |
| 64 | 64 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 91 */ | 91 */ |
| 92 var UserPodTabOrder = { | 92 var UserPodTabOrder = { |
| 93 POD_INPUT: 1, // Password input fields (and whole pods themselves). | 93 POD_INPUT: 1, // Password input fields (and whole pods themselves). |
| 94 HEADER_BAR: 2, // Buttons on the header bar (Shutdown, Add User). | 94 HEADER_BAR: 2, // Buttons on the header bar (Shutdown, Add User). |
| 95 ACTION_BOX: 3, // Action box buttons. | 95 ACTION_BOX: 3, // Action box buttons. |
| 96 PAD_MENU_ITEM: 4 // User pad menu items (Remove this user). | 96 PAD_MENU_ITEM: 4 // User pad menu items (Remove this user). |
| 97 }; | 97 }; |
| 98 | 98 |
| 99 /** | 99 /** |
| 100 * Supported authentication types. Keep in sync with the enum in | 100 * Supported authentication types. Keep in sync with the enum in |
| 101 * chrome/browser/chromeos/login/login_display.h | 101 * chrome/browser/signin/screenlock_bridge.h |
| 102 * @enum {number} | 102 * @enum {number} |
| 103 * @const | 103 * @const |
| 104 */ | 104 */ |
| 105 var AUTH_TYPE = { | 105 var AUTH_TYPE = { |
| 106 OFFLINE_PASSWORD: 0, | 106 OFFLINE_PASSWORD: 0, |
| 107 ONLINE_SIGN_IN: 1, | 107 ONLINE_SIGN_IN: 1, |
| 108 NUMERIC_PIN: 2, | 108 NUMERIC_PIN: 2, |
| 109 USER_CLICK: 3, | 109 USER_CLICK: 3, |
| 110 EXPAND_THEN_USER_CLICK: 4, | |
| 110 }; | 111 }; |
| 111 | 112 |
| 112 /** | 113 /** |
| 113 * Names of authentication types. | 114 * Names of authentication types. |
| 114 */ | 115 */ |
| 115 var AUTH_TYPE_NAMES = { | 116 var AUTH_TYPE_NAMES = { |
| 116 0: 'offlinePassword', | 117 0: 'offlinePassword', |
| 117 1: 'onlineSignIn', | 118 1: 'onlineSignIn', |
| 118 2: 'numericPin', | 119 2: 'numericPin', |
| 119 3: 'userClick', | 120 3: 'userClick', |
| 121 4: 'expandThenUserClick', | |
| 120 }; | 122 }; |
| 121 | 123 |
| 122 // Focus and tab order are organized as follows: | 124 // Focus and tab order are organized as follows: |
| 123 // | 125 // |
| 124 // (1) all user pods have tab index 1 so they are traversed first; | 126 // (1) all user pods have tab index 1 so they are traversed first; |
| 125 // (2) when a user pod is activated, its tab index is set to -1 and its | 127 // (2) when a user pod is activated, its tab index is set to -1 and its |
| 126 // main input field gets focus and tab index 1; | 128 // main input field gets focus and tab index 1; |
| 127 // (3) buttons on the header bar have tab index 2 so they follow user pods; | 129 // (3) buttons on the header bar have tab index 2 so they follow user pods; |
| 128 // (4) Action box buttons have tab index 3 and follow header bar buttons; | 130 // (4) Action box buttons have tab index 3 and follow header bar buttons; |
| 129 // (5) lastly, focus jumps to the Status Area and back to user pods. | 131 // (5) lastly, focus jumps to the Status Area and back to user pods. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 this.handleActionAreaButtonClick_.bind(this)); | 191 this.handleActionAreaButtonClick_.bind(this)); |
| 190 this.actionBoxAreaElement.addEventListener('keydown', | 192 this.actionBoxAreaElement.addEventListener('keydown', |
| 191 this.handleActionAreaButtonKeyDown_.bind(this)); | 193 this.handleActionAreaButtonKeyDown_.bind(this)); |
| 192 | 194 |
| 193 this.actionBoxMenuRemoveElement.addEventListener('click', | 195 this.actionBoxMenuRemoveElement.addEventListener('click', |
| 194 this.handleRemoveCommandClick_.bind(this)); | 196 this.handleRemoveCommandClick_.bind(this)); |
| 195 this.actionBoxMenuRemoveElement.addEventListener('keydown', | 197 this.actionBoxMenuRemoveElement.addEventListener('keydown', |
| 196 this.handleRemoveCommandKeyDown_.bind(this)); | 198 this.handleRemoveCommandKeyDown_.bind(this)); |
| 197 this.actionBoxMenuRemoveElement.addEventListener('blur', | 199 this.actionBoxMenuRemoveElement.addEventListener('blur', |
| 198 this.handleRemoveCommandBlur_.bind(this)); | 200 this.handleRemoveCommandBlur_.bind(this)); |
| 199 | 201 this.actionBoxRemoveUserWarningButtonElement.addEventListener( |
| 200 if (this.actionBoxRemoveUserWarningButtonElement) { | 202 'click', |
|
Nikita (slow)
2014/07/10 15:56:22
nit: this guard is not needed?
bartfab (slow)
2014/07/10 15:59:24
|actionBoxRemoveUserWarningButtonElement| is the d
| |
| 201 this.actionBoxRemoveUserWarningButtonElement.addEventListener( | 203 this.handleRemoveUserConfirmationClick_.bind(this)); |
| 202 'click', | |
| 203 this.handleRemoveUserConfirmationClick_.bind(this)); | |
| 204 this.actionBoxRemoveUserWarningButtonElement.addEventListener( | 204 this.actionBoxRemoveUserWarningButtonElement.addEventListener( |
| 205 'keydown', | 205 'keydown', |
| 206 this.handleRemoveUserConfirmationKeyDown_.bind(this)); | 206 this.handleRemoveUserConfirmationKeyDown_.bind(this)); |
| 207 } | |
| 208 }, | 207 }, |
| 209 | 208 |
| 210 /** | 209 /** |
| 211 * Initializes the pod after its properties set and added to a pod row. | 210 * Initializes the pod after its properties set and added to a pod row. |
| 212 */ | 211 */ |
| 213 initialize: function() { | 212 initialize: function() { |
| 214 this.passwordElement.addEventListener('keydown', | 213 this.passwordElement.addEventListener('keydown', |
| 215 this.parentNode.handleKeyDown.bind(this.parentNode)); | 214 this.parentNode.handleKeyDown.bind(this.parentNode)); |
| 216 this.passwordElement.addEventListener('keypress', | 215 this.passwordElement.addEventListener('keypress', |
| 217 this.handlePasswordKeyPress_.bind(this)); | 216 this.handlePasswordKeyPress_.bind(this)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 }, | 277 }, |
| 279 | 278 |
| 280 /** | 279 /** |
| 281 * Height number of pixels. | 280 * Height number of pixels. |
| 282 */ | 281 */ |
| 283 get height() { | 282 get height() { |
| 284 return this.offsetHeight; | 283 return this.offsetHeight; |
| 285 }, | 284 }, |
| 286 | 285 |
| 287 /** | 286 /** |
| 288 * Gets signed in indicator element. | |
| 289 * @type {!HTMLDivElement} | |
| 290 */ | |
| 291 get signedInIndicatorElement() { | |
| 292 return this.querySelector('.signed-in-indicator'); | |
| 293 }, | |
| 294 | |
| 295 /** | |
| 296 * Gets image element. | 287 * Gets image element. |
| 297 * @type {!HTMLImageElement} | 288 * @type {!HTMLImageElement} |
| 298 */ | 289 */ |
| 299 get imageElement() { | 290 get imageElement() { |
| 300 return this.querySelector('.user-image'); | 291 return this.querySelector('.user-image'); |
| 301 }, | 292 }, |
| 302 | 293 |
| 303 /** | 294 /** |
| 304 * Gets name element. | 295 * Gets name element. |
| 305 * @type {!HTMLDivElement} | 296 * @type {!HTMLDivElement} |
| 306 */ | 297 */ |
| 307 get nameElement() { | 298 get nameElement() { |
| 308 return this.querySelector('.name'); | 299 return this.querySelector('.name'); |
| 309 }, | 300 }, |
| 310 | 301 |
| 311 /** | 302 /** |
| 303 * Gets the container holding the password field. | |
| 304 * @type {!HTMLInputElement} | |
| 305 */ | |
| 306 get passwordEntryContainerElement() { | |
| 307 return this.querySelector('.password-entry-container'); | |
| 308 }, | |
| 309 | |
| 310 /** | |
| 312 * Gets password field. | 311 * Gets password field. |
| 313 * @type {!HTMLInputElement} | 312 * @type {!HTMLInputElement} |
| 314 */ | 313 */ |
| 315 get passwordElement() { | 314 get passwordElement() { |
| 316 return this.querySelector('.password'); | 315 return this.querySelector('.password'); |
| 317 }, | 316 }, |
| 318 | 317 |
| 319 /** | 318 /** |
| 320 * Gets the password label, which is used to show a message where the | 319 * Gets the password label, which is used to show a message where the |
| 321 * password field is normally. | 320 * password field is normally. |
| 322 * @type {!HTMLInputElement} | 321 * @type {!HTMLInputElement} |
| 323 */ | 322 */ |
| 324 get passwordLabelElement() { | 323 get passwordLabelElement() { |
| 325 return this.querySelector('.password-label'); | 324 return this.querySelector('.password-label'); |
| 326 }, | 325 }, |
| 327 | 326 |
| 328 /** | 327 /** |
| 329 * Gets Caps Lock hint image. | |
| 330 * @type {!HTMLImageElement} | |
| 331 */ | |
| 332 get capslockHintElement() { | |
| 333 return this.querySelector('.capslock-hint'); | |
| 334 }, | |
| 335 | |
| 336 /** | |
| 337 * Gets user sign in button. | 328 * Gets user sign in button. |
| 338 * @type {!HTMLButtonElement} | 329 * @type {!HTMLButtonElement} |
| 339 */ | 330 */ |
| 340 get signinButtonElement() { | 331 get signinButtonElement() { |
| 341 return this.querySelector('.signin-button'); | 332 return this.querySelector('.signin-button'); |
| 342 }, | 333 }, |
| 343 | 334 |
| 344 /** | 335 /** |
| 336 * Gets the container holding the launch app button. | |
| 337 * @type {!HTMLButtonElement} | |
| 338 */ | |
| 339 get launchAppButtonContainerElement() { | |
| 340 return this.querySelector('.launch-app-button-container'); | |
| 341 }, | |
| 342 | |
| 343 /** | |
| 345 * Gets launch app button. | 344 * Gets launch app button. |
| 346 * @type {!HTMLButtonElement} | 345 * @type {!HTMLButtonElement} |
| 347 */ | 346 */ |
| 348 get launchAppButtonElement() { | 347 get launchAppButtonElement() { |
| 349 return this.querySelector('.launch-app-button'); | 348 return this.querySelector('.launch-app-button'); |
| 350 }, | 349 }, |
| 351 | 350 |
| 352 /** | 351 /** |
| 353 * Gets action box area. | 352 * Gets action box area. |
| 354 * @type {!HTMLInputElement} | 353 * @type {!HTMLInputElement} |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 367 | 366 |
| 368 /** | 367 /** |
| 369 * Gets user type bubble like multi-profiles policy restriction message. | 368 * Gets user type bubble like multi-profiles policy restriction message. |
| 370 * @type {!HTMLDivElement} | 369 * @type {!HTMLDivElement} |
| 371 */ | 370 */ |
| 372 get userTypeBubbleElement() { | 371 get userTypeBubbleElement() { |
| 373 return this.querySelector('.user-type-bubble'); | 372 return this.querySelector('.user-type-bubble'); |
| 374 }, | 373 }, |
| 375 | 374 |
| 376 /** | 375 /** |
| 377 * Gets user type icon. | |
| 378 * @type {!HTMLDivElement} | |
| 379 */ | |
| 380 get userTypeIconElement() { | |
| 381 return this.querySelector('.user-type-icon-image'); | |
| 382 }, | |
| 383 | |
| 384 /** | |
| 385 * Gets action box menu. | |
| 386 * @type {!HTMLInputElement} | |
| 387 */ | |
| 388 get actionBoxMenuElement() { | |
| 389 return this.querySelector('.action-box-menu'); | |
| 390 }, | |
| 391 | |
| 392 /** | |
| 393 * Gets action box menu title. | |
| 394 * @type {!HTMLInputElement} | |
| 395 */ | |
| 396 get actionBoxMenuTitleElement() { | |
| 397 return this.querySelector('.action-box-menu-title'); | |
| 398 }, | |
| 399 | |
| 400 /** | |
| 401 * Gets action box menu title, user name item. | 376 * Gets action box menu title, user name item. |
| 402 * @type {!HTMLInputElement} | 377 * @type {!HTMLInputElement} |
| 403 */ | 378 */ |
| 404 get actionBoxMenuTitleNameElement() { | 379 get actionBoxMenuTitleNameElement() { |
| 405 return this.querySelector('.action-box-menu-title-name'); | 380 return this.querySelector('.action-box-menu-title-name'); |
| 406 }, | 381 }, |
| 407 | 382 |
| 408 /** | 383 /** |
| 409 * Gets action box menu title, user email item. | 384 * Gets action box menu title, user email item. |
| 410 * @type {!HTMLInputElement} | 385 * @type {!HTMLInputElement} |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 456 | 431 |
| 457 /** | 432 /** |
| 458 * Gets action box menu, remove user command item div. | 433 * Gets action box menu, remove user command item div. |
| 459 * @type {!HTMLInputElement} | 434 * @type {!HTMLInputElement} |
| 460 */ | 435 */ |
| 461 get actionBoxRemoveUserWarningButtonElement() { | 436 get actionBoxRemoveUserWarningButtonElement() { |
| 462 return this.querySelector('.remove-warning-button'); | 437 return this.querySelector('.remove-warning-button'); |
| 463 }, | 438 }, |
| 464 | 439 |
| 465 /** | 440 /** |
| 466 * Gets the locked user indicator box. | |
| 467 * @type {!HTMLInputElement} | |
| 468 */ | |
| 469 get lockedIndicatorElement() { | |
| 470 return this.querySelector('.locked-indicator'); | |
| 471 }, | |
| 472 | |
| 473 /** | |
| 474 * Gets the supervised user indicator box. | |
| 475 * @type {!HTMLInputElement} | |
| 476 */ | |
| 477 get supervisedUserIndicatorElement() { | |
| 478 return this.querySelector('.supervised-indicator'); | |
| 479 }, | |
| 480 | |
| 481 /** | |
| 482 * Gets the custom icon. This icon is normally hidden, but can be shown | 441 * Gets the custom icon. This icon is normally hidden, but can be shown |
| 483 * using the chrome.screenlockPrivate API. | 442 * using the chrome.screenlockPrivate API. |
| 484 * @type {!HTMLDivElement} | 443 * @type {!HTMLDivElement} |
| 485 */ | 444 */ |
| 486 get customIconElement() { | 445 get customIconElement() { |
| 487 return this.querySelector('.custom-icon'); | 446 return this.querySelector('.custom-icon'); |
| 488 }, | 447 }, |
| 489 | 448 |
| 490 /** | 449 /** |
| 491 * Updates the user pod element. | 450 * Updates the user pod element. |
| 492 */ | 451 */ |
| 493 update: function() { | 452 update: function() { |
| 494 this.imageElement.src = 'chrome://userimage/' + this.user.username + | 453 this.imageElement.src = 'chrome://userimage/' + this.user.username + |
| 495 '?id=' + UserPod.userImageSalt_[this.user.username]; | 454 '?id=' + UserPod.userImageSalt_[this.user.username]; |
| 496 | 455 |
| 497 this.nameElement.textContent = this.user_.displayName; | 456 this.nameElement.textContent = this.user_.displayName; |
| 498 this.signedInIndicatorElement.hidden = !this.user_.signedIn; | 457 this.classList.toggle('signed-in', this.user_.signedIn); |
| 499 | 458 |
| 500 this.signinButtonElement.hidden = !this.isAuthTypeOnlineSignIn; | |
| 501 if (this.isAuthTypeUserClick) | 459 if (this.isAuthTypeUserClick) |
| 502 this.passwordLabelElement.textContent = this.authValue; | 460 this.passwordLabelElement.textContent = this.authValue; |
| 503 | 461 |
| 504 this.updateActionBoxArea(); | 462 this.updateActionBoxArea(); |
| 505 | 463 |
| 506 this.passwordElement.setAttribute('aria-label', loadTimeData.getStringF( | 464 this.passwordElement.setAttribute('aria-label', loadTimeData.getStringF( |
| 507 'passwordFieldAccessibleName', this.user_.emailAddress)); | 465 'passwordFieldAccessibleName', this.user_.emailAddress)); |
| 508 | 466 |
| 509 this.customizeUserPodPerUserType(); | 467 this.customizeUserPodPerUserType(); |
| 510 }, | 468 }, |
| 511 | 469 |
| 512 updateActionBoxArea: function() { | 470 updateActionBoxArea: function() { |
| 513 if (this.user_.publicAccount || this.user_.isApp) { | 471 if (this.user_.publicAccount || this.user_.isApp) { |
| 514 this.actionBoxAreaElement.hidden = true; | 472 this.actionBoxAreaElement.hidden = true; |
| 515 return; | 473 return; |
| 516 } | 474 } |
| 517 | 475 |
| 518 this.actionBoxAreaElement.hidden = false; | |
| 519 this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove; | 476 this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove; |
| 520 | 477 |
| 521 this.actionBoxAreaElement.setAttribute( | 478 this.actionBoxAreaElement.setAttribute( |
| 522 'aria-label', loadTimeData.getStringF( | 479 'aria-label', loadTimeData.getStringF( |
| 523 'podMenuButtonAccessibleName', this.user_.emailAddress)); | 480 'podMenuButtonAccessibleName', this.user_.emailAddress)); |
| 524 this.actionBoxMenuRemoveElement.setAttribute( | 481 this.actionBoxMenuRemoveElement.setAttribute( |
| 525 'aria-label', loadTimeData.getString( | 482 'aria-label', loadTimeData.getString( |
| 526 'podMenuRemoveItemAccessibleName')); | 483 'podMenuRemoveItemAccessibleName')); |
| 527 this.actionBoxMenuTitleNameElement.textContent = this.user_.isOwner ? | 484 this.actionBoxMenuTitleNameElement.textContent = this.user_.isOwner ? |
| 528 loadTimeData.getStringF('ownerUserPattern', this.user_.displayName) : | 485 loadTimeData.getStringF('ownerUserPattern', this.user_.displayName) : |
| 529 this.user_.displayName; | 486 this.user_.displayName; |
| 530 this.actionBoxMenuTitleEmailElement.textContent = this.user_.emailAddress; | 487 this.actionBoxMenuTitleEmailElement.textContent = this.user_.emailAddress; |
| 531 this.actionBoxMenuTitleEmailElement.hidden = | 488 this.actionBoxMenuTitleEmailElement.hidden = |
| 532 this.user_.locallyManagedUser; | 489 this.user_.locallyManagedUser; |
| 533 | 490 |
| 534 this.actionBoxMenuCommandElement.textContent = | 491 this.actionBoxMenuCommandElement.textContent = |
| 535 loadTimeData.getString('removeUser'); | 492 loadTimeData.getString('removeUser'); |
| 536 }, | 493 }, |
| 537 | 494 |
| 538 customizeUserPodPerUserType: function() { | 495 customizeUserPodPerUserType: function() { |
| 539 if (this.user_.locallyManagedUser && !this.user_.isDesktopUser) { | 496 if (this.user_.locallyManagedUser && !this.user_.isDesktopUser) { |
| 540 this.setUserPodIconType('supervised'); | 497 this.setUserPodIconType('supervised'); |
| 541 } else if (this.multiProfilesPolicyApplied) { | 498 } else if (this.multiProfilesPolicyApplied) { |
| 542 // Mark user pod as not focusable which in addition to the grayed out | 499 // Mark user pod as not focusable which in addition to the grayed out |
| 543 // filter makes it look in disabled state. | 500 // filter makes it look in disabled state. |
| 544 this.classList.add('multiprofiles-policy-applied'); | 501 this.classList.add('multiprofiles-policy-applied'); |
| 545 this.setUserPodIconType('policy'); | 502 this.setUserPodIconType('policy'); |
| 546 | 503 |
| 547 this.querySelector('.mp-policy-title').hidden = false; | |
| 548 if (this.user.multiProfilesPolicy == 'primary-only') | 504 if (this.user.multiProfilesPolicy == 'primary-only') |
| 549 this.querySelector('.mp-policy-primary-only-msg').hidden = false; | 505 this.querySelector('.mp-policy-primary-only-msg').hidden = false; |
| 550 else if (this.user.multiProfilesPolicy == 'owner-primary-only') | 506 else if (this.user.multiProfilesPolicy == 'owner-primary-only') |
| 551 this.querySelector('.mp-owner-primary-only-msg').hidden = false; | 507 this.querySelector('.mp-owner-primary-only-msg').hidden = false; |
| 552 else | 508 else |
| 553 this.querySelector('.mp-policy-not-allowed-msg').hidden = false; | 509 this.querySelector('.mp-policy-not-allowed-msg').hidden = false; |
| 554 } else if (this.user_.isApp) { | 510 } else if (this.user_.isApp) { |
| 555 this.setUserPodIconType('app'); | 511 this.setUserPodIconType('app'); |
| 556 } | 512 } |
| 557 }, | 513 }, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 605 */ | 561 */ |
| 606 get isActionBoxMenuActive() { | 562 get isActionBoxMenuActive() { |
| 607 return this.actionBoxAreaElement.classList.contains('active'); | 563 return this.actionBoxAreaElement.classList.contains('active'); |
| 608 }, | 564 }, |
| 609 set isActionBoxMenuActive(active) { | 565 set isActionBoxMenuActive(active) { |
| 610 if (active == this.isActionBoxMenuActive) | 566 if (active == this.isActionBoxMenuActive) |
| 611 return; | 567 return; |
| 612 | 568 |
| 613 if (active) { | 569 if (active) { |
| 614 this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove; | 570 this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove; |
| 615 if (this.actionBoxRemoveUserWarningElement) | 571 this.actionBoxRemoveUserWarningElement.hidden = true; |
| 616 this.actionBoxRemoveUserWarningElement.hidden = true; | |
| 617 | 572 |
| 618 // Clear focus first if another pod is focused. | 573 // Clear focus first if another pod is focused. |
| 619 if (!this.parentNode.isFocused(this)) { | 574 if (!this.parentNode.isFocused(this)) { |
| 620 this.parentNode.focusPod(undefined, true); | 575 this.parentNode.focusPod(undefined, true); |
| 621 this.actionBoxAreaElement.focus(); | 576 this.actionBoxAreaElement.focus(); |
| 622 } | 577 } |
| 623 | 578 |
| 624 // Hide user-type-bubble. | 579 // Hide user-type-bubble. |
| 625 this.userTypeBubbleElement.classList.remove('bubble-shown'); | 580 this.userTypeBubbleElement.classList.remove('bubble-shown'); |
| 626 | 581 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1027 * Boolean flag of whether the pod is showing the side pane. The flag | 982 * Boolean flag of whether the pod is showing the side pane. The flag |
| 1028 * controls whether 'expanded' class is added to the pod's class list and | 983 * controls whether 'expanded' class is added to the pod's class list and |
| 1029 * resets tab order because main input element changes when the 'expanded' | 984 * resets tab order because main input element changes when the 'expanded' |
| 1030 * state changes. | 985 * state changes. |
| 1031 * @type {boolean} | 986 * @type {boolean} |
| 1032 */ | 987 */ |
| 1033 get expanded() { | 988 get expanded() { |
| 1034 return this.classList.contains('expanded'); | 989 return this.classList.contains('expanded'); |
| 1035 }, | 990 }, |
| 1036 | 991 |
| 1037 /** | |
| 1038 * During transition final height of pod is not available because of | |
| 1039 * flexbox layout. That's why we have to calculate | |
| 1040 * the final height manually. | |
| 1041 */ | |
| 1042 get expandedHeight_() { | |
| 1043 function getTopAndBottomPadding(domElement) { | |
| 1044 return parseInt(window.getComputedStyle( | |
| 1045 domElement).getPropertyValue('padding-top')) + | |
| 1046 parseInt(window.getComputedStyle( | |
| 1047 domElement).getPropertyValue('padding-bottom')); | |
| 1048 }; | |
| 1049 var height = | |
| 1050 this.getElementsByClassName('side-pane-contents')[0].offsetHeight + | |
| 1051 this.getElementsByClassName('enter-button')[0].offsetHeight + | |
| 1052 getTopAndBottomPadding( | |
| 1053 this.getElementsByClassName('enter-button')[0]) + | |
| 1054 getTopAndBottomPadding( | |
| 1055 this.getElementsByClassName('side-pane-container')[0]) + | |
| 1056 getTopAndBottomPadding(this); | |
| 1057 return height; | |
| 1058 }, | |
| 1059 | |
| 1060 set expanded(expanded) { | 992 set expanded(expanded) { |
| 1061 if (this.expanded == expanded) | 993 if (this.expanded == expanded) |
| 1062 return; | 994 return; |
| 1063 | 995 |
| 1064 this.resetTabOrder(); | 996 this.resetTabOrder(); |
| 1065 this.classList.toggle('expanded', expanded); | 997 this.classList.toggle('expanded', expanded); |
| 1066 if (expanded) { | 998 if (expanded) { |
| 1067 var isDesktopUserManager = Oobe.getInstance().displayType == | 999 var isDesktopUserManager = Oobe.getInstance().displayType == |
| 1068 DISPLAY_TYPE.DESKTOP_USER_MANAGER; | 1000 DISPLAY_TYPE.DESKTOP_USER_MANAGER; |
| 1069 var rowPadding = isDesktopUserManager ? DESKTOP_ROW_PADDING : | 1001 var rowPadding = isDesktopUserManager ? DESKTOP_ROW_PADDING : |
| 1070 POD_ROW_PADDING; | 1002 POD_ROW_PADDING; |
| 1071 this.usualLeft = this.left; | 1003 this.usualLeft = this.left; |
| 1072 this.usualTop = this.top; | 1004 this.usualTop = this.top; |
| 1073 if (this.left + PUBLIC_EXPANDED_WIDTH > | 1005 if (this.left + PUBLIC_EXPANDED_BASIC_WIDTH > |
| 1074 $('pod-row').offsetWidth - rowPadding) | 1006 $('pod-row').offsetWidth - rowPadding) |
| 1075 this.left = $('pod-row').offsetWidth - rowPadding - | 1007 this.left = $('pod-row').offsetWidth - rowPadding - |
| 1076 PUBLIC_EXPANDED_WIDTH; | 1008 PUBLIC_EXPANDED_BASIC_WIDTH; |
| 1077 var expandedHeight = this.expandedHeight_; | |
| 1078 if (this.top + expandedHeight > $('pod-row').offsetHeight) | |
| 1079 this.top = $('pod-row').offsetHeight - expandedHeight; | |
| 1080 } else { | 1009 } else { |
| 1081 if (typeof(this.usualLeft) != 'undefined') | 1010 if (typeof(this.usualLeft) != 'undefined') |
| 1082 this.left = this.usualLeft; | 1011 this.left = this.usualLeft; |
| 1083 if (typeof(this.usualTop) != 'undefined') | 1012 if (typeof(this.usualTop) != 'undefined') |
| 1084 this.top = this.usualTop; | 1013 this.top = this.usualTop; |
| 1085 } | 1014 } |
| 1086 | 1015 |
| 1087 var self = this; | 1016 var self = this; |
| 1088 this.classList.add('animating'); | 1017 this.classList.add('animating'); |
| 1089 this.addEventListener('webkitTransitionEnd', function f(e) { | 1018 this.addEventListener('webkitTransitionEnd', function f(e) { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1103 if (this.expanded) | 1032 if (this.expanded) |
| 1104 return this.enterButtonElement; | 1033 return this.enterButtonElement; |
| 1105 else | 1034 else |
| 1106 return this.nameElement; | 1035 return this.nameElement; |
| 1107 }, | 1036 }, |
| 1108 | 1037 |
| 1109 /** @override */ | 1038 /** @override */ |
| 1110 decorate: function() { | 1039 decorate: function() { |
| 1111 UserPod.prototype.decorate.call(this); | 1040 UserPod.prototype.decorate.call(this); |
| 1112 | 1041 |
| 1113 this.classList.remove('need-password'); | |
| 1114 this.classList.add('public-account'); | 1042 this.classList.add('public-account'); |
| 1115 | 1043 |
| 1116 this.nameElement.addEventListener('keydown', (function(e) { | 1044 this.nameElement.addEventListener('keydown', (function(e) { |
| 1117 if (e.keyIdentifier == 'Enter') { | 1045 if (e.keyIdentifier == 'Enter') { |
| 1118 this.parentNode.setActivatedPod(this, e); | 1046 this.parentNode.setActivatedPod(this, e); |
| 1119 // Stop this keydown event from bubbling up to PodRow handler. | 1047 // Stop this keydown event from bubbling up to PodRow handler. |
| 1120 e.stopPropagation(); | 1048 e.stopPropagation(); |
| 1121 // Prevent default so that we don't trigger a 'click' event on the | 1049 // Prevent default so that we don't trigger a 'click' event on the |
| 1122 // newly focused "Enter" button. | 1050 // newly focused "Enter" button. |
| 1123 e.preventDefault(); | 1051 e.preventDefault(); |
| 1124 } | 1052 } |
| 1125 }).bind(this)); | 1053 }).bind(this)); |
| 1126 | 1054 |
| 1127 var learnMore = this.querySelector('.learn-more'); | 1055 var learnMore = this.querySelector('.learn-more'); |
| 1128 learnMore.addEventListener('mousedown', stopEventPropagation); | 1056 learnMore.addEventListener('mousedown', stopEventPropagation); |
| 1129 learnMore.addEventListener('click', this.handleLearnMoreEvent); | 1057 learnMore.addEventListener('click', this.handleLearnMoreEvent); |
| 1130 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); | 1058 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); |
| 1131 | 1059 |
| 1132 learnMore = this.querySelector('.side-pane-learn-more'); | 1060 learnMore = this.querySelector('.expanded-pane-learn-more'); |
| 1133 learnMore.addEventListener('click', this.handleLearnMoreEvent); | 1061 learnMore.addEventListener('click', this.handleLearnMoreEvent); |
| 1134 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); | 1062 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); |
| 1135 | 1063 |
| 1136 this.enterButtonElement.addEventListener('click', (function(e) { | 1064 this.enterButtonElement.addEventListener('click', (function(e) { |
| 1137 this.enterButtonElement.disabled = true; | 1065 this.enterButtonElement.disabled = true; |
| 1138 chrome.send('launchPublicAccount', [this.user.username]); | 1066 chrome.send('launchPublicAccount', [this.user.username]); |
| 1139 }).bind(this)); | 1067 }).bind(this)); |
| 1140 }, | 1068 }, |
| 1141 | 1069 |
| 1142 /** @override **/ | 1070 /** @override **/ |
| 1143 update: function() { | 1071 update: function() { |
| 1144 UserPod.prototype.update.call(this); | 1072 UserPod.prototype.update.call(this); |
| 1145 this.querySelector('.side-pane-name').textContent = | 1073 this.querySelector('.expanded-pane-name').textContent = |
| 1146 this.user_.displayName; | 1074 this.user_.displayName; |
| 1147 this.querySelector('.info').textContent = | 1075 this.querySelector('.info').textContent = |
| 1148 loadTimeData.getStringF('publicAccountInfoFormat', | 1076 loadTimeData.getStringF('publicAccountInfoFormat', |
| 1149 this.user_.enterpriseDomain); | 1077 this.user_.enterpriseDomain); |
| 1150 }, | 1078 }, |
| 1151 | 1079 |
| 1152 /** @override */ | 1080 /** @override */ |
| 1153 focusInput: function() { | 1081 focusInput: function() { |
| 1154 // Move tabIndex from the whole pod to the main input. | 1082 // Move tabIndex from the whole pod to the main input. |
| 1155 this.tabIndex = -1; | 1083 this.tabIndex = -1; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1223 var node = $('user-pod-template').cloneNode(true); | 1151 var node = $('user-pod-template').cloneNode(true); |
| 1224 node.removeAttribute('id'); | 1152 node.removeAttribute('id'); |
| 1225 return node; | 1153 return node; |
| 1226 }); | 1154 }); |
| 1227 | 1155 |
| 1228 DesktopUserPod.prototype = { | 1156 DesktopUserPod.prototype = { |
| 1229 __proto__: UserPod.prototype, | 1157 __proto__: UserPod.prototype, |
| 1230 | 1158 |
| 1231 /** @override */ | 1159 /** @override */ |
| 1232 get mainInput() { | 1160 get mainInput() { |
| 1233 if (!this.passwordElement.hidden) | 1161 if (this.user.needsSignin) |
| 1234 return this.passwordElement; | 1162 return this.passwordElement; |
| 1235 else | 1163 else |
| 1236 return this.nameElement; | 1164 return this.nameElement; |
| 1237 }, | 1165 }, |
| 1238 | 1166 |
| 1239 /** @override */ | 1167 /** @override */ |
| 1240 decorate: function() { | |
| 1241 UserPod.prototype.decorate.call(this); | |
| 1242 }, | |
| 1243 | |
| 1244 /** @override */ | |
| 1245 update: function() { | 1168 update: function() { |
| 1246 this.imageElement.src = this.user.userImage; | 1169 this.imageElement.src = this.user.userImage; |
| 1247 this.nameElement.textContent = this.user.displayName; | 1170 this.nameElement.textContent = this.user.displayName; |
| 1248 | 1171 |
| 1249 var isLockedUser = this.user.needsSignin; | 1172 var isLockedUser = this.user.needsSignin; |
| 1250 var isSupervisedUser = this.user.locallyManagedUser; | 1173 var isSupervisedUser = this.user.locallyManagedUser; |
| 1251 this.signinButtonElement.hidden = true; | 1174 this.classList.toggle('locked', isLockedUser); |
| 1252 this.lockedIndicatorElement.hidden = !isLockedUser; | 1175 this.classList.toggle('supervised-user', isSupervisedUser); |
| 1253 this.supervisedUserIndicatorElement.hidden = !isSupervisedUser; | |
| 1254 this.passwordElement.hidden = !isLockedUser; | |
| 1255 this.nameElement.hidden = isLockedUser; | |
| 1256 | 1176 |
| 1257 if (this.isAuthTypeUserClick) | 1177 if (this.isAuthTypeUserClick) |
| 1258 this.passwordLabelElement.textContent = this.authValue; | 1178 this.passwordLabelElement.textContent = this.authValue; |
| 1259 | 1179 |
| 1260 this.actionBoxRemoveUserWarningTextElement.hidden = isSupervisedUser; | 1180 this.actionBoxRemoveUserWarningTextElement.hidden = isSupervisedUser; |
| 1261 this.actionBoxRemoveSupervisedUserWarningTextElement.hidden = | 1181 this.actionBoxRemoveSupervisedUserWarningTextElement.hidden = |
| 1262 !isSupervisedUser; | 1182 !isSupervisedUser; |
| 1263 | 1183 |
| 1264 UserPod.prototype.updateActionBoxArea.call(this); | 1184 UserPod.prototype.updateActionBoxArea.call(this); |
| 1265 }, | 1185 }, |
| 1266 | 1186 |
| 1267 /** @override */ | 1187 /** @override */ |
| 1268 focusInput: function() { | 1188 focusInput: function() { |
| 1269 // For focused pods, display the name unless the pod is locked. | |
| 1270 var isLockedUser = this.user.needsSignin; | |
| 1271 var isSupervisedUser = this.user.locallyManagedUser; | |
| 1272 this.signinButtonElement.hidden = true; | |
| 1273 this.lockedIndicatorElement.hidden = !isLockedUser; | |
| 1274 this.supervisedUserIndicatorElement.hidden = !isSupervisedUser; | |
| 1275 this.passwordElement.hidden = !isLockedUser; | |
| 1276 this.nameElement.hidden = isLockedUser; | |
| 1277 | |
| 1278 // Move tabIndex from the whole pod to the main input. | 1189 // Move tabIndex from the whole pod to the main input. |
| 1279 this.tabIndex = -1; | 1190 this.tabIndex = -1; |
| 1280 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; | 1191 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; |
| 1281 this.mainInput.focus(); | 1192 this.mainInput.focus(); |
| 1282 }, | 1193 }, |
| 1283 | 1194 |
| 1284 /** @override */ | 1195 /** @override */ |
| 1285 reset: function(takeFocus) { | |
| 1286 // Always display the user's name for unfocused pods. | |
| 1287 if (!takeFocus) | |
| 1288 this.nameElement.hidden = false; | |
| 1289 UserPod.prototype.reset.call(this, takeFocus); | |
| 1290 }, | |
| 1291 | |
| 1292 /** @override */ | |
| 1293 activate: function(e) { | 1196 activate: function(e) { |
| 1294 if (this.passwordElement.hidden) { | 1197 if (!this.user.needsSignin) { |
| 1295 Oobe.launchUser(this.user.emailAddress, this.user.displayName); | 1198 Oobe.launchUser(this.user.emailAddress, this.user.displayName); |
| 1296 } else if (!this.passwordElement.value) { | 1199 } else if (!this.passwordElement.value) { |
| 1297 return false; | 1200 return false; |
| 1298 } else { | 1201 } else { |
| 1299 chrome.send('authenticatedLaunchUser', | 1202 chrome.send('authenticatedLaunchUser', |
| 1300 [this.user.emailAddress, | 1203 [this.user.emailAddress, |
| 1301 this.user.displayName, | 1204 this.user.displayName, |
| 1302 this.passwordElement.value]); | 1205 this.passwordElement.value]); |
| 1303 } | 1206 } |
| 1304 this.passwordElement.value = ''; | 1207 this.passwordElement.value = ''; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1339 /** @override */ | 1242 /** @override */ |
| 1340 decorate: function() { | 1243 decorate: function() { |
| 1341 UserPod.prototype.decorate.call(this); | 1244 UserPod.prototype.decorate.call(this); |
| 1342 this.launchAppButtonElement.addEventListener('click', | 1245 this.launchAppButtonElement.addEventListener('click', |
| 1343 this.activate.bind(this)); | 1246 this.activate.bind(this)); |
| 1344 }, | 1247 }, |
| 1345 | 1248 |
| 1346 /** @override */ | 1249 /** @override */ |
| 1347 update: function() { | 1250 update: function() { |
| 1348 this.imageElement.src = this.user.iconUrl; | 1251 this.imageElement.src = this.user.iconUrl; |
| 1349 if (this.user.iconHeight && this.user.iconWidth) { | |
| 1350 this.imageElement.style.height = this.user.iconHeight; | |
| 1351 this.imageElement.style.width = this.user.iconWidth; | |
| 1352 } | |
| 1353 this.imageElement.alt = this.user.label; | 1252 this.imageElement.alt = this.user.label; |
| 1354 this.imageElement.title = this.user.label; | 1253 this.imageElement.title = this.user.label; |
| 1355 this.passwordElement.hidden = true; | 1254 this.passwordEntryContainerElement.hidden = true; |
| 1356 this.signinButtonElement.hidden = true; | 1255 this.launchAppButtonContainerElement.hidden = false; |
| 1357 this.launchAppButtonElement.hidden = false; | |
| 1358 this.signedInIndicatorElement.hidden = true; | |
| 1359 this.nameElement.textContent = this.user.label; | 1256 this.nameElement.textContent = this.user.label; |
| 1360 | 1257 |
| 1361 UserPod.prototype.updateActionBoxArea.call(this); | 1258 UserPod.prototype.updateActionBoxArea.call(this); |
| 1362 UserPod.prototype.customizeUserPodPerUserType.call(this); | 1259 UserPod.prototype.customizeUserPodPerUserType.call(this); |
| 1363 }, | 1260 }, |
| 1364 | 1261 |
| 1365 /** @override */ | 1262 /** @override */ |
| 1366 get mainInput() { | 1263 get mainInput() { |
| 1367 return this.launchAppButtonElement; | 1264 return this.launchAppButtonElement; |
| 1368 }, | 1265 }, |
| 1369 | 1266 |
| 1370 /** @override */ | 1267 /** @override */ |
| 1371 focusInput: function() { | 1268 focusInput: function() { |
| 1372 this.signinButtonElement.hidden = true; | |
| 1373 this.launchAppButtonElement.hidden = false; | |
| 1374 this.passwordElement.hidden = true; | |
| 1375 | |
| 1376 // Move tabIndex from the whole pod to the main input. | 1269 // Move tabIndex from the whole pod to the main input. |
| 1377 this.tabIndex = -1; | 1270 this.tabIndex = -1; |
| 1378 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; | 1271 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; |
| 1379 this.mainInput.focus(); | 1272 this.mainInput.focus(); |
| 1380 }, | 1273 }, |
| 1381 | 1274 |
| 1382 /** @override */ | 1275 /** @override */ |
| 1383 get forceOnlineSignin() { | 1276 get forceOnlineSignin() { |
| 1384 return false; | 1277 return false; |
| 1385 }, | 1278 }, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1453 | 1346 |
| 1454 // Activated pod, i.e. the pod of current login attempt. | 1347 // Activated pod, i.e. the pod of current login attempt. |
| 1455 activatedPod_: undefined, | 1348 activatedPod_: undefined, |
| 1456 | 1349 |
| 1457 // Pod that was most recently focused, if any. | 1350 // Pod that was most recently focused, if any. |
| 1458 lastFocusedPod_: undefined, | 1351 lastFocusedPod_: undefined, |
| 1459 | 1352 |
| 1460 // Pods whose initial images haven't been loaded yet. | 1353 // Pods whose initial images haven't been loaded yet. |
| 1461 podsWithPendingImages_: [], | 1354 podsWithPendingImages_: [], |
| 1462 | 1355 |
| 1463 // Whether pod creation is animated. | |
| 1464 userAddIsAnimated_: false, | |
| 1465 | |
| 1466 // Whether pod placement has been postponed. | 1356 // Whether pod placement has been postponed. |
| 1467 podPlacementPostponed_: false, | 1357 podPlacementPostponed_: false, |
| 1468 | 1358 |
| 1469 // Standard user pod height/width. | 1359 // Standard user pod height/width. |
| 1470 userPodHeight_: 0, | 1360 userPodHeight_: 0, |
| 1471 userPodWidth_: 0, | 1361 userPodWidth_: 0, |
| 1472 | 1362 |
| 1473 // Array of apps that are shown in addition to other user pods. | 1363 // Array of apps that are shown in addition to other user pods. |
| 1474 apps_: [], | 1364 apps_: [], |
| 1475 | 1365 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1577 else | 1467 else |
| 1578 userPod = new UserPod({user: user}); | 1468 userPod = new UserPod({user: user}); |
| 1579 | 1469 |
| 1580 userPod.hidden = false; | 1470 userPod.hidden = false; |
| 1581 return userPod; | 1471 return userPod; |
| 1582 }, | 1472 }, |
| 1583 | 1473 |
| 1584 /** | 1474 /** |
| 1585 * Add an existing user pod to this pod row. | 1475 * Add an existing user pod to this pod row. |
| 1586 * @param {!Object} user User info dictionary. | 1476 * @param {!Object} user User info dictionary. |
| 1587 * @param {boolean} animated Whether to use init animation. | |
| 1588 */ | 1477 */ |
| 1589 addUserPod: function(user, animated) { | 1478 addUserPod: function(user) { |
| 1590 var userPod = this.createUserPod(user); | 1479 var userPod = this.createUserPod(user); |
| 1591 if (animated) { | |
| 1592 userPod.classList.add('init'); | |
| 1593 userPod.nameElement.classList.add('init'); | |
| 1594 } | |
| 1595 | |
| 1596 this.appendChild(userPod); | 1480 this.appendChild(userPod); |
| 1597 userPod.initialize(); | 1481 userPod.initialize(); |
| 1598 }, | 1482 }, |
| 1599 | 1483 |
| 1600 /** | 1484 /** |
| 1601 * Runs app with a given id from the list of loaded apps. | 1485 * Runs app with a given id from the list of loaded apps. |
| 1602 * @param {!string} app_id of an app to run. | 1486 * @param {!string} app_id of an app to run. |
| 1603 * @param {boolean=} opt_diagnostic_mode Whether to run the app in | 1487 * @param {boolean=} opt_diagnostic_mode Whether to run the app in |
| 1604 * diagnostic mode. Default is false. | 1488 * diagnostic mode. Default is false. |
| 1605 */ | 1489 */ |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1637 */ | 1521 */ |
| 1638 indexOf_: function(pod) { | 1522 indexOf_: function(pod) { |
| 1639 for (var i = 0; i < this.pods.length; ++i) { | 1523 for (var i = 0; i < this.pods.length; ++i) { |
| 1640 if (pod == this.pods[i]) | 1524 if (pod == this.pods[i]) |
| 1641 return i; | 1525 return i; |
| 1642 } | 1526 } |
| 1643 return -1; | 1527 return -1; |
| 1644 }, | 1528 }, |
| 1645 | 1529 |
| 1646 /** | 1530 /** |
| 1647 * Start first time show animation. | |
| 1648 */ | |
| 1649 startInitAnimation: function() { | |
| 1650 // Schedule init animation. | |
| 1651 for (var i = 0, pod; pod = this.pods[i]; ++i) { | |
| 1652 window.setTimeout(removeClass, 500 + i * 70, pod, 'init'); | |
| 1653 window.setTimeout(removeClass, 700 + i * 70, pod.nameElement, 'init'); | |
| 1654 } | |
| 1655 }, | |
| 1656 | |
| 1657 /** | |
| 1658 * Start login success animation. | |
| 1659 */ | |
| 1660 startAuthenticatedAnimation: function() { | |
| 1661 var activated = this.indexOf_(this.activatedPod_); | |
| 1662 if (activated == -1) | |
| 1663 return; | |
| 1664 | |
| 1665 for (var i = 0, pod; pod = this.pods[i]; ++i) { | |
| 1666 if (i < activated) | |
| 1667 pod.classList.add('left'); | |
| 1668 else if (i > activated) | |
| 1669 pod.classList.add('right'); | |
| 1670 else | |
| 1671 pod.classList.add('zoom'); | |
| 1672 } | |
| 1673 }, | |
| 1674 | |
| 1675 /** | |
| 1676 * Populates pod row with given existing users and start init animation. | 1531 * Populates pod row with given existing users and start init animation. |
| 1677 * @param {array} users Array of existing user emails. | 1532 * @param {array} users Array of existing user emails. |
| 1678 * @param {boolean} animated Whether to use init animation. | |
| 1679 */ | 1533 */ |
| 1680 loadPods: function(users, animated) { | 1534 loadPods: function(users) { |
| 1681 this.users_ = users; | 1535 this.users_ = users; |
| 1682 this.userAddIsAnimated_ = animated; | |
| 1683 | 1536 |
| 1684 this.rebuildPods(); | 1537 this.rebuildPods(); |
| 1685 }, | 1538 }, |
| 1686 | 1539 |
| 1687 /** | 1540 /** |
| 1688 * Scrolls focused user pod into view. | 1541 * Scrolls focused user pod into view. |
| 1689 */ | 1542 */ |
| 1690 scrollFocusedPodIntoView: function() { | 1543 scrollFocusedPodIntoView: function() { |
| 1691 var pod = this.focusedPod_; | 1544 var pod = this.focusedPod_; |
| 1692 if (!pod) | 1545 if (!pod) |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1718 this.innerHTML = ''; | 1571 this.innerHTML = ''; |
| 1719 this.focusedPod_ = undefined; | 1572 this.focusedPod_ = undefined; |
| 1720 this.activatedPod_ = undefined; | 1573 this.activatedPod_ = undefined; |
| 1721 this.lastFocusedPod_ = undefined; | 1574 this.lastFocusedPod_ = undefined; |
| 1722 | 1575 |
| 1723 // Switch off animation | 1576 // Switch off animation |
| 1724 Oobe.getInstance().toggleClass('flying-pods', false); | 1577 Oobe.getInstance().toggleClass('flying-pods', false); |
| 1725 | 1578 |
| 1726 // Populate the pod row. | 1579 // Populate the pod row. |
| 1727 for (var i = 0; i < this.users_.length; ++i) | 1580 for (var i = 0; i < this.users_.length; ++i) |
| 1728 this.addUserPod(this.users_[i], this.userAddIsAnimated_); | 1581 this.addUserPod(this.users_[i]); |
| 1729 | 1582 |
| 1730 for (var i = 0, pod; pod = this.pods[i]; ++i) | 1583 for (var i = 0, pod; pod = this.pods[i]; ++i) |
| 1731 this.podsWithPendingImages_.push(pod); | 1584 this.podsWithPendingImages_.push(pod); |
| 1732 | 1585 |
| 1733 // TODO(nkostylev): Edge case handling when kiosk apps are not fitting. | 1586 // TODO(nkostylev): Edge case handling when kiosk apps are not fitting. |
| 1734 if (this.shouldShowApps_) { | 1587 if (this.shouldShowApps_) { |
| 1735 for (var i = 0; i < this.apps_.length; ++i) | 1588 for (var i = 0; i < this.apps_.length; ++i) |
| 1736 this.addUserPod(this.apps_[i], this.userAddIsAnimated_); | 1589 this.addUserPod(this.apps_[i]); |
| 1737 } | 1590 } |
| 1738 | 1591 |
| 1739 // Make sure we eventually show the pod row, even if some image is stuck. | 1592 // Make sure we eventually show the pod row, even if some image is stuck. |
| 1740 setTimeout(function() { | 1593 setTimeout(function() { |
| 1741 $('pod-row').classList.remove('images-loading'); | 1594 $('pod-row').classList.remove('images-loading'); |
| 1742 }, POD_ROW_IMAGES_LOAD_TIMEOUT_MS); | 1595 }, POD_ROW_IMAGES_LOAD_TIMEOUT_MS); |
| 1743 | 1596 |
| 1744 var isCrosAccountPicker = $('login-header-bar').signinUIState == | 1597 var isCrosAccountPicker = $('login-header-bar').signinUIState == |
| 1745 SIGNIN_UI_STATE.ACCOUNT_PICKER; | 1598 SIGNIN_UI_STATE.ACCOUNT_PICKER; |
| 1746 var isDesktopUserManager = Oobe.getInstance().displayType == | 1599 var isDesktopUserManager = Oobe.getInstance().displayType == |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2440 if (this.podsWithPendingImages_.length == 0) { | 2293 if (this.podsWithPendingImages_.length == 0) { |
| 2441 this.classList.remove('images-loading'); | 2294 this.classList.remove('images-loading'); |
| 2442 } | 2295 } |
| 2443 } | 2296 } |
| 2444 }; | 2297 }; |
| 2445 | 2298 |
| 2446 return { | 2299 return { |
| 2447 PodRow: PodRow | 2300 PodRow: PodRow |
| 2448 }; | 2301 }; |
| 2449 }); | 2302 }); |
| OLD | NEW |