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. 4 5 /** 6 * @fileoverview Out of the box experience flow (OOBE). 7 * This is the main code for the OOBE WebUI implementation. 8 */ 9 10 <include src="login_common.js"></include> 11 <include src="oobe_screen_eula.js"></include> 12 <include src="oobe_screen_network.js"></include> 13 <include src="oobe_screen_update.js"></include> 14 15 cr.define('cr.ui.Oobe', function() { 16 return { 17 /** 18 * Setups given "select" element using the list and adds callback. 19 * @param {!Element} select Select object to be updated. 20 * @param {!Object} list List of the options to be added. 21 * @param {string} callback Callback name which should be send to Chrome or 22 * an empty string if the event listener shouldn't be added. 23 */ 24 setupSelect: function(select, list, callback) { 25 select.options.length = 0; 26 for (var i = 0; i < list.length; ++i) { 27 var item = list[i]; 28 var option = 29 new Option(item.title, item.value, item.selected, item.selected); 30 select.appendChild(option); 31 } 32 if (callback) { 33 var sendCallback = function() { 34 chrome.send(callback, [select.options[select.selectedIndex].value]); 35 }; 36 select.addEventListener('blur', sendCallback); 37 select.addEventListener('click', sendCallback); 38 select.addEventListener('keyup', function(event) { 39 var keycodeInterested = [ 40 9, // Tab 41 13, // Enter 42 27, // Escape 43 ]; 44 if (keycodeInterested.indexOf(event.keyCode) >= 0) 45 sendCallback(); 46 }); 47 } 48 }, 49 50 /** 51 * Initializes the OOBE flow. This will cause all C++ handlers to 52 * be invoked to do final setup. 53 */ 54 initialize: function() { 55 cr.ui.login.DisplayManager.initialize(); 56 login.WrongHWIDScreen.register(); 57 login.NetworkScreen.register(); 58 login.EulaScreen.register(); 59 login.UpdateScreen.register(); 60 login.ResetScreen.register(); 61 login.AutolaunchScreen.register(); 62 login.KioskEnableScreen.register(); 63 login.AccountPickerScreen.register(); 64 login.GaiaSigninScreen.register(); 65 login.UserImageScreen.register(/* lazyInit= */ false); 66 login.ErrorMessageScreen.register(); 67 login.TPMErrorMessageScreen.register(); 68 login.PasswordChangedScreen.register(); 69 login.LocallyManagedUserCreationScreen.register(); 70 login.TermsOfServiceScreen.register(); 71 login.AppLaunchSplashScreen.register(); 72 login.ConfirmPasswordScreen.register(); 73 login.MessageBoxScreen.register(); 74 75 cr.ui.Bubble.decorate($('bubble')); 76 login.HeaderBar.decorate($('login-header-bar')); 77 78 Oobe.initializeA11yMenu(); 79 80 chrome.send('screenStateInitialize'); 81 }, 82 83 /** 84 * Initializes OOBE accessibility menu. 85 */ 86 initializeA11yMenu: function() { 87 cr.ui.Bubble.decorate($('accessibility-menu')); 88 $('connect-accessibility-link').addEventListener( 89 'click', Oobe.handleAccessbilityLinkClick); 90 $('eula-accessibility-link').addEventListener( 91 'click', Oobe.handleAccessbilityLinkClick); 92 $('update-accessibility-link').addEventListener( 93 'click', Oobe.handleAccessbilityLinkClick); 94 95 $('high-contrast').addEventListener('click', 96 Oobe.handleHighContrastClick); 97 $('large-cursor').addEventListener('click', 98 Oobe.handleLargeCursorClick); 99 $('spoken-feedback').addEventListener('click', 100 Oobe.handleSpokenFeedbackClick); 101 $('screen-magnifier').addEventListener('click', 102 Oobe.handleScreenMagnifierClick); 103 104 // A11y menu should be accessible i.e. disable autohide on any 105 // keydown or click inside menu. 106 $('accessibility-menu').hideOnKeyPress = false; 107 $('accessibility-menu').hideOnSelfClick = false; 108 }, 109 110 /** 111 * Accessibility link handler. 112 */ 113 handleAccessbilityLinkClick: function(e) { 114 /** @const */ var BUBBLE_OFFSET = 5; 115 /** @const */ var BUBBLE_PADDING = 10; 116 $('accessibility-menu').showForElement(e.target, 117 cr.ui.Bubble.Attachment.BOTTOM, 118 BUBBLE_OFFSET, BUBBLE_PADDING); 119 if (Oobe.getInstance().currentScreen && 120 Oobe.getInstance().currentScreen.defaultControl) { 121 $('accessibility-menu').elementToFocusOnHide = 122 Oobe.getInstance().currentScreen.defaultControl; 123 } else { 124 // Update screen falls into this category. Since it doesn't have any 125 // controls other than a11y link we don't want that link to receive 126 // focus when screen is shown i.e. defaultControl is not defined. 127 // Focus a11y link instead. 128 $('accessibility-menu').elementToFocusOnHide = e.target; 129 } 130 e.stopPropagation(); 131 }, 132 133 /** 134 * Spoken feedback checkbox handler. 135 */ 136 handleSpokenFeedbackClick: function(e) { 137 chrome.send('enableSpokenFeedback', [$('spoken-feedback').checked]); 138 e.stopPropagation(); 139 }, 140 141 /** 142 * Large cursor checkbox handler. 143 */ 144 handleLargeCursorClick: function(e) { 145 chrome.send('enableLargeCursor', [$('large-cursor').checked]); 146 e.stopPropagation(); 147 }, 148 149 /** 150 * High contrast mode checkbox handler. 151 */ 152 handleHighContrastClick: function(e) { 153 chrome.send('enableHighContrast', [$('high-contrast').checked]); 154 e.stopPropagation(); 155 }, 156 157 /** 158 * Screen magnifier checkbox handler. 159 */ 160 handleScreenMagnifierClick: function(e) { 161 chrome.send('enableScreenMagnifier', [$('screen-magnifier').checked]); 162 e.stopPropagation(); 163 }, 164 165 /** 166 * Sets usage statistics checkbox. 167 * @param {boolean} checked Is the checkbox checked? 168 */ 169 setUsageStats: function(checked) { 170 $('usage-stats').checked = checked; 171 }, 172 173 /** 174 * Set OEM EULA URL. 175 * @param {text} oemEulaUrl OEM EULA URL. 176 */ 177 setOemEulaUrl: function(oemEulaUrl) { 178 if (oemEulaUrl) { 179 $('oem-eula-frame').src = oemEulaUrl; 180 $('eulas').classList.remove('one-column'); 181 } else { 182 $('eulas').classList.add('one-column'); 183 } 184 }, 185 186 /** 187 * Sets TPM password. 188 * @param {text} password TPM password to be shown. 189 */ 190 setTpmPassword: function(password) { 191 $('tpm-busy').hidden = true; 192 193 if (password.length) { 194 $('tpm-password').textContent = password; 195 $('tpm-password').hidden = false; 196 } else { 197 $('tpm-desc').hidden = true; 198 $('tpm-desc-powerwash').hidden = false; 199 } 200 }, 201 202 /** 203 * Refreshes a11y menu state. 204 * @param {!Object} data New dictionary with a11y features state. 205 */ 206 refreshA11yInfo: function(data) { 207 $('high-contrast').checked = data.highContrastEnabled; 208 $('spoken-feedback').checked = data.spokenFeedbackEnabled; 209 $('screen-magnifier').checked = data.screenMagnifierEnabled; 210 $('large-cursor').checked = data.largeCursorEnabled; 211 }, 212 213 /** 214 * Reloads content of the page (localized strings, options of the select 215 * controls). 216 * @param {!Object} data New dictionary with i18n values. 217 */ 218 reloadContent: function(data) { 219 // Reload global local strings, process DOM tree again. 220 loadTimeData.overrideValues(data); 221 i18nTemplate.process(document, loadTimeData); 222 223 // Update language and input method menu lists. 224 Oobe.setupSelect($('language-select'), data.languageList, ''); 225 Oobe.setupSelect($('keyboard-select'), data.inputMethodsList, ''); 226 Oobe.setupSelect($('timezone-select'), data.timezoneList, ''); 227 228 // Update localized content of the screens. 229 Oobe.updateLocalizedContent(); 230 }, 231 232 /** 233 * Updates localized content of the screens. 234 * Should be executed on language change. 235 */ 236 updateLocalizedContent: function() { 237 // Buttons, headers and links. 238 Oobe.getInstance().updateLocalizedContent_(); 239 } 240 }; 241 }); 242