Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / login / screen_account_picker.js
blob581f8507e2415bd7245d275caf9b307cd02e0695
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
3 // found in the LICENSE file.
5 /**
6  * @fileoverview Account picker screen implementation.
7  */
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;
23   return {
24     EXTERNAL_API: [
25       'loadUsers',
26       'updateUserImage',
27       'updateUserGaiaNeeded',
28       'setCapsLockState',
29       'forceLockedUserPodFocus',
30       'onWallpaperLoaded',
31       'removeUser',
32       'showBannerMessage',
33       'showUserPodButton',
34     ],
36     preferredWidth_: 0,
37     preferredHeight_: 0,
39     // Whether this screen is shown for the first time.
40     firstShown_: true,
42     /** @override */
43     decorate: function() {
44       login.PodRow.decorate($('pod-row'));
45     },
47     /** @override */
48     getPreferredSize: function() {
49       return {width: this.preferredWidth_, height: this.preferredHeight_};
50     },
52     /** @override */
53     onWindowResize: function() {
54       $('pod-row').onWindowResize();
55     },
57     /**
58      * Sets preferred size for account picker screen.
59      */
60     setPreferredSize: function(width, height) {
61       this.preferredWidth_ = width;
62       this.preferredHeight_ = height;
63     },
65     /**
66      * When the account picker is being used to lock the screen, pressing the
67      * exit accelerator key will sign out the active user as it would when
68      * they are signed in.
69      */
70     exit: function() {
71       // Check and disable the sign out button so that we can never have two
72       // sign out requests generated in a row.
73       if ($('pod-row').lockedPod && !$('sign-out-user-button').disabled) {
74         $('sign-out-user-button').disabled = true;
75         chrome.send('signOutUser');
76       }
77     },
79     /* Cancel user adding if ESC was pressed.
80      */
81     cancel: function() {
82       if (Oobe.getInstance().displayType() == DISPLAY_TYPE.USER_ADDING)
83         chrome.send('cancelUserAdding');
84     },
86     /**
87      * Event handler that is invoked just after the frame is shown.
88      * @param {string} data Screen init payload.
89      */
90     onAfterShow: function(data) {
91       $('pod-row').handleAfterShow();
92     },
94     /**
95      * Event handler that is invoked just before the frame is shown.
96      * @param {string} data Screen init payload.
97      */
98     onBeforeShow: function(data) {
99       chrome.send('loginUIStateChanged', ['account-picker', true]);
100       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ACCOUNT_PICKER;
101       chrome.send('hideCaptivePortal');
102       var podRow = $('pod-row');
103       podRow.handleBeforeShow();
105       // If this is showing for the lock screen display the sign out button,
106       // hide the add user button and activate the locked user's pod.
107       var lockedPod = podRow.lockedPod;
108       $('add-user-header-bar-item').hidden = !!lockedPod;
109       var signOutUserItem = $('sign-out-user-item');
110       if (signOutUserItem)
111         signOutUserItem.hidden = !lockedPod;
112       // In case of the preselected pod onShow will be called once pod
113       // receives focus.
114       if (!podRow.preselectedPod)
115         this.onShow();
116     },
118     /**
119      * Event handler invoked when the page is shown and ready.
120      */
121     onShow: function() {
122       if (!this.firstShown_) return;
123       this.firstShown_ = false;
124       // TODO(nkostylev): Enable animation back when session start jank
125       // is reduced. See http://crosbug.com/11116 http://crosbug.com/18307
126       // $('pod-row').startInitAnimation();
128       // Ensure that login is actually visible.
129       window.webkitRequestAnimationFrame(function() {
130         chrome.send('accountPickerReady');
131         chrome.send('loginVisible', ['account-picker']);
132       });
133     },
135     /**
136      * Event handler that is invoked just before the frame is hidden.
137      */
138     onBeforeHide: function() {
139       chrome.send('loginUIStateChanged', ['account-picker', false]);
140       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN;
141       $('pod-row').handleHide();
142     },
144     /**
145      * Shows sign-in error bubble.
146      * @param {number} loginAttempts Number of login attemps tried.
147      * @param {HTMLElement} content Content to show in bubble.
148      */
149     showErrorBubble: function(loginAttempts, error) {
150       var activatedPod = $('pod-row').activatedPod;
151       if (!activatedPod) {
152         $('bubble').showContentForElement($('pod-row'),
153                                           cr.ui.Bubble.Attachment.RIGHT,
154                                           error);
155         return;
156       }
157       // Show web authentication if this is not a locally managed user.
158       if (loginAttempts > MAX_LOGIN_ATTEMPTS_IN_POD &&
159           !activatedPod.user.locallyManagedUser) {
160         activatedPod.showSigninUI();
161       } else {
162         // We want bubble's arrow to point to the first letter of input.
163         /** @const */ var BUBBLE_OFFSET = 7;
164         /** @const */ var BUBBLE_PADDING = 4;
165         $('bubble').showContentForElement(activatedPod.mainInput,
166                                           cr.ui.Bubble.Attachment.BOTTOM,
167                                           error,
168                                           BUBBLE_OFFSET, BUBBLE_PADDING);
169       }
170     },
172     /**
173      * Loads given users in pod row.
174      * @param {array} users Array of user.
175      * @param {boolean} animated Whether to use init animation.
176      * @param {boolean} showGuest Whether to show guest session button.
177      */
178     loadUsers: function(users, animated, showGuest) {
179       $('pod-row').loadPods(users, animated);
180       $('login-header-bar').showGuestButton = showGuest;
182       // The desktop User Manager can send the index of a pod that should be
183       // initially focused.
184       var hash = window.location.hash;
185       if (hash) {
186         var podIndex = hash.substr(1);
187         if (podIndex)
188           $('pod-row').focusPodByIndex(podIndex, false);
189       }
190     },
192     /**
193      * Updates current image of a user.
194      * @param {string} username User for which to update the image.
195      */
196     updateUserImage: function(username) {
197       $('pod-row').updateUserImage(username);
198     },
200     /**
201      * Updates user to use gaia login.
202      * @param {string} username User for which to state the state.
203      */
204     updateUserGaiaNeeded: function(username) {
205       $('pod-row').resetUserOAuthTokenStatus(username);
206     },
208     /**
209      * Updates Caps Lock state (for Caps Lock hint in password input field).
210      * @param {boolean} enabled Whether Caps Lock is on.
211      */
212     setCapsLockState: function(enabled) {
213       $('pod-row').classList.toggle('capslock-on', enabled);
214     },
216     /**
217      * Enforces focus on user pod of locked user.
218      */
219     forceLockedUserPodFocus: function() {
220       var row = $('pod-row');
221       if (row.lockedPod)
222         row.focusPod(row.lockedPod, true);
223     },
225     /**
226      * Mark wallpaper loaded
227      */
228     onWallpaperLoaded: function(username) {
229       $('pod-row').onWallpaperLoaded(username);
230     },
232     /**
233      * Remove given user from pod row if it is there.
234      * @param {string} user name.
235      */
236     removeUser: function(username) {
237       $('pod-row').removeUserPod(username);
238     },
240     /**
241      * Displays a banner containing |message|. If the banner is already present
242      * this function updates the message in the banner. This function is used
243      * by the chrome.screenlockPrivate.showMessage API.
244      * @param {string} message Text to be displayed
245      */
246     showBannerMessage: function(message) {
247       var banner = $('signin-banner');
248       banner.textContent = message;
249       banner.classList.toggle('message-set', true);
250     },
252     /**
253      * Shows a button with an icon on the user pod of |username|. This function
254      * is used by the chrome.screenlockPrivate API.
255      * @param {string} username Username of pod to add button
256      * @param {string} iconURL URL of the button icon
257      */
258     showUserPodButton: function(username, iconURL) {
259       $('pod-row').showUserPodButton(username, iconURL);
260     }
261   };