1// Copyright 2013 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 Common OOBE controller methods. 7 */ 8 9<include src="../../login/screen.js"></include> 10<include src="screen_context.js"></include> 11<include src="../user_images_grid.js"></include> 12<include src="apps_menu.js"></include> 13<include src="../../login/bubble.js"></include> 14<include src="../../login/display_manager.js"></include> 15<include src="header_bar.js"></include> 16<include src="network_dropdown.js"></include> 17<include src="oobe_screen_reset.js"></include> 18<include src="oobe_screen_autolaunch.js"></include> 19<include src="oobe_screen_enable_kiosk.js"></include> 20<include src="oobe_screen_terms_of_service.js"></include> 21<include src="oobe_screen_user_image.js"></include> 22<include src="../../login/screen_account_picker.js"></include> 23<include src="screen_app_launch_splash.js"></include> 24<include src="screen_error_message.js"></include> 25<include src="screen_gaia_signin.js"></include> 26<include src="screen_locally_managed_user_creation.js"></include> 27<include src="screen_password_changed.js"></include> 28<include src="screen_tpm_error.js"></include> 29<include src="screen_wrong_hwid.js"></include> 30<include src="screen_confirm_password.js"></include> 31<include src="screen_fatal_error.js"></include> 32<include src="../../login/user_pod_row.js"></include> 33<include src="../../login/resource_loader.js"></include> 34 35cr.define('cr.ui', function() { 36 var DisplayManager = cr.ui.login.DisplayManager; 37 38 /** 39 * Constructs an Out of box controller. It manages initialization of screens, 40 * transitions, error messages display. 41 * @extends {DisplayManager} 42 * @constructor 43 */ 44 function Oobe() { 45 } 46 47 /** 48 * Delay in milliseconds between start of OOBE animation and start of 49 * header bar animation. 50 */ 51 var HEADER_BAR_DELAY_MS = 300; 52 53 cr.addSingletonGetter(Oobe); 54 55 Oobe.prototype = { 56 __proto__: DisplayManager.prototype, 57 }; 58 59 /** 60 * Handle accelerators. These are passed from native code instead of a JS 61 * event handler in order to make sure that embedded iframes cannot swallow 62 * them. 63 * @param {string} name Accelerator name. 64 */ 65 Oobe.handleAccelerator = function(name) { 66 Oobe.getInstance().handleAccelerator(name); 67 }; 68 69 /** 70 * Shows the given screen. 71 * @param {Object} screen Screen params dict, e.g. {id: screenId, data: data} 72 */ 73 Oobe.showScreen = function(screen) { 74 Oobe.getInstance().showScreen(screen); 75 }; 76 77 /** 78 * Updates version label visibilty. 79 * @param {boolean} show True if version label should be visible. 80 */ 81 Oobe.showVersion = function(show) { 82 Oobe.getInstance().showVersion(show); 83 }; 84 85 /** 86 * Update body class to switch between OOBE UI and Login UI. 87 */ 88 Oobe.showOobeUI = function(showOobe) { 89 if (showOobe) { 90 document.body.classList.add('oobe-display'); 91 92 // Callback to animate the header bar in. 93 var showHeaderBar = function() { 94 login.HeaderBar.animateIn(function() { 95 chrome.send('headerBarVisible'); 96 }); 97 }; 98 // Start asynchronously so the OOBE network screen comes in first. 99 window.setTimeout(showHeaderBar, HEADER_BAR_DELAY_MS); 100 } else { 101 document.body.classList.remove('oobe-display'); 102 Oobe.getInstance().prepareForLoginDisplay_(); 103 } 104 105 Oobe.getInstance().headerHidden = false; 106 }; 107 108 /** 109 * Enables keyboard driven flow. 110 */ 111 Oobe.enableKeyboardFlow = function(value) { 112 // Don't show header bar for OOBE. 113 Oobe.getInstance().forceKeyboardFlow = value; 114 }; 115 116 /** 117 * Disables signin UI. 118 */ 119 Oobe.disableSigninUI = function() { 120 DisplayManager.disableSigninUI(); 121 }; 122 123 /** 124 * Shows signin UI. 125 * @param {string} opt_email An optional email for signin UI. 126 */ 127 Oobe.showSigninUI = function(opt_email) { 128 DisplayManager.showSigninUI(opt_email); 129 }; 130 131 /** 132 * Resets sign-in input fields. 133 * @param {boolean} forceOnline Whether online sign-in should be forced. 134 * If |forceOnline| is false previously used sign-in type will be used. 135 */ 136 Oobe.resetSigninUI = function(forceOnline) { 137 DisplayManager.resetSigninUI(forceOnline); 138 }; 139 140 /** 141 * Shows sign-in error bubble. 142 * @param {number} loginAttempts Number of login attemps tried. 143 * @param {string} message Error message to show. 144 * @param {string} link Text to use for help link. 145 * @param {number} helpId Help topic Id associated with help link. 146 */ 147 Oobe.showSignInError = function(loginAttempts, message, link, helpId) { 148 DisplayManager.showSignInError(loginAttempts, message, link, helpId); 149 }; 150 151 /** 152 * Shows password changed screen that offers migration. 153 * @param {boolean} showError Whether to show the incorrect password error. 154 */ 155 Oobe.showPasswordChangedScreen = function(showError) { 156 DisplayManager.showPasswordChangedScreen(showError); 157 }; 158 159 /** 160 * Shows dialog to create managed user. 161 */ 162 Oobe.showManagedUserCreationScreen = function() { 163 DisplayManager.showManagedUserCreationScreen(); 164 }; 165 166 /** 167 * Shows TPM error screen. 168 */ 169 Oobe.showTpmError = function() { 170 DisplayManager.showTpmError(); 171 }; 172 173 /** 174 * Clears error bubble as well as optional menus that could be open. 175 */ 176 Oobe.clearErrors = function() { 177 var accessibilityMenu = $('accessibility-menu'); 178 if (accessibilityMenu) 179 accessibilityMenu.hide(); 180 DisplayManager.clearErrors(); 181 }; 182 183 /** 184 * Displays animations on successful authentication, that have to happen 185 * before login UI is dismissed. 186 */ 187 Oobe.animateAuthenticationSuccess = function() { 188 login.HeaderBar.animateOut(function() { 189 chrome.send('unlockOnLoginSuccess'); 190 }); 191 }; 192 193 /** 194 * Displays animations that have to happen once login UI is fully displayed. 195 */ 196 Oobe.animateOnceFullyDisplayed = function() { 197 login.HeaderBar.animateIn(); 198 }; 199 200 /** 201 * Sets text content for a div with |labelId|. 202 * @param {string} labelId Id of the label div. 203 * @param {string} labelText Text for the label. 204 */ 205 Oobe.setLabelText = function(labelId, labelText) { 206 DisplayManager.setLabelText(labelId, labelText); 207 }; 208 209 /** 210 * Sets the text content of the enterprise info message. 211 * If the text is empty, the entire notification will be hidden. 212 * @param {string} messageText The message text. 213 */ 214 Oobe.setEnterpriseInfo = function(messageText) { 215 DisplayManager.setEnterpriseInfo(messageText); 216 }; 217 218 /** 219 * Updates the device requisition string shown in the requisition prompt. 220 * @param {string} requisition The device requisition. 221 */ 222 Oobe.updateDeviceRequisition = function(requisition) { 223 Oobe.getInstance().updateDeviceRequisition(requisition); 224 }; 225 226 /** 227 * Enforces focus on user pod of locked user. 228 */ 229 Oobe.forceLockedUserPodFocus = function() { 230 login.AccountPickerScreen.forceLockedUserPodFocus(); 231 }; 232 233 /** 234 * Clears password field in user-pod. 235 */ 236 Oobe.clearUserPodPassword = function() { 237 DisplayManager.clearUserPodPassword(); 238 }; 239 240 /** 241 * Restores input focus to currently selected pod. 242 */ 243 Oobe.refocusCurrentPod = function() { 244 DisplayManager.refocusCurrentPod(); 245 }; 246 247 /** 248 * Skip to login screen for telemetry. 249 */ 250 Oobe.skipToLoginForTesting = function() { 251 Oobe.disableSigninUI(); 252 chrome.send('skipToLoginForTesting'); 253 }; 254 255 /** 256 * Login for telemetry. 257 * @param {string} username Login username. 258 * @param {string} password Login password. 259 */ 260 Oobe.loginForTesting = function(username, password) { 261 Oobe.disableSigninUI(); 262 chrome.send('skipToLoginForTesting', [username]); 263 chrome.send('completeLogin', [username, password, false]); 264 }; 265 266 /** 267 * Guest login for telemetry. 268 */ 269 Oobe.guestLoginForTesting = function() { 270 Oobe.skipToLoginForTesting(); 271 chrome.send('launchIncognito'); 272 }; 273 274 /** 275 * Authenticate for telemetry - used for screenlocker. 276 * @param {string} username Login username. 277 * @param {string} password Login password. 278 */ 279 Oobe.authenticateForTesting = function(username, password) { 280 Oobe.disableSigninUI(); 281 chrome.send('authenticateUser', [username, password]); 282 }; 283 284 /** 285 * Gaia login screen for telemetry. 286 */ 287 Oobe.addUserForTesting = function() { 288 Oobe.skipToLoginForTesting(); 289 chrome.send('addUser'); 290 }; 291 292 /** 293 * Hotrod requisition for telemetry. 294 */ 295 Oobe.remoraRequisitionForTesting = function() { 296 chrome.send('setDeviceRequisition', ['remora']); 297 }; 298 299 /** 300 * Finish enterprise enrollment for telemetry. 301 */ 302 Oobe.enterpriseEnrollmentDone = function() { 303 chrome.send('oauthEnrollClose', ['done']); 304 }; 305 306 /** 307 * Shows/hides login UI control bar with buttons like [Shut down]. 308 */ 309 Oobe.showControlBar = function(show) { 310 Oobe.getInstance().headerHidden = !show; 311 }; 312 313 /** 314 * Sets the current state of the virtual keyboard (shown/hidden, size). 315 */ 316 Oobe.setKeyboardState = function(shown, width, height) { 317 Oobe.getInstance().virtualKeyboardShown = shown; 318 Oobe.getInstance().setVirtualKeyboardSize(width, height); 319 }; 320 321 /** 322 * Sets the current size of the client area (display size). 323 * @param {number} width client area width 324 * @param {number} height client area height 325 */ 326 Oobe.setClientAreaSize = function(width, height) { 327 Oobe.getInstance().setClientAreaSize(width, height); 328 }; 329 330 // Export 331 return { 332 Oobe: Oobe 333 }; 334}); 335 336var Oobe = cr.ui.Oobe; 337 338// Allow selection events on components with editable text (password field) 339// bug (http://code.google.com/p/chromium/issues/detail?id=125863) 340disableTextSelectAndDrag(function(e) { 341 var src = e.target; 342 return src instanceof HTMLTextAreaElement || 343 src instanceof HTMLInputElement && 344 /text|password|search/.test(src.type); 345}); 346 347// Register assets for async loading. 348[{ 349 id: SCREEN_OOBE_ENROLLMENT, 350 html: [{ url: 'chrome://oobe/enrollment.html', targetID: 'inner-container' }], 351 css: ['chrome://oobe/enrollment.css'], 352 js: ['chrome://oobe/enrollment.js'] 353}].forEach(cr.ui.login.ResourceLoader.registerAssets); 354 355document.addEventListener('DOMContentLoaded', function() { 356 'use strict'; 357 358 // Immediately load async assets. 359 // TODO(dconnelly): remove this at some point and only load as needed. 360 // See crbug.com/236426 361 cr.ui.login.ResourceLoader.loadAssets(SCREEN_OOBE_ENROLLMENT, function() { 362 // This screen is async-loaded so we manually trigger i18n processing. 363 i18nTemplate.process($('oauth-enrollment'), loadTimeData); 364 // Delayed binding since this isn't defined yet. 365 login.OAuthEnrollmentScreen.register(); 366 }); 367 368 // Delayed binding since this isn't defined yet. 369 cr.ui.Oobe.initialize(); 370}); 371