| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 /** | |
| 6 * @fileoverview Account picker screen implementation. | |
| 7 */ | |
| 8 | |
| 9 login.createScreen('AccountPickerScreen', 'account-picker', function() { | |
| 10 /** | |
| 11 * Maximum number of offline login failures before online login. | |
| 12 * @type {number} | |
| 13 * @const | |
| 14 */ | |
| 15 var MAX_LOGIN_ATTEMPTS_IN_POD = 3; | |
| 16 /** | |
| 17 * Whether to preselect the first pod automatically on login screen. | |
| 18 * @type {boolean} | |
| 19 * @const | |
| 20 */ | |
| 21 var PRESELECT_FIRST_POD = true; | |
| 22 | |
| 23 return { | |
| 24 EXTERNAL_API: [ | |
| 25 'loadUsers', | |
| 26 'runAppForTesting', | |
| 27 'setApps', | |
| 28 'setShouldShowApps', | |
| 29 'showAppError', | |
| 30 'updateUserImage', | |
| 31 'setCapsLockState', | |
| 32 'forceLockedUserPodFocus', | |
| 33 'removeUser', | |
| 34 'showBannerMessage', | |
| 35 'showUserPodCustomIcon', | |
| 36 'hideUserPodCustomIcon', | |
| 37 'setAuthType', | |
| 38 'showEasyUnlockBubble', | |
| 39 'setPublicSessionKeyboardLayouts', | |
| 40 ], | |
| 41 | |
| 42 preferredWidth_: 0, | |
| 43 preferredHeight_: 0, | |
| 44 | |
| 45 // Whether this screen is shown for the first time. | |
| 46 firstShown_: true, | |
| 47 | |
| 48 /** @override */ | |
| 49 decorate: function() { | |
| 50 login.PodRow.decorate($('pod-row')); | |
| 51 }, | |
| 52 | |
| 53 /** @override */ | |
| 54 getPreferredSize: function() { | |
| 55 return {width: this.preferredWidth_, height: this.preferredHeight_}; | |
| 56 }, | |
| 57 | |
| 58 /** @override */ | |
| 59 onWindowResize: function() { | |
| 60 $('pod-row').onWindowResize(); | |
| 61 }, | |
| 62 | |
| 63 /** | |
| 64 * Sets preferred size for account picker screen. | |
| 65 */ | |
| 66 setPreferredSize: function(width, height) { | |
| 67 this.preferredWidth_ = width; | |
| 68 this.preferredHeight_ = height; | |
| 69 }, | |
| 70 | |
| 71 /** | |
| 72 * When the account picker is being used to lock the screen, pressing the | |
| 73 * exit accelerator key will sign out the active user as it would when | |
| 74 * they are signed in. | |
| 75 */ | |
| 76 exit: function() { | |
| 77 // Check and disable the sign out button so that we can never have two | |
| 78 // sign out requests generated in a row. | |
| 79 if ($('pod-row').lockedPod && !$('sign-out-user-button').disabled) { | |
| 80 $('sign-out-user-button').disabled = true; | |
| 81 chrome.send('signOutUser'); | |
| 82 } | |
| 83 }, | |
| 84 | |
| 85 /* Cancel user adding if ESC was pressed. | |
| 86 */ | |
| 87 cancel: function() { | |
| 88 if (Oobe.getInstance().displayType == DISPLAY_TYPE.USER_ADDING) | |
| 89 chrome.send('cancelUserAdding'); | |
| 90 }, | |
| 91 | |
| 92 /** | |
| 93 * Event handler that is invoked just after the frame is shown. | |
| 94 * @param {string} data Screen init payload. | |
| 95 */ | |
| 96 onAfterShow: function(data) { | |
| 97 $('pod-row').handleAfterShow(); | |
| 98 }, | |
| 99 | |
| 100 /** | |
| 101 * Event handler that is invoked just before the frame is shown. | |
| 102 * @param {string} data Screen init payload. | |
| 103 */ | |
| 104 onBeforeShow: function(data) { | |
| 105 chrome.send('loginUIStateChanged', ['account-picker', true]); | |
| 106 $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ACCOUNT_PICKER; | |
| 107 chrome.send('hideCaptivePortal'); | |
| 108 var podRow = $('pod-row'); | |
| 109 podRow.handleBeforeShow(); | |
| 110 | |
| 111 // In case of the preselected pod onShow will be called once pod | |
| 112 // receives focus. | |
| 113 if (!podRow.preselectedPod) | |
| 114 this.onShow(); | |
| 115 }, | |
| 116 | |
| 117 /** | |
| 118 * Event handler invoked when the page is shown and ready. | |
| 119 */ | |
| 120 onShow: function() { | |
| 121 if (!this.firstShown_) return; | |
| 122 this.firstShown_ = false; | |
| 123 | |
| 124 // Ensure that login is actually visible. | |
| 125 window.webkitRequestAnimationFrame(function() { | |
| 126 chrome.send('accountPickerReady'); | |
| 127 chrome.send('loginVisible', ['account-picker']); | |
| 128 }); | |
| 129 }, | |
| 130 | |
| 131 /** | |
| 132 * Event handler that is invoked just before the frame is hidden. | |
| 133 */ | |
| 134 onBeforeHide: function() { | |
| 135 chrome.send('loginUIStateChanged', ['account-picker', false]); | |
| 136 $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN; | |
| 137 $('pod-row').handleHide(); | |
| 138 }, | |
| 139 | |
| 140 /** | |
| 141 * Shows sign-in error bubble. | |
| 142 * @param {number} loginAttempts Number of login attemps tried. | |
| 143 * @param {HTMLElement} content Content to show in bubble. | |
| 144 */ | |
| 145 showErrorBubble: function(loginAttempts, error) { | |
| 146 var activatedPod = $('pod-row').activatedPod; | |
| 147 if (!activatedPod) { | |
| 148 $('bubble').showContentForElement($('pod-row'), | |
| 149 cr.ui.Bubble.Attachment.RIGHT, | |
| 150 error); | |
| 151 return; | |
| 152 } | |
| 153 // Show web authentication if this is not a locally managed user. | |
| 154 if (loginAttempts > MAX_LOGIN_ATTEMPTS_IN_POD && | |
| 155 !activatedPod.user.locallyManagedUser) { | |
| 156 activatedPod.showSigninUI(); | |
| 157 } else { | |
| 158 // We want bubble's arrow to point to the first letter of input. | |
| 159 /** @const */ var BUBBLE_OFFSET = 7; | |
| 160 /** @const */ var BUBBLE_PADDING = 4; | |
| 161 $('bubble').showContentForElement(activatedPod.mainInput, | |
| 162 cr.ui.Bubble.Attachment.BOTTOM, | |
| 163 error, | |
| 164 BUBBLE_OFFSET, BUBBLE_PADDING); | |
| 165 } | |
| 166 }, | |
| 167 | |
| 168 /** | |
| 169 * Loads given users in pod row. | |
| 170 * @param {array} users Array of user. | |
| 171 * @param {boolean} showGuest Whether to show guest session button. | |
| 172 */ | |
| 173 loadUsers: function(users, showGuest) { | |
| 174 $('pod-row').loadPods(users); | |
| 175 $('login-header-bar').showGuestButton = showGuest; | |
| 176 | |
| 177 // The desktop User Manager can send the index of a pod that should be | |
| 178 // initially focused. | |
| 179 var hash = window.location.hash; | |
| 180 if (hash) { | |
| 181 var podIndex = hash.substr(1); | |
| 182 if (podIndex) | |
| 183 $('pod-row').focusPodByIndex(podIndex, false); | |
| 184 } | |
| 185 }, | |
| 186 | |
| 187 /** | |
| 188 * Runs app with a given id from the list of loaded apps. | |
| 189 * @param {!string} app_id of an app to run. | |
| 190 * @param {boolean=} opt_diagnostic_mode Whether to run the app in | |
| 191 * diagnostic mode. Default is false. | |
| 192 */ | |
| 193 runAppForTesting: function(app_id, opt_diagnostic_mode) { | |
| 194 $('pod-row').findAndRunAppForTesting(app_id, opt_diagnostic_mode); | |
| 195 }, | |
| 196 | |
| 197 /** | |
| 198 * Adds given apps to the pod row. | |
| 199 * @param {array} apps Array of apps. | |
| 200 */ | |
| 201 setApps: function(apps) { | |
| 202 $('pod-row').setApps(apps); | |
| 203 }, | |
| 204 | |
| 205 /** | |
| 206 * Sets the flag of whether app pods should be visible. | |
| 207 * @param {boolean} shouldShowApps Whether to show app pods. | |
| 208 */ | |
| 209 setShouldShowApps: function(shouldShowApps) { | |
| 210 $('pod-row').setShouldShowApps(shouldShowApps); | |
| 211 }, | |
| 212 | |
| 213 /** | |
| 214 * Shows the given kiosk app error message. | |
| 215 * @param {!string} message Error message to show. | |
| 216 */ | |
| 217 showAppError: function(message) { | |
| 218 // TODO(nkostylev): Figure out a way to show kiosk app launch error | |
| 219 // pointing to the kiosk app pod. | |
| 220 /** @const */ var BUBBLE_PADDING = 12; | |
| 221 $('bubble').showTextForElement($('pod-row'), | |
| 222 message, | |
| 223 cr.ui.Bubble.Attachment.BOTTOM, | |
| 224 $('pod-row').offsetWidth / 2, | |
| 225 BUBBLE_PADDING); | |
| 226 }, | |
| 227 | |
| 228 /** | |
| 229 * Updates current image of a user. | |
| 230 * @param {string} username User for which to update the image. | |
| 231 */ | |
| 232 updateUserImage: function(username) { | |
| 233 $('pod-row').updateUserImage(username); | |
| 234 }, | |
| 235 | |
| 236 /** | |
| 237 * Updates Caps Lock state (for Caps Lock hint in password input field). | |
| 238 * @param {boolean} enabled Whether Caps Lock is on. | |
| 239 */ | |
| 240 setCapsLockState: function(enabled) { | |
| 241 $('pod-row').classList.toggle('capslock-on', enabled); | |
| 242 }, | |
| 243 | |
| 244 /** | |
| 245 * Enforces focus on user pod of locked user. | |
| 246 */ | |
| 247 forceLockedUserPodFocus: function() { | |
| 248 var row = $('pod-row'); | |
| 249 if (row.lockedPod) | |
| 250 row.focusPod(row.lockedPod, true); | |
| 251 }, | |
| 252 | |
| 253 /** | |
| 254 * Remove given user from pod row if it is there. | |
| 255 * @param {string} user name. | |
| 256 */ | |
| 257 removeUser: function(username) { | |
| 258 $('pod-row').removeUserPod(username); | |
| 259 }, | |
| 260 | |
| 261 /** | |
| 262 * Displays a banner containing |message|. If the banner is already present | |
| 263 * this function updates the message in the banner. This function is used | |
| 264 * by the chrome.screenlockPrivate.showMessage API. | |
| 265 * @param {string} message Text to be displayed | |
| 266 */ | |
| 267 showBannerMessage: function(message) { | |
| 268 var banner = $('signin-banner'); | |
| 269 banner.textContent = message; | |
| 270 banner.classList.toggle('message-set', true); | |
| 271 }, | |
| 272 | |
| 273 /** | |
| 274 * Shows a custom icon in the user pod of |username|. This function | |
| 275 * is used by the chrome.screenlockPrivate API. | |
| 276 * @param {string} username Username of pod to add button | |
| 277 * @param {{scale1x: string, scale2x: string}} icon Dictionary of URLs of | |
| 278 * the custom icon's representations for 1x and 2x scale factors. | |
| 279 */ | |
| 280 showUserPodCustomIcon: function(username, icon) { | |
| 281 $('pod-row').showUserPodCustomIcon(username, icon); | |
| 282 }, | |
| 283 | |
| 284 /** | |
| 285 * Hides the custom icon in the user pod of |username| added by | |
| 286 * showUserPodCustomIcon(). This function is used by the | |
| 287 * chrome.screenlockPrivate API. | |
| 288 * @param {string} username Username of pod to remove button | |
| 289 */ | |
| 290 hideUserPodCustomIcon: function(username) { | |
| 291 $('pod-row').hideUserPodCustomIcon(username); | |
| 292 }, | |
| 293 | |
| 294 /** | |
| 295 * Sets the authentication type used to authenticate the user. | |
| 296 * @param {string} username Username of selected user | |
| 297 * @param {number} authType Authentication type, must be a valid value in | |
| 298 * the AUTH_TYPE enum in user_pod_row.js. | |
| 299 * @param {string} value The initial value to use for authentication. | |
| 300 */ | |
| 301 setAuthType: function(username, authType, value) { | |
| 302 $('pod-row').setAuthType(username, authType, value); | |
| 303 }, | |
| 304 | |
| 305 /** | |
| 306 * Shows a tooltip bubble explaining Easy Unlock. | |
| 307 */ | |
| 308 showEasyUnlockBubble: function() { | |
| 309 $('pod-row').showEasyUnlockBubble(); | |
| 310 }, | |
| 311 | |
| 312 /** | |
| 313 * Updates the list of available keyboard layouts for a public session pod. | |
| 314 * @param {string} userID The user ID of the public session | |
| 315 * @param {!Object} list List of available keyboard layouts | |
| 316 */ | |
| 317 setPublicSessionKeyboardLayouts: function(userID, list) { | |
| 318 $('pod-row').setPublicSessionKeyboardLayouts(userID, list); | |
| 319 } | |
| 320 }; | |
| 321 }); | |
| 322 | |
| OLD | NEW |