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.
6 * @fileoverview Out of the box experience flow (OOBE).
7 * This is the main code for the OOBE WebUI implementation.
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>
15 cr.define('cr.ui.Oobe', function() {
18 * Setups given "select" element using the list and adds callback.
19 * Creates option groups if needed.
20 * @param {!Element} select Select object to be updated.
21 * @param {!Object} list List of the options to be added.
22 * Elements with optionGroupName are considered option group.
23 * @param {string} callback Callback name which should be send to Chrome or
24 * an empty string if the event listener shouldn't be added.
26 setupSelect: function(select, list, callback) {
27 select.innerHTML = '';
28 var optgroup = select;
29 for (var i = 0; i < list.length; ++i) {
31 if (item.optionGroupName) {
32 optgroup = document.createElement('optgroup');
33 optgroup.label = item.optionGroupName;
34 select.appendChild(optgroup);
37 new Option(item.title, item.value, item.selected, item.selected);
38 optgroup.appendChild(option);
42 var sendCallback = function() {
43 chrome.send(callback, [select.options[select.selectedIndex].value]);
45 select.addEventListener('blur', sendCallback);
46 select.addEventListener('click', sendCallback);
47 select.addEventListener('keyup', function(event) {
48 var keycodeInterested = [
53 if (keycodeInterested.indexOf(event.keyCode) >= 0)
60 * Initializes the OOBE flow. This will cause all C++ handlers to
61 * be invoked to do final setup.
63 initialize: function() {
64 cr.ui.login.DisplayManager.initialize();
65 login.WrongHWIDScreen.register();
66 login.NetworkScreen.register();
67 login.EulaScreen.register();
68 login.UpdateScreen.register();
69 login.ResetScreen.register();
70 login.AutolaunchScreen.register();
71 login.KioskEnableScreen.register();
72 login.AccountPickerScreen.register();
73 login.GaiaSigninScreen.register();
74 login.UserImageScreen.register(/* lazyInit= */ false);
75 login.ErrorMessageScreen.register();
76 login.TPMErrorMessageScreen.register();
77 login.PasswordChangedScreen.register();
78 login.LocallyManagedUserCreationScreen.register();
79 login.TermsOfServiceScreen.register();
80 login.AppLaunchSplashScreen.register();
81 login.ConfirmPasswordScreen.register();
82 login.FatalErrorScreen.register();
84 cr.ui.Bubble.decorate($('bubble'));
85 login.HeaderBar.decorate($('login-header-bar'));
87 Oobe.initializeA11yMenu();
89 chrome.send('screenStateInitialize');
93 * Initializes OOBE accessibility menu.
95 initializeA11yMenu: function() {
96 cr.ui.Bubble.decorate($('accessibility-menu'));
97 $('connect-accessibility-link').addEventListener(
98 'click', Oobe.handleAccessbilityLinkClick);
99 $('eula-accessibility-link').addEventListener(
100 'click', Oobe.handleAccessbilityLinkClick);
101 $('update-accessibility-link').addEventListener(
102 'click', Oobe.handleAccessbilityLinkClick);
104 $('high-contrast').addEventListener('click',
105 Oobe.handleHighContrastClick);
106 $('large-cursor').addEventListener('click',
107 Oobe.handleLargeCursorClick);
108 $('spoken-feedback').addEventListener('click',
109 Oobe.handleSpokenFeedbackClick);
110 $('screen-magnifier').addEventListener('click',
111 Oobe.handleScreenMagnifierClick);
112 $('virtual-keyboard').addEventListener('click',
113 Oobe.handleVirtualKeyboardClick);
115 // A11y menu should be accessible i.e. disable autohide on any
116 // keydown or click inside menu.
117 $('accessibility-menu').hideOnKeyPress = false;
118 $('accessibility-menu').hideOnSelfClick = false;
122 * Accessibility link handler.
124 handleAccessbilityLinkClick: function(e) {
125 /** @const */ var BUBBLE_OFFSET = 5;
126 /** @const */ var BUBBLE_PADDING = 10;
127 $('accessibility-menu').showForElement(e.target,
128 cr.ui.Bubble.Attachment.BOTTOM,
129 BUBBLE_OFFSET, BUBBLE_PADDING);
130 if (Oobe.getInstance().currentScreen &&
131 Oobe.getInstance().currentScreen.defaultControl) {
132 $('accessibility-menu').elementToFocusOnHide =
133 Oobe.getInstance().currentScreen.defaultControl;
135 // Update screen falls into this category. Since it doesn't have any
136 // controls other than a11y link we don't want that link to receive
137 // focus when screen is shown i.e. defaultControl is not defined.
138 // Focus a11y link instead.
139 $('accessibility-menu').elementToFocusOnHide = e.target;
145 * Spoken feedback checkbox handler.
147 handleSpokenFeedbackClick: function(e) {
148 chrome.send('enableSpokenFeedback', [$('spoken-feedback').checked]);
153 * Large cursor checkbox handler.
155 handleLargeCursorClick: function(e) {
156 chrome.send('enableLargeCursor', [$('large-cursor').checked]);
161 * High contrast mode checkbox handler.
163 handleHighContrastClick: function(e) {
164 chrome.send('enableHighContrast', [$('high-contrast').checked]);
169 * Screen magnifier checkbox handler.
171 handleScreenMagnifierClick: function(e) {
172 chrome.send('enableScreenMagnifier', [$('screen-magnifier').checked]);
177 * On-screen keyboard checkbox handler.
179 handleVirtualKeyboardClick: function(e) {
180 chrome.send('enableVirtualKeyboard', [$('virtual-keyboard').checked]);
185 * Sets usage statistics checkbox.
186 * @param {boolean} checked Is the checkbox checked?
188 setUsageStats: function(checked) {
189 $('usage-stats').checked = checked;
194 * @param {text} oemEulaUrl OEM EULA URL.
196 setOemEulaUrl: function(oemEulaUrl) {
198 $('oem-eula-frame').src = oemEulaUrl;
199 $('eulas').classList.remove('one-column');
201 $('eulas').classList.add('one-column');
207 * @param {text} password TPM password to be shown.
209 setTpmPassword: function(password) {
210 $('tpm-busy').hidden = true;
212 if (password.length) {
213 $('tpm-password').textContent = password;
214 $('tpm-password').hidden = false;
216 $('tpm-desc').hidden = true;
217 $('tpm-desc-powerwash').hidden = false;
222 * Refreshes a11y menu state.
223 * @param {!Object} data New dictionary with a11y features state.
225 refreshA11yInfo: function(data) {
226 $('high-contrast').checked = data.highContrastEnabled;
227 $('spoken-feedback').checked = data.spokenFeedbackEnabled;
228 $('screen-magnifier').checked = data.screenMagnifierEnabled;
229 $('large-cursor').checked = data.largeCursorEnabled;
230 $('virtual-keyboard').checked = data.virtualKeyboardEnabled;
234 * Reloads content of the page (localized strings, options of the select
236 * @param {!Object} data New dictionary with i18n values.
238 reloadContent: function(data) {
239 // Reload global local strings, process DOM tree again.
240 loadTimeData.overrideValues(data);
241 i18nTemplate.process(document, loadTimeData);
243 // Update language and input method menu lists.
244 Oobe.setupSelect($('language-select'), data.languageList, '');
245 Oobe.setupSelect($('keyboard-select'), data.inputMethodsList, '');
246 Oobe.setupSelect($('timezone-select'), data.timezoneList, '');
248 // Update localized content of the screens.
249 Oobe.updateLocalizedContent();
253 * Updates localized content of the screens.
254 * Should be executed on language change.
256 updateLocalizedContent: function() {
257 // Buttons, headers and links.
258 Oobe.getInstance().updateLocalizedContent_();