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

Side by Side Diff: ui/login/account_picker/user_pod_row.js

Issue 2733953008: Add fingerprint UI in user pod (Closed)
Patch Set: Incorporate comments Created 3 years, 9 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
OLDNEW
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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 */ 118 */
119 var AUTH_TYPE_NAMES = { 119 var AUTH_TYPE_NAMES = {
120 0: 'offlinePassword', 120 0: 'offlinePassword',
121 1: 'onlineSignIn', 121 1: 'onlineSignIn',
122 2: 'numericPin', 122 2: 'numericPin',
123 3: 'userClick', 123 3: 'userClick',
124 4: 'expandThenUserClick', 124 4: 'expandThenUserClick',
125 5: 'forceOfflinePassword' 125 5: 'forceOfflinePassword'
126 }; 126 };
127 127
128 /**
129 * Supported fingerprint unlock states.
130 * @enum {number}
131 * @const
132 */
133 var FINGERPRINT_STATES = {
134 HIDDEN: 0,
135 DEFAULT: 1,
136 SIGNIN: 2,
137 FAILED: 3,
138 };
139
140 /**
141 * The fingerprint states to classes mapping.
142 * {@code state} properties indicate current fingerprint unlock state.
143 * {@code class} properties are CSS classes used to set the icons' background
144 * and password placeholder color.
145 * @const {Array<{type: !number, class: !string}>}
146 */
147 var FINGERPRINT_STATES_MAPPING = [
148 {state: FINGERPRINT_STATES.HIDDEN, class: 'hidden'},
149 {state: FINGERPRINT_STATES.DEFAULT, class: 'default'},
150 {state: FINGERPRINT_STATES.SIGNIN, class: 'signin'},
151 {state: FINGERPRINT_STATES.FAILED, class: 'failed'}
152 ];
153
128 // Focus and tab order are organized as follows: 154 // Focus and tab order are organized as follows:
129 // 155 //
130 // (1) all user pods have tab index 1 so they are traversed first; 156 // (1) all user pods have tab index 1 so they are traversed first;
131 // (2) when a user pod is activated, its tab index is set to -1 and its 157 // (2) when a user pod is activated, its tab index is set to -1 and its
132 // main input field gets focus and tab index 1; 158 // main input field gets focus and tab index 1;
133 // (3) if user pod custom icon is interactive, it has tab index 2 so it 159 // (3) if user pod custom icon is interactive, it has tab index 2 so it
134 // follows the input. 160 // follows the input.
135 // (4) buttons on the header bar have tab index 3 so they follow the custom 161 // (4) buttons on the header bar have tab index 3 so they follow the custom
136 // icon, or user pod if custom icon is not interactive; 162 // icon, or user pod if custom icon is not interactive;
137 // (5) Action box buttons have tab index 4 and follow header bar buttons; 163 // (5) Action box buttons have tab index 4 and follow header bar buttons;
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 730
705 /** 731 /**
706 * Whether click on the pod can issue a user click auth attempt. The 732 * Whether click on the pod can issue a user click auth attempt. The
707 * attempt can be issued iff the pod was focused when the click 733 * attempt can be issued iff the pod was focused when the click
708 * started (i.e. on mouse down event). 734 * started (i.e. on mouse down event).
709 * @type {boolean} 735 * @type {boolean}
710 * @private 736 * @private
711 */ 737 */
712 userClickAuthAllowed_: false, 738 userClickAuthAllowed_: false,
713 739
740 /**
741 * Whether the user has recently authenticated with fingerprint.
742 * @type {boolean}
743 * @private
744 */
745 fingerprintAuthenticated_: false,
746
714 /** @override */ 747 /** @override */
715 decorate: function() { 748 decorate: function() {
716 this.tabIndex = UserPodTabOrder.POD_INPUT; 749 this.tabIndex = UserPodTabOrder.POD_INPUT;
717 this.actionBoxAreaElement.tabIndex = UserPodTabOrder.POD_INPUT; 750 this.actionBoxAreaElement.tabIndex = UserPodTabOrder.POD_INPUT;
718 751
719 this.addEventListener('keydown', this.handlePodKeyDown_.bind(this)); 752 this.addEventListener('keydown', this.handlePodKeyDown_.bind(this));
720 this.addEventListener('click', this.handleClickOnPod_.bind(this)); 753 this.addEventListener('click', this.handleClickOnPod_.bind(this));
721 this.addEventListener('mousedown', this.handlePodMouseDown_.bind(this)); 754 this.addEventListener('mousedown', this.handlePodMouseDown_.bind(this));
722 755
723 if (this.pinKeyboard) { 756 if (this.pinKeyboard) {
(...skipping 19 matching lines...) Expand all
743 this.handleRemoveCommandClick_.bind(this)); 776 this.handleRemoveCommandClick_.bind(this));
744 this.actionBoxMenuRemoveElement.addEventListener('keydown', 777 this.actionBoxMenuRemoveElement.addEventListener('keydown',
745 this.handleRemoveCommandKeyDown_.bind(this)); 778 this.handleRemoveCommandKeyDown_.bind(this));
746 this.actionBoxMenuRemoveElement.addEventListener('blur', 779 this.actionBoxMenuRemoveElement.addEventListener('blur',
747 this.handleRemoveCommandBlur_.bind(this)); 780 this.handleRemoveCommandBlur_.bind(this));
748 this.actionBoxRemoveUserWarningButtonElement.addEventListener('click', 781 this.actionBoxRemoveUserWarningButtonElement.addEventListener('click',
749 this.handleRemoveUserConfirmationClick_.bind(this)); 782 this.handleRemoveUserConfirmationClick_.bind(this));
750 this.actionBoxRemoveUserWarningButtonElement.addEventListener('keydown', 783 this.actionBoxRemoveUserWarningButtonElement.addEventListener('keydown',
751 this.handleRemoveUserConfirmationKeyDown_.bind(this)); 784 this.handleRemoveUserConfirmationKeyDown_.bind(this));
752 785
786 if (this.fingerprintIconElement) {
787 this.fingerprintIconElement.addEventListener(
788 'mouseover', this.handleFingerprintIconMouseOver_.bind(this));
789 this.fingerprintIconElement.addEventListener(
790 'mouseout', this.handleFingerprintIconMouseOut_.bind(this));
791 this.fingerprintIconElement.addEventListener(
792 'mousedown', stopEventPropagation);
793 }
794
753 var customIcon = this.customIconElement; 795 var customIcon = this.customIconElement;
754 customIcon.parentNode.replaceChild(new UserPodCustomIcon(), customIcon); 796 customIcon.parentNode.replaceChild(new UserPodCustomIcon(), customIcon);
755 }, 797 },
756 798
757 /** 799 /**
758 * Initializes the pod after its properties set and added to a pod row. 800 * Initializes the pod after its properties set and added to a pod row.
759 */ 801 */
760 initialize: function() { 802 initialize: function() {
761 this.passwordElement.addEventListener('keydown', 803 this.passwordElement.addEventListener('keydown',
762 this.parentNode.handleKeyDown.bind(this.parentNode)); 804 this.parentNode.handleKeyDown.bind(this.parentNode));
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 'Passwords': 1131 'Passwords':
1090 this.querySelector('.action-box-remove-user-warning-passwords'), 1132 this.querySelector('.action-box-remove-user-warning-passwords'),
1091 'Bookmarks': 1133 'Bookmarks':
1092 this.querySelector('.action-box-remove-user-warning-bookmarks'), 1134 this.querySelector('.action-box-remove-user-warning-bookmarks'),
1093 'Settings': 1135 'Settings':
1094 this.querySelector('.action-box-remove-user-warning-settings') 1136 this.querySelector('.action-box-remove-user-warning-settings')
1095 } 1137 }
1096 }, 1138 },
1097 1139
1098 /** 1140 /**
1141 * Gets the fingerprint icon area.
1142 * @type {!HTMLDivElement}
1143 */
1144 get fingerprintIconElement() {
1145 return this.querySelector('.fingerprint-icon-container');
1146 },
1147
1148 /**
1099 * Updates the user pod element. 1149 * Updates the user pod element.
1100 */ 1150 */
1101 update: function() { 1151 update: function() {
1102 this.imageElement.src = 'chrome://userimage/' + this.user.username + 1152 this.imageElement.src = 'chrome://userimage/' + this.user.username +
1103 '?id=' + UserPod.userImageSalt_[this.user.username]; 1153 '?id=' + UserPod.userImageSalt_[this.user.username];
1104 1154
1105 this.nameElement.textContent = this.user_.displayName; 1155 this.nameElement.textContent = this.user_.displayName;
1106 this.reauthNameHintElement.textContent = this.user_.displayName; 1156 this.reauthNameHintElement.textContent = this.user_.displayName;
1107 this.classList.toggle('signed-in', this.user_.signedIn); 1157 this.classList.toggle('signed-in', this.user_.signedIn);
1108 1158
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 1259
1210 isPinShown: function() { 1260 isPinShown: function() {
1211 return this.classList.contains('pin-enabled'); 1261 return this.classList.contains('pin-enabled');
1212 }, 1262 },
1213 1263
1214 setUserPodIconType: function(userTypeClass) { 1264 setUserPodIconType: function(userTypeClass) {
1215 this.userTypeIconAreaElement.classList.add(userTypeClass); 1265 this.userTypeIconAreaElement.classList.add(userTypeClass);
1216 this.userTypeIconAreaElement.hidden = false; 1266 this.userTypeIconAreaElement.hidden = false;
1217 }, 1267 },
1218 1268
1269 isFingerprintIconShown: function() {
1270 return this.fingerprintIconElement && !this.fingerprintIconElement.hidden;
1271 },
1272
1219 /** 1273 /**
1220 * The user that this pod represents. 1274 * The user that this pod represents.
1221 * @type {!Object} 1275 * @type {!Object}
1222 */ 1276 */
1223 user_: undefined, 1277 user_: undefined,
1224 get user() { 1278 get user() {
1225 return this.user_; 1279 return this.user_;
1226 }, 1280 },
1227 set user(userDict) { 1281 set user(userDict) {
1228 this.user_ = userDict; 1282 this.user_ = userDict;
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1405 * @return {boolean} True if activated successfully. 1459 * @return {boolean} True if activated successfully.
1406 */ 1460 */
1407 activate: function(e) { 1461 activate: function(e) {
1408 if (this.isAuthTypeOnlineSignIn) { 1462 if (this.isAuthTypeOnlineSignIn) {
1409 this.showSigninUI(); 1463 this.showSigninUI();
1410 } else if (this.isAuthTypeUserClick) { 1464 } else if (this.isAuthTypeUserClick) {
1411 Oobe.disableSigninUI(); 1465 Oobe.disableSigninUI();
1412 this.classList.toggle('signing-in', true); 1466 this.classList.toggle('signing-in', true);
1413 chrome.send('attemptUnlock', [this.user.username]); 1467 chrome.send('attemptUnlock', [this.user.username]);
1414 } else if (this.isAuthTypePassword) { 1468 } else if (this.isAuthTypePassword) {
1469 if (this.fingerprintAuthenticated_) {
1470 this.fingerprintAuthenticated_ = false;
1471 return true;
1472 }
1415 var pinValue = this.pinKeyboard ? this.pinKeyboard.value : ''; 1473 var pinValue = this.pinKeyboard ? this.pinKeyboard.value : '';
1416 var password = this.passwordElement.value || pinValue; 1474 var password = this.passwordElement.value || pinValue;
1417 if (!password) 1475 if (!password)
1418 return false; 1476 return false;
1419 Oobe.disableSigninUI(); 1477 Oobe.disableSigninUI();
1420 chrome.send('authenticateUser', [this.user.username, password, 1478 chrome.send('authenticateUser', [this.user.username, password,
1421 this.isPinShown()]); 1479 this.isPinShown()]);
1422 } else { 1480 } else {
1423 console.error('Activating user pod with invalid authentication type: ' + 1481 console.error('Activating user pod with invalid authentication type: ' +
1424 this.authType); 1482 this.authType);
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 */ 1873 */
1816 handleRemoveUserConfirmationClick_: function(e) { 1874 handleRemoveUserConfirmationClick_: function(e) {
1817 if (this.isActionBoxMenuActive) { 1875 if (this.isActionBoxMenuActive) {
1818 this.isActionBoxMenuActive = false; 1876 this.isActionBoxMenuActive = false;
1819 this.removeUser(this.user); 1877 this.removeUser(this.user);
1820 e.stopPropagation(); 1878 e.stopPropagation();
1821 } 1879 }
1822 }, 1880 },
1823 1881
1824 /** 1882 /**
1883 * Handles mouseover event on fingerprint icon.
1884 * @param {Event} e MouseOver event.
1885 */
1886 handleFingerprintIconMouseOver_: function(e) {
1887 var bubbleContent = document.createElement('div');
1888 bubbleContent.textContent =
1889 loadTimeData.getString('fingerprintIconMessage');
1890 this.passwordElement.placeholder =
1891 loadTimeData.getString('fingerprintHint');
1892
1893 /** @const */ var BUBBLE_OFFSET = 25;
1894 /** @const */ var BUBBLE_PADDING = -8;
1895 var attachment = this.isPinShown() ? cr.ui.Bubble.Attachment.RIGHT :
1896 cr.ui.Bubble.Attachment.BOTTOM;
1897 var bubbleAnchor = this.getBubbleAnchorForFingerprintIcon_();
1898 $('bubble').showContentForElement(
1899 bubbleAnchor, attachment, bubbleContent, BUBBLE_OFFSET,
1900 BUBBLE_PADDING, true);
1901 },
1902
1903 /**
1904 * Handles mouseout event on fingerprint icon.
1905 * @param {Event} e MouseOut event.
1906 */
1907 handleFingerprintIconMouseOut_: function(e) {
1908 var bubbleAnchor = this.getBubbleAnchorForFingerprintIcon_();
1909 $('bubble').hideForElement(bubbleAnchor);
1910 this.passwordElement.placeholder = loadTimeData.getString(
1911 this.isPinShown() ? 'pinKeyboardPlaceholderPinPassword' :
1912 'passwordHint');
1913 },
1914
1915 /**
1916 * Returns bubble anchor of the fingerprint icon.
1917 * @return {!HTMLElement} Anchor element of the bubble.
1918 */
1919 getBubbleAnchorForFingerprintIcon_: function() {
1920 var bubbleAnchor = this;
1921 if (this.isPinShown())
1922 bubbleAnchor = (this.getElementsByClassName('auth-container'))[0];
1923 return bubbleAnchor;
1924 },
1925
1926 /**
1825 * Handles a keydown event on remove user confirmation button. 1927 * Handles a keydown event on remove user confirmation button.
1826 * @param {Event} e KeyDown event. 1928 * @param {Event} e KeyDown event.
1827 */ 1929 */
1828 handleRemoveUserConfirmationKeyDown_: function(e) { 1930 handleRemoveUserConfirmationKeyDown_: function(e) {
1829 if (!this.isActionBoxMenuActive) 1931 if (!this.isActionBoxMenuActive)
1830 return; 1932 return;
1831 1933
1832 // Only handle pressing 'Enter' or 'Space', and let all other events 1934 // Only handle pressing 'Enter' or 'Space', and let all other events
1833 // bubble to the action box menu. 1935 // bubble to the action box menu.
1834 if (e.key == 'Enter' || e.key == ' ') { 1936 if (e.key == 'Enter' || e.key == ' ') {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1892 */ 1994 */
1893 handlePodMouseDown_: function(e) { 1995 handlePodMouseDown_: function(e) {
1894 this.userClickAuthAllowed_ = this.parentNode.isFocused(this); 1996 this.userClickAuthAllowed_ = this.parentNode.isFocused(this);
1895 }, 1997 },
1896 1998
1897 /** 1999 /**
1898 * Called when the input of the password element changes. Updates the submit 2000 * Called when the input of the password element changes. Updates the submit
1899 * button color and state and hides the error popup bubble. 2001 * button color and state and hides the error popup bubble.
1900 */ 2002 */
1901 updateInput_: function() { 2003 updateInput_: function() {
1902 if (this.submitButton) 2004 if (this.submitButton) {
1903 this.submitButton.disabled = this.passwordElement.value.length <= 0; 2005 this.submitButton.disabled = this.passwordElement.value.length == 0;
2006 if (this.isFingerprintIconShown()) {
2007 this.submitButton.hidden = this.passwordElement.value.length == 0;
2008 } else {
2009 this.submitButton.hidden = false;
2010 }
2011 }
1904 this.showError = false; 2012 this.showError = false;
1905 $('bubble').hide(); 2013 $('bubble').hide();
1906 }, 2014 },
1907 2015
1908 /** 2016 /**
1909 * Handles input event on the password element. 2017 * Handles input event on the password element.
1910 * @param {Event} e Input event. 2018 * @param {Event} e Input event.
1911 */ 2019 */
1912 handleInputChanged_: function(e) { 2020 handleInputChanged_: function(e) {
1913 this.updateInput_(); 2021 this.updateInput_();
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after
2994 pod.customIconElement.setAriaLabel(ariaLabel); 3102 pod.customIconElement.setAriaLabel(ariaLabel);
2995 else 3103 else
2996 console.warn('No ARIA label for user pod custom icon.'); 3104 console.warn('No ARIA label for user pod custom icon.');
2997 3105
2998 pod.customIconElement.show(); 3106 pod.customIconElement.show();
2999 3107
3000 // This has to be called after |show| in case the tooltip should be shown 3108 // This has to be called after |show| in case the tooltip should be shown
3001 // immediatelly. 3109 // immediatelly.
3002 pod.customIconElement.setTooltip( 3110 pod.customIconElement.setTooltip(
3003 icon.tooltip || {text: '', autoshow: false}); 3111 icon.tooltip || {text: '', autoshow: false});
3112
3113 // Hide fingerprint icon when custom icon is shown.
3114 this.setUserPodFingerprintIcon(username, FINGERPRINT_STATES.HIDDEN);
3004 }, 3115 },
3005 3116
3006 /** 3117 /**
3007 * Hard-locks user pod for the user. If user pod is hard-locked, it can be 3118 * Hard-locks user pod for the user. If user pod is hard-locked, it can be
3008 * only unlocked using password, and the authentication type cannot be 3119 * only unlocked using password, and the authentication type cannot be
3009 * changed. 3120 * changed.
3010 * @param {!string} username The user's username. 3121 * @param {!string} username The user's username.
3011 * @private 3122 * @private
3012 */ 3123 */
3013 hardlockUserPod_: function(username) { 3124 hardlockUserPod_: function(username) {
(...skipping 16 matching lines...) Expand all
3030 */ 3141 */
3031 hideUserPodCustomIcon: function(username) { 3142 hideUserPodCustomIcon: function(username) {
3032 var pod = this.getPodWithUsername_(username); 3143 var pod = this.getPodWithUsername_(username);
3033 if (pod == null) { 3144 if (pod == null) {
3034 console.error('Unable to hide user pod button: user pod not found.'); 3145 console.error('Unable to hide user pod button: user pod not found.');
3035 return; 3146 return;
3036 } 3147 }
3037 3148
3038 // TODO(tengs): Allow option for a fading transition. 3149 // TODO(tengs): Allow option for a fading transition.
3039 pod.customIconElement.hide(); 3150 pod.customIconElement.hide();
3151
3152 // Show fingerprint icon if applicable.
3153 this.setUserPodFingerprintIcon(username, FINGERPRINT_STATES.DEFAULT);
3040 }, 3154 },
3041 3155
3042 /** 3156 /**
3157 * Set a fingerprint icon in the user pod of |username|.
3158 * @param {string} username Username of the selected user
3159 * @param {number} state Fingerprint unlock state
3160 */
3161 setUserPodFingerprintIcon: function(username, state) {
3162 var pod = this.getPodWithUsername_(username);
3163 if (pod == null) {
3164 console.error(
3165 'Unable to set user pod fingerprint icon: user pod not found.');
3166 return;
3167 }
3168 pod.fingerprintAuthenticated_ = false;
3169 if (!pod.fingerprintIconElement)
3170 return;
3171 if (!pod.user.allowFingerprint || state == FINGERPRINT_STATES.HIDDEN ||
3172 !pod.customIconElement.hidden) {
3173 pod.fingerprintIconElement.hidden = true;
3174 pod.submitButton.hidden = false;
3175 return;
3176 }
3177
3178 FINGERPRINT_STATES_MAPPING.forEach(function(icon) {
3179 pod.fingerprintIconElement.classList.toggle(
3180 icon.class, state == icon.state);
3181 });
3182 pod.fingerprintIconElement.hidden = false;
3183 pod.submitButton.hidden = pod.passwordElement.value.length == 0;
3184 this.updatePasswordField_(pod, state);
3185 if (state == FINGERPRINT_STATES.DEFAULT)
3186 return;
3187
3188 pod.fingerprintAuthenticated_ = true;
3189 this.setActivatedPod(pod);
3190 if (state == FINGERPRINT_STATES.FAILED) {
3191 /** @const */ var RESET_ICON_TIMEOUT_MS = 500;
3192 setTimeout(
3193 this.resetIconAndPasswordField_.bind(this, pod),
3194 RESET_ICON_TIMEOUT_MS);
3195 }
3196 },
3197
3198 /**
3199 * Reset the fingerprint icon and password field.
3200 * @param {UserPod} pod Pod to reset.
3201 */
3202 resetIconAndPasswordField_: function(pod) {
3203 if (!pod.fingerprintIconElement)
3204 return;
3205 this.setUserPodFingerprintIcon(
3206 pod.user.username, FINGERPRINT_STATES.DEFAULT);
3207 },
3208
3209 /**
3210 * Remove the fingerprint icon in the user pod.
3211 * @param {string} username Username of the selected user
3212 */
3213 removeUserPodFingerprintIcon: function(username) {
3214 var pod = this.getPodWithUsername_(username);
3215 if (pod == null) {
3216 console.error('No user pod found (when removing fingerprint icon).');
3217 return;
3218 }
3219 this.resetIconAndPasswordField_(pod);
3220 if (pod.fingerprintIconElement) {
3221 pod.fingerprintIconElement.parentNode.removeChild(
3222 pod.fingerprintIconElement);
3223 }
3224 pod.submitButton.hidden = false;
3225 },
3226
3227 /**
3228 * Updates the password field in the user pod.
3229 * @param {UserPod} pod Pod to update.
3230 * @param {number} state Fingerprint unlock state
3231 */
3232 updatePasswordField_: function(pod, state) {
3233 FINGERPRINT_STATES_MAPPING.forEach(function(item) {
3234 pod.passwordElement.classList.toggle(item.class, state == item.state);
3235 });
3236 var placeholderStr = loadTimeData.getString(
3237 pod.isPinShown() ? 'pinKeyboardPlaceholderPinPassword' :
3238 'passwordHint');
3239 if (state == FINGERPRINT_STATES.SIGNIN) {
3240 placeholderStr = loadTimeData.getString('fingerprintSigningin');
3241 } else if (state == FINGERPRINT_STATES.FAILED) {
3242 placeholderStr = loadTimeData.getString('fingerprintSigninFailed');
3243 }
3244 pod.passwordElement.placeholder = placeholderStr;
3245 },
3246
3247 /**
3043 * Sets the authentication type used to authenticate the user. 3248 * Sets the authentication type used to authenticate the user.
3044 * @param {string} username Username of selected user 3249 * @param {string} username Username of selected user
3045 * @param {number} authType Authentication type, must be one of the 3250 * @param {number} authType Authentication type, must be one of the
3046 * values listed in AUTH_TYPE enum. 3251 * values listed in AUTH_TYPE enum.
3047 * @param {string} value The initial value to use for authentication. 3252 * @param {string} value The initial value to use for authentication.
3048 */ 3253 */
3049 setAuthType: function(username, authType, value) { 3254 setAuthType: function(username, authType, value) {
3050 var pod = this.getPodWithUsername_(username); 3255 var pod = this.getPodWithUsername_(username);
3051 if (pod == null) { 3256 if (pod == null) {
3052 console.error('Unable to set auth type: user pod not found.'); 3257 console.error('Unable to set auth type: user pod not found.');
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
3301 this.insideFocusPod_ = true; 3506 this.insideFocusPod_ = true;
3302 3507
3303 for (var i = 0, pod; pod = this.pods[i]; ++i) { 3508 for (var i = 0, pod; pod = this.pods[i]; ++i) {
3304 if (!this.alwaysFocusSinglePod) { 3509 if (!this.alwaysFocusSinglePod) {
3305 pod.isActionBoxMenuActive = false; 3510 pod.isActionBoxMenuActive = false;
3306 } 3511 }
3307 if (pod != podToFocus) { 3512 if (pod != podToFocus) {
3308 pod.isActionBoxMenuHovered = false; 3513 pod.isActionBoxMenuHovered = false;
3309 pod.classList.remove('focused'); 3514 pod.classList.remove('focused');
3310 pod.setPinVisibility(false); 3515 pod.setPinVisibility(false);
3516 this.setUserPodFingerprintIcon(
3517 pod.user.username, FINGERPRINT_STATES.HIDDEN);
3311 // On Desktop, the faded style is not set correctly, so we should 3518 // On Desktop, the faded style is not set correctly, so we should
3312 // manually fade out non-focused pods if there is a focused pod. 3519 // manually fade out non-focused pods if there is a focused pod.
3313 if (pod.user.isDesktopUser && podToFocus) 3520 if (pod.user.isDesktopUser && podToFocus)
3314 pod.classList.add('faded'); 3521 pod.classList.add('faded');
3315 else 3522 else
3316 pod.classList.remove('faded'); 3523 pod.classList.remove('faded');
3317 pod.reset(false); 3524 pod.reset(false);
3318 } 3525 }
3319 } 3526 }
3320 3527
(...skipping 19 matching lines...) Expand all
3340 // is false, it doesn't focus on the password input box by default. 3547 // is false, it doesn't focus on the password input box by default.
3341 podToFocus.focus(); 3548 podToFocus.focus();
3342 } 3549 }
3343 3550
3344 // focusPod() automatically loads wallpaper 3551 // focusPod() automatically loads wallpaper
3345 if (!podToFocus.user.isApp) 3552 if (!podToFocus.user.isApp)
3346 chrome.send('focusPod', [podToFocus.user.username]); 3553 chrome.send('focusPod', [podToFocus.user.username]);
3347 this.firstShown_ = false; 3554 this.firstShown_ = false;
3348 this.lastFocusedPod_ = podToFocus; 3555 this.lastFocusedPod_ = podToFocus;
3349 this.scrollFocusedPodIntoView(); 3556 this.scrollFocusedPodIntoView();
3557 this.setUserPodFingerprintIcon(
3558 podToFocus.user.username, FINGERPRINT_STATES.DEFAULT);
3350 } else { 3559 } else {
3351 chrome.send('noPodFocused'); 3560 chrome.send('noPodFocused');
3352 } 3561 }
3353 this.insideFocusPod_ = false; 3562 this.insideFocusPod_ = false;
3354 }, 3563 },
3355 3564
3356 /** 3565 /**
3357 * Resets wallpaper to the last active user's wallpaper, if any. 3566 * Resets wallpaper to the last active user's wallpaper, if any.
3358 */ 3567 */
3359 loadLastWallpaper: function() { 3568 loadLastWallpaper: function() {
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
3731 if (pod && pod.multiProfilesPolicyApplied) { 3940 if (pod && pod.multiProfilesPolicyApplied) {
3732 pod.userTypeBubbleElement.classList.remove('bubble-shown'); 3941 pod.userTypeBubbleElement.classList.remove('bubble-shown');
3733 } 3942 }
3734 } 3943 }
3735 }; 3944 };
3736 3945
3737 return { 3946 return {
3738 PodRow: PodRow 3947 PodRow: PodRow
3739 }; 3948 };
3740 }); 3949 });
OLDNEW
« no previous file with comments | « ui/login/account_picker/user_pod_row.css ('k') | ui/login/account_picker/user_pod_template.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698