// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Out of the box experience flow (OOBE).
* This is the main code for the OOBE WebUI implementation.
*/
<include src="login_common.js"></include>
<include src="oobe_screen_eula.js"></include>
<include src="oobe_screen_network.js"></include>
<include src="oobe_screen_update.js"></include>
cr.define('cr.ui.Oobe', function() {
return {
/**
* Setups given "select" element using the list and adds callback.
* @param {!Element} select Select object to be updated.
* @param {!Object} list List of the options to be added.
* @param {string} callback Callback name which should be send to Chrome or
* an empty string if the event listener shouldn't be added.
*/
setupSelect: function(select, list, callback) {
select.options.length = 0;
for (var i = 0; i < list.length; ++i) {
var item = list[i];
var option =
new Option(item.title, item.value, item.selected, item.selected);
select.appendChild(option);
}
if (callback) {
var sendCallback = function() {
chrome.send(callback, [select.options[select.selectedIndex].value]);
};
select.addEventListener('blur', sendCallback);
select.addEventListener('click', sendCallback);
select.addEventListener('keyup', function(event) {
var keycodeInterested = [
9, // Tab
13, // Enter
27, // Escape
];
if (keycodeInterested.indexOf(event.keyCode) >= 0)
sendCallback();
});
}
},
/**
* Initializes the OOBE flow. This will cause all C++ handlers to
* be invoked to do final setup.
*/
initialize: function() {
cr.ui.login.DisplayManager.initialize();
login.WrongHWIDScreen.register();
login.NetworkScreen.register();
login.EulaScreen.register();
login.UpdateScreen.register();
login.ResetScreen.register();
login.AutolaunchScreen.register();
login.KioskEnableScreen.register();
login.AccountPickerScreen.register();
login.GaiaSigninScreen.register();
login.UserImageScreen.register(/* lazyInit= */ false);
login.ErrorMessageScreen.register();
login.TPMErrorMessageScreen.register();
login.PasswordChangedScreen.register();
login.LocallyManagedUserCreationScreen.register();
login.TermsOfServiceScreen.register();
login.AppLaunchSplashScreen.register();
login.ConfirmPasswordScreen.register();
login.MessageBoxScreen.register();
cr.ui.Bubble.decorate($('bubble'));
login.HeaderBar.decorate($('login-header-bar'));
Oobe.initializeA11yMenu();
chrome.send('screenStateInitialize');
},
/**
* Initializes OOBE accessibility menu.
*/
initializeA11yMenu: function() {
cr.ui.Bubble.decorate($('accessibility-menu'));
$('connect-accessibility-link').addEventListener(
'click', Oobe.handleAccessbilityLinkClick);
$('eula-accessibility-link').addEventListener(
'click', Oobe.handleAccessbilityLinkClick);
$('update-accessibility-link').addEventListener(
'click', Oobe.handleAccessbilityLinkClick);
$('high-contrast').addEventListener('click',
Oobe.handleHighContrastClick);
$('large-cursor').addEventListener('click',
Oobe.handleLargeCursorClick);
$('spoken-feedback').addEventListener('click',
Oobe.handleSpokenFeedbackClick);
$('screen-magnifier').addEventListener('click',
Oobe.handleScreenMagnifierClick);
// A11y menu should be accessible i.e. disable autohide on any
// keydown or click inside menu.
$('accessibility-menu').hideOnKeyPress = false;
$('accessibility-menu').hideOnSelfClick = false;
},
/**
* Accessibility link handler.
*/
handleAccessbilityLinkClick: function(e) {
/** @const */ var BUBBLE_OFFSET = 5;
/** @const */ var BUBBLE_PADDING = 10;
$('accessibility-menu').showForElement(e.target,
cr.ui.Bubble.Attachment.BOTTOM,
BUBBLE_OFFSET, BUBBLE_PADDING);
if (Oobe.getInstance().currentScreen &&
Oobe.getInstance().currentScreen.defaultControl) {
$('accessibility-menu').elementToFocusOnHide =
Oobe.getInstance().currentScreen.defaultControl;
} else {
// Update screen falls into this category. Since it doesn't have any
// controls other than a11y link we don't want that link to receive
// focus when screen is shown i.e. defaultControl is not defined.
// Focus a11y link instead.
$('accessibility-menu').elementToFocusOnHide = e.target;
}
e.stopPropagation();
},
/**
* Spoken feedback checkbox handler.
*/
handleSpokenFeedbackClick: function(e) {
chrome.send('enableSpokenFeedback', [$('spoken-feedback').checked]);
e.stopPropagation();
},
/**
* Large cursor checkbox handler.
*/
handleLargeCursorClick: function(e) {
chrome.send('enableLargeCursor', [$('large-cursor').checked]);
e.stopPropagation();
},
/**
* High contrast mode checkbox handler.
*/
handleHighContrastClick: function(e) {
chrome.send('enableHighContrast', [$('high-contrast').checked]);
e.stopPropagation();
},
/**
* Screen magnifier checkbox handler.
*/
handleScreenMagnifierClick: function(e) {
chrome.send('enableScreenMagnifier', [$('screen-magnifier').checked]);
e.stopPropagation();
},
/**
* Sets usage statistics checkbox.
* @param {boolean} checked Is the checkbox checked?
*/
setUsageStats: function(checked) {
$('usage-stats').checked = checked;
},
/**
* Set OEM EULA URL.
* @param {text} oemEulaUrl OEM EULA URL.
*/
setOemEulaUrl: function(oemEulaUrl) {
if (oemEulaUrl) {
$('oem-eula-frame').src = oemEulaUrl;
$('eulas').classList.remove('one-column');
} else {
$('eulas').classList.add('one-column');
}
},
/**
* Sets TPM password.
* @param {text} password TPM password to be shown.
*/
setTpmPassword: function(password) {
$('tpm-busy').hidden = true;
if (password.length) {
$('tpm-password').textContent = password;
$('tpm-password').hidden = false;
} else {
$('tpm-desc').hidden = true;
$('tpm-desc-powerwash').hidden = false;
}
},
/**
* Refreshes a11y menu state.
* @param {!Object} data New dictionary with a11y features state.
*/
refreshA11yInfo: function(data) {
$('high-contrast').checked = data.highContrastEnabled;
$('spoken-feedback').checked = data.spokenFeedbackEnabled;
$('screen-magnifier').checked = data.screenMagnifierEnabled;
$('large-cursor').checked = data.largeCursorEnabled;
},
/**
* Reloads content of the page (localized strings, options of the select
* controls).
* @param {!Object} data New dictionary with i18n values.
*/
reloadContent: function(data) {
// Reload global local strings, process DOM tree again.
loadTimeData.overrideValues(data);
i18nTemplate.process(document, loadTimeData);
// Update language and input method menu lists.
Oobe.setupSelect($('language-select'), data.languageList, '');
Oobe.setupSelect($('keyboard-select'), data.inputMethodsList, '');
Oobe.setupSelect($('timezone-select'), data.timezoneList, '');
// Update localized content of the screens.
Oobe.updateLocalizedContent();
},
/**
* Updates localized content of the screens.
* Should be executed on language change.
*/
updateLocalizedContent: function() {
// Buttons, headers and links.
Oobe.getInstance().updateLocalizedContent_();
}
};
});