1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
// 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_();
}
};
});
|