blob: 4c0782d2f4851162cd828741cfc0346d889d8dcf [file] [log] [blame]
michaelpg790ff8a2015-09-03 03:27:221// Copyright 2015 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/**
tommycli5bcd3c1b2015-10-07 23:25:546 * @fileoverview 'settings-languages-page' is the settings page
michaelpg790ff8a2015-09-03 03:27:227 * for language and input method settings.
michaelpg790ff8a2015-09-03 03:27:228 */
michaelpgc5bbdca2017-01-18 02:59:379cr.exportPath('settings');
10
11/**
12 * @const {number} Millisecond delay that can be used when closing an action
13 * menu to keep it briefly on-screen.
14 */
15settings.kMenuCloseDelay = 100;
16
Renjie Liub350ff322017-09-05 05:02:3617/**
18 * Name of the language setting is shown uma histogram.
19 * @type {string}
20 */
21const LANGUAGE_SETTING_IS_SHOWN_UMA_NAME = 'Translate.LanguageSettingsIsShown';
22
michaelpg0f479fec2015-09-25 04:03:4923(function() {
24'use strict';
25
michaelpg790ff8a2015-09-03 03:27:2226Polymer({
tommycli5bcd3c1b2015-10-07 23:25:5427 is: 'settings-languages-page',
michaelpg790ff8a2015-09-03 03:27:2228
29 properties: {
30 /**
31 * Preferences state.
32 */
33 prefs: {
34 type: Object,
35 notify: true,
36 },
37
michaelpg790ff8a2015-09-03 03:27:2238 /**
michaelpg0f479fec2015-09-25 04:03:4939 * Read-only reference to the languages model provided by the
tommycli5bcd3c1b2015-10-07 23:25:5440 * 'settings-languages' instance.
michaelpgabbd180d2016-04-23 02:42:3541 * @type {!LanguagesModel|undefined}
michaelpg790ff8a2015-09-03 03:27:2242 */
michaelpg0f479fec2015-09-25 04:03:4943 languages: {
44 type: Object,
45 notify: true,
michaelpg790ff8a2015-09-03 03:27:2246 },
dschuyler825c18d42016-02-11 02:51:0547
michaelpg75252ef72016-08-19 01:47:3948 /** @type {!LanguageHelper} */
49 languageHelper: Object,
50
dbeam141ae1f2017-06-19 18:28:3551 // <if expr="not is_macosx">
dschuyler825c18d42016-02-11 02:51:0552 /** @private */
michaelpg44d9dc82016-12-08 02:04:0053 spellCheckSecondaryText_: {
dschuyler825c18d42016-02-11 02:51:0554 type: String,
michaelpg44d9dc82016-12-08 02:04:0055 value: '',
56 computed: 'getSpellCheckSecondaryText_(languages.enabled.*)',
dschuyler825c18d42016-02-11 02:51:0557 },
dbeam141ae1f2017-06-19 18:28:3558 // </if>
michaelpg4d04ee92016-04-08 19:56:2859
60 /**
61 * The language to display the details for.
michaelpgabbd180d2016-04-23 02:42:3562 * @type {!LanguageState|undefined}
michaelpg4d04ee92016-04-08 19:56:2863 * @private
64 */
65 detailLanguage_: Object,
michaelpg9a670d42016-08-25 02:06:3766
Renjie Liub350ff322017-09-05 05:02:3667 /**
68 * Whether the language settings list is opened.
69 * @private
70 */
71 languagesOpened_: {
72 type: Boolean,
73 observer: 'onLanguagesOpenedChanged_',
74 },
75
michaelpg9a670d42016-08-25 02:06:3776 /** @private */
77 showAddLanguagesDialog_: Boolean,
dpapada4375e02017-04-11 04:07:4978
79 /** @private {!Map<string, string>} */
80 focusConfig_: {
81 type: Object,
82 value: function() {
83 var map = new Map();
dbeam141ae1f2017-06-19 18:28:3584 // <if expr="not is_macosx">
scottchenc31781b2017-07-10 19:52:4285 if (settings.routes.EDIT_DICTIONARY) {
86 map.set(
87 settings.routes.EDIT_DICTIONARY.path,
88 '#spellCheckCollapse .subpage-arrow');
89 }
dbeam141ae1f2017-06-19 18:28:3590 // </if>
91 // <if expr="chromeos">
scottchenc31781b2017-07-10 19:52:4292 if (settings.routes.INPUT_METHODS) {
93 map.set(
94 settings.routes.INPUT_METHODS.path,
95 '#inputMethodsCollapse .subpage-arrow');
96 }
dbeam141ae1f2017-06-19 18:28:3597 // </if>
dpapada4375e02017-04-11 04:07:4998 return map;
99 },
100 },
michaelpg45acdc7a2016-04-17 01:27:11101 },
michaelpga49c98b2015-12-04 20:27:25102
michaelpg790ff8a2015-09-03 03:27:22103 /**
michaelpg9a670d42016-08-25 02:06:37104 * Stamps and opens the Add Languages dialog, registering a listener to
105 * disable the dialog's dom-if again on close.
hcarmona60836482016-12-08 22:42:07106 * @param {!Event} e
michaelpg790ff8a2015-09-03 03:27:22107 * @private
108 */
hcarmona60836482016-12-08 22:42:07109 onAddLanguagesTap_: function(e) {
110 e.preventDefault();
michaelpg9a670d42016-08-25 02:06:37111 this.showAddLanguagesDialog_ = true;
112 this.async(function() {
113 var dialog = this.$$('settings-add-languages-dialog');
dpapade535c2e32017-07-24 21:12:22114 dialog.addEventListener('close', () => {
michaelpg9a670d42016-08-25 02:06:37115 this.showAddLanguagesDialog_ = false;
dbeamfff677252017-05-03 01:57:10116 cr.ui.focusWithoutInk(assert(this.$.addLanguages));
dpapade535c2e32017-07-24 21:12:22117 });
michaelpg9a670d42016-08-25 02:06:37118 });
michaelpg790ff8a2015-09-03 03:27:22119 },
120
121 /**
michaelpg4fed88702017-02-02 20:57:19122 * Used to determine which "Move" buttons to show for ordering enabled
123 * languages.
124 * @param {number} n
michaelpgb44ce492016-08-27 10:39:01125 * @param {!LanguageState} language
michaelpg4fed88702017-02-02 20:57:19126 * @return {boolean} True if |language| is at the |n|th index in the list of
127 * enabled languages.
mahmadi04d3fdc62016-06-28 14:43:24128 * @private
129 */
michaelpg4fed88702017-02-02 20:57:19130 isNthLanguage_: function(n, language) {
131 var compareLanguage = assert(this.languages.enabled[n]);
132 return language.language == compareLanguage.language;
mahmadi04d3fdc62016-06-28 14:43:24133 },
134
135 /**
michaelpgb44ce492016-08-27 10:39:01136 * @param {!LanguageState} language
michaelpg4fed88702017-02-02 20:57:19137 * @return {boolean} True if the "Move to top" option for |language| should be
138 * visible.
michaelpge11da422016-09-29 00:36:40139 * @private
140 */
michaelpg4fed88702017-02-02 20:57:19141 showMoveUp_: function(language) {
142 // "Move up" is a no-op for the top language, and redundant with
143 // "Move to top" for the 2nd language.
144 return !this.isNthLanguage_(0, language) &&
dbeam141ae1f2017-06-19 18:28:35145 !this.isNthLanguage_(1, language);
michaelpge11da422016-09-29 00:36:40146 },
147
148 /**
149 * @param {!LanguageState} language
michaelpg4fed88702017-02-02 20:57:19150 * @return {boolean} True if the "Move down" option for |language| should be
151 * visible.
mahmadi04d3fdc62016-06-28 14:43:24152 * @private
153 */
michaelpg4fed88702017-02-02 20:57:19154 showMoveDown_: function(language) {
155 return !this.isNthLanguage_(this.languages.enabled.length - 1, language);
mahmadi04d3fdc62016-06-28 14:43:24156 },
157
158 /**
159 * @param {!Object} change Polymer change object for languages.enabled.*.
160 * @return {boolean} True if there are less than 2 languages.
161 */
162 isHelpTextHidden_: function(change) {
163 return this.languages.enabled.length <= 1;
164 },
165
dbeam141ae1f2017-06-19 18:28:35166 // <if expr="chromeos">
dpapadeb8e8df2017-04-19 17:45:26167 /**
168 * Applies Chrome OS session tweaks to the menu.
169 * @param {!CrActionMenuElement} menu
170 * @private
171 */
172 tweakMenuForCrOS_: function(menu) {
173 // In a CrOS multi-user session, the primary user controls the UI language.
174 // TODO(michaelpg): The language selection should not be hidden, but should
175 // show a policy indicator. crbug.com/648498
176 if (this.isSecondaryUser_())
177 menu.querySelector('#uiLanguageItem').hidden = true;
178
179 // The UI language choice doesn't persist for guests.
Steven Bennetts251b6252017-08-17 18:45:36180 if (loadTimeData.getBoolean('isGuest'))
dpapadeb8e8df2017-04-19 17:45:26181 menu.querySelector('#uiLanguageItem').hidden = true;
dpapadeb8e8df2017-04-19 17:45:26182 },
183
184 /**
185 * Opens the Manage Input Methods page.
186 * @private
187 */
188 onManageInputMethodsTap_: function() {
scottchenc31781b2017-07-10 19:52:42189 settings.navigateTo(settings.routes.INPUT_METHODS);
dpapadeb8e8df2017-04-19 17:45:26190 },
191
192 /**
193 * Handler for tap and <Enter> events on an input method on the main page,
194 * which sets it as the current input method.
195 * @param {!{model: !{item: !chrome.languageSettingsPrivate.InputMethod},
196 * target: !{tagName: string},
197 * type: string,
198 * key: (string|undefined)}} e
199 */
200 onInputMethodTap_: function(e) {
Dave Schuylerede4e782017-07-11 01:04:03201 // Taps on the button are handled in onInputMethodOptionsTap_.
202 // TODO(dschuyler): The row has two operations that are not clearly
203 // delineated. crbug.com/740691
204 if (e.target.tagName == 'BUTTON')
dpapadeb8e8df2017-04-19 17:45:26205 return;
206
207 // Ignore key presses other than <Enter>.
208 if (e.type == 'keypress' && e.key != 'Enter')
209 return;
210
211 // Set the input method.
212 this.languageHelper.setCurrentInputMethod(e.model.item.id);
213 },
214
215 /**
216 * Opens the input method extension's options page in a new tab (or focuses
217 * an existing instance of the IME's options).
218 * @param {!{model: !{item: chrome.languageSettingsPrivate.InputMethod}}} e
219 * @private
220 */
221 onInputMethodOptionsTap_: function(e) {
222 this.languageHelper.openInputMethodOptions(e.model.item.id);
223 },
dbeam141ae1f2017-06-19 18:28:35224 // </if>
dpapadeb8e8df2017-04-19 17:45:26225
dbeam141ae1f2017-06-19 18:28:35226 // <if expr="chromeos or is_win">
dpapadeb8e8df2017-04-19 17:45:26227 /**
228 * @return {boolean} True for a secondary user in a multi-profile session.
229 * @private
230 */
231 isSecondaryUser_: function() {
232 return cr.isChromeOS && loadTimeData.getBoolean('isSecondaryUser');
233 },
234
235 /**
236 * @param {string} languageCode The language code identifying a language.
237 * @param {string} prospectiveUILanguage The prospective UI language.
238 * @return {boolean} True if the prospective UI language is set to
239 * |languageCode| but requires a restart to take effect.
240 * @private
241 */
242 isRestartRequired_: function(languageCode, prospectiveUILanguage) {
243 return prospectiveUILanguage == languageCode &&
244 this.languageHelper.requiresRestart();
245 },
246
mahmadi04d3fdc62016-06-28 14:43:24247 /**
michaelpgc3b245a42016-09-22 03:20:56248 * @param {!LanguageState} languageState
249 * @param {string} prospectiveUILanguage The chosen UI language.
michaelpg4cb21262016-12-14 02:46:48250 * @return {boolean} True if the given language cannot be set as the
michaelpgc3b245a42016-09-22 03:20:56251 * prospective UI language by the user.
252 * @private
253 */
254 disableUILanguageCheckbox_: function(languageState, prospectiveUILanguage) {
255 // UI language setting belongs to the primary user.
256 if (this.isSecondaryUser_())
257 return true;
258
michaelpg4cb21262016-12-14 02:46:48259 // If the language cannot be a UI language, we can't set it as the
michaelpgc3b245a42016-09-22 03:20:56260 // prospective UI language.
261 if (!languageState.language.supportsUI)
262 return true;
263
michaelpg4cb21262016-12-14 02:46:48264 // Unchecking the currently chosen language doesn't make much sense.
265 if (languageState.language.code == prospectiveUILanguage)
michaelpgc3b245a42016-09-22 03:20:56266 return true;
michaelpgc3b245a42016-09-22 03:20:56267
michaelpg4cb21262016-12-14 02:46:48268 // Otherwise, the prospective language can be changed to this language.
michaelpgc3b245a42016-09-22 03:20:56269 return false;
270 },
271
272 /**
michaelpgc3b245a42016-09-22 03:20:56273 * Handler for changes to the UI language checkbox.
274 * @param {!{target: !PaperCheckboxElement}} e
275 * @private
276 */
277 onUILanguageChange_: function(e) {
michaelpg4cb21262016-12-14 02:46:48278 // We don't support unchecking this checkbox. TODO(michaelpg): Ask for a
279 // simpler widget.
280 assert(e.target.checked);
281 this.languageHelper.setProspectiveUILanguage(
282 this.detailLanguage_.language.code);
283
michaelpgc5bbdca2017-01-18 02:59:37284 this.closeMenuSoon_();
michaelpgc3b245a42016-09-22 03:20:56285 },
dbeam141ae1f2017-06-19 18:28:35286 // </if>
michaelpgc3b245a42016-09-22 03:20:56287
michaelpgc5bbdca2017-01-18 02:59:37288 /**
michaelpgc3b245a42016-09-22 03:20:56289 * @param {!chrome.languageSettingsPrivate.Language} language
290 * @param {string} targetLanguageCode The default translate target language.
291 * @return {boolean} True if the translate checkbox should be disabled.
292 * @private
293 */
294 disableTranslateCheckbox_: function(language, targetLanguageCode) {
295 if (!language.supportsTranslate)
296 return true;
297
298 return this.languageHelper.convertLanguageCodeForTranslate(language.code) ==
299 targetLanguageCode;
300 },
301
302 /**
303 * Handler for changes to the translate checkbox.
304 * @param {!{target: !PaperCheckboxElement}} e
305 * @private
306 */
307 onTranslateCheckboxChange_: function(e) {
308 if (e.target.checked) {
309 this.languageHelper.enableTranslateLanguage(
310 this.detailLanguage_.language.code);
311 } else {
312 this.languageHelper.disableTranslateLanguage(
313 this.detailLanguage_.language.code);
314 }
michaelpgc5bbdca2017-01-18 02:59:37315 this.closeMenuSoon_();
michaelpge11da422016-09-29 00:36:40316 },
317
318 /**
319 * Returns "complex" if the menu includes checkboxes, which should change the
320 * spacing of items and show a separator in the menu.
321 * @param {boolean} translateEnabled
322 * @return {string}
323 */
324 getMenuClass_: function(translateEnabled) {
325 if (translateEnabled || cr.isChromeOS || cr.isWindows)
326 return 'complex';
327 return '';
328 },
329
330 /**
331 * Moves the language to the top of the list.
332 * @private
333 */
334 onMoveToTopTap_: function() {
dbeam141ae1f2017-06-19 18:28:35335 /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close();
michaelpge11da422016-09-29 00:36:40336 this.languageHelper.moveLanguageToFront(this.detailLanguage_.language.code);
michaelpgc3b245a42016-09-22 03:20:56337 },
338
339 /**
mahmadi04d3fdc62016-06-28 14:43:24340 * Moves the language up in the list.
mahmadi04d3fdc62016-06-28 14:43:24341 * @private
342 */
michaelpgb44ce492016-08-27 10:39:01343 onMoveUpTap_: function() {
dbeam141ae1f2017-06-19 18:28:35344 /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close();
michaelpgb44ce492016-08-27 10:39:01345 this.languageHelper.moveLanguage(this.detailLanguage_.language.code, -1);
mahmadi04d3fdc62016-06-28 14:43:24346 },
347
348 /**
349 * Moves the language down in the list.
mahmadi04d3fdc62016-06-28 14:43:24350 * @private
351 */
michaelpgb44ce492016-08-27 10:39:01352 onMoveDownTap_: function() {
dbeam141ae1f2017-06-19 18:28:35353 /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close();
michaelpgb44ce492016-08-27 10:39:01354 this.languageHelper.moveLanguage(this.detailLanguage_.language.code, 1);
mahmadi04d3fdc62016-06-28 14:43:24355 },
356
357 /**
michaelpg9a670d42016-08-25 02:06:37358 * Disables the language.
michaelpg9a670d42016-08-25 02:06:37359 * @private
360 */
michaelpgb44ce492016-08-27 10:39:01361 onRemoveLanguageTap_: function() {
dbeam141ae1f2017-06-19 18:28:35362 /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close();
michaelpgb44ce492016-08-27 10:39:01363 this.languageHelper.disableLanguage(this.detailLanguage_.language.code);
michaelpg9a670d42016-08-25 02:06:37364 },
365
dbeam141ae1f2017-06-19 18:28:35366 // <if expr="chromeos or is_win">
michaelpg9a670d42016-08-25 02:06:37367 /**
dpapadeb8e8df2017-04-19 17:45:26368 * Checks whether the prospective UI language (the pref that indicates what
369 * language to use in Chrome) matches the current language. This pref is used
370 * only on Chrome OS and Windows; we don't control the UI language elsewhere.
371 * @param {string} languageCode The language code identifying a language.
372 * @param {string} prospectiveUILanguage The prospective UI language.
373 * @return {boolean} True if the given language matches the prospective UI
374 * pref (which may be different from the actual UI language).
michaelpgd700e562016-04-24 00:41:59375 * @private
376 */
dpapadeb8e8df2017-04-19 17:45:26377 isProspectiveUILanguage_: function(languageCode, prospectiveUILanguage) {
378 return languageCode == prospectiveUILanguage;
michaelpgd700e562016-04-24 00:41:59379 },
380
dbeam141ae1f2017-06-19 18:28:35381 /**
382 * @param {string} prospectiveUILanguage
383 * @return {string}
384 * @private
385 */
dpapadeb8e8df2017-04-19 17:45:26386 getProspectiveUILanguageName_: function(prospectiveUILanguage) {
387 return this.languageHelper.getLanguage(prospectiveUILanguage).displayName;
michaelpgd700e562016-04-24 00:41:59388 },
dbeam141ae1f2017-06-19 18:28:35389 // </if>
michaelpgd700e562016-04-24 00:41:59390
391 /**
dpapadeb8e8df2017-04-19 17:45:26392 * @return {string}
michaelpgd700e562016-04-24 00:41:59393 * @private
394 */
dpapadeb8e8df2017-04-19 17:45:26395 getLanguageListTwoLine_: function() {
396 return cr.isChromeOS || cr.isWindows ? 'two-line' : '';
michaelpgd700e562016-04-24 00:41:59397 },
398
dbeam141ae1f2017-06-19 18:28:35399 // <if expr="not is_macosx">
michaelpgd700e562016-04-24 00:41:59400 /**
michaelpg9fefdaf2016-06-13 22:33:11401 * Returns the secondary text for the spell check subsection based on the
402 * enabled spell check languages, listing at most 2 languages.
403 * @return {string}
404 * @private
405 */
406 getSpellCheckSecondaryText_: function() {
407 var enabledSpellCheckLanguages =
408 this.languages.enabled.filter(function(languageState) {
409 return languageState.spellCheckEnabled &&
dbeam141ae1f2017-06-19 18:28:35410 languageState.language.supportsSpellcheck;
michaelpg9fefdaf2016-06-13 22:33:11411 });
412 switch (enabledSpellCheckLanguages.length) {
413 case 0:
414 return '';
415 case 1:
416 return enabledSpellCheckLanguages[0].language.displayName;
417 case 2:
418 return loadTimeData.getStringF(
419 'spellCheckSummaryTwoLanguages',
420 enabledSpellCheckLanguages[0].language.displayName,
421 enabledSpellCheckLanguages[1].language.displayName);
422 case 3:
423 // "foo, bar, and 1 other"
424 return loadTimeData.getStringF(
425 'spellCheckSummaryThreeLanguages',
426 enabledSpellCheckLanguages[0].language.displayName,
427 enabledSpellCheckLanguages[1].language.displayName);
428 default:
429 // "foo, bar, and [N-2] others"
430 return loadTimeData.getStringF(
431 'spellCheckSummaryMultipleLanguages',
432 enabledSpellCheckLanguages[0].language.displayName,
433 enabledSpellCheckLanguages[1].language.displayName,
434 (enabledSpellCheckLanguages.length - 2).toLocaleString());
435 }
436 },
437
438 /**
michaelpg53fc07e2015-10-27 20:18:16439 * Opens the Custom Dictionary page.
440 * @private
441 */
442 onEditDictionaryTap_: function() {
scottchenc31781b2017-07-10 19:52:42443 settings.navigateTo(settings.routes.EDIT_DICTIONARY);
michaelpg53fc07e2015-10-27 20:18:16444 },
michaelpg53fc07e2015-10-27 20:18:16445
michaelpgaf3a9282015-10-01 00:07:33446 /**
dpapadeb8e8df2017-04-19 17:45:26447 * Handler for enabling or disabling spell check.
448 * @param {!{target: Element, model: !{item: !LanguageState}}} e
michaelpgaf3a9282015-10-01 00:07:33449 */
dpapadeb8e8df2017-04-19 17:45:26450 onSpellCheckChange_: function(e) {
451 var item = e.model.item;
452 if (!item.language.supportsSpellcheck)
453 return;
michaelpg790ff8a2015-09-03 03:27:22454
dbeam141ae1f2017-06-19 18:28:35455 this.languageHelper.toggleSpellCheck(
456 item.language.code, !item.spellCheckEnabled);
michaelpg04f42db22016-11-29 02:18:14457 },
michaelpg4d04ee92016-04-08 19:56:28458
459 /**
michaelpg44d9dc82016-12-08 02:04:00460 * @return {string}
461 * @private
462 */
463 getSpellCheckListTwoLine_: function() {
464 return this.spellCheckSecondaryText_.length ? 'two-line' : '';
465 },
dbeam141ae1f2017-06-19 18:28:35466 // </if>
michaelpg44d9dc82016-12-08 02:04:00467
468 /**
michaelpg4d04ee92016-04-08 19:56:28469 * Returns either the "selected" class, if the language matches the
470 * prospective UI language, or an empty string. Languages can only be
471 * selected on Chrome OS and Windows.
472 * @param {string} languageCode The language code identifying a language.
473 * @param {string} prospectiveUILanguage The prospective UI language.
474 * @return {string} The class name for the language item.
475 * @private
476 */
michaelpg4cb21262016-12-14 02:46:48477 getLanguageItemClass_: function(languageCode, prospectiveUILanguage) {
michaelpgc3b245a42016-09-22 03:20:56478 if ((cr.isChromeOS || cr.isWindows) &&
michaelpg4cb21262016-12-14 02:46:48479 languageCode == prospectiveUILanguage) {
michaelpgc3b245a42016-09-22 03:20:56480 return 'selected';
michaelpgabbd180d2016-04-23 02:42:35481 }
michaelpgc3b245a42016-09-22 03:20:56482 return '';
483 },
dbeamed6888382016-06-25 01:33:15484
dbeam141ae1f2017-06-19 18:28:35485 // <if expr="chromeos">
michaelpg790ff8a2015-09-03 03:27:22486 /**
487 * @param {string} id The input method ID.
488 * @param {string} currentId The ID of the currently enabled input method.
489 * @return {boolean} True if the IDs match.
490 * @private
491 */
492 isCurrentInputMethod_: function(id, currentId) {
493 assert(cr.isChromeOS);
494 return id == currentId;
495 },
michaelpg53fc07e2015-10-27 20:18:16496
497 /**
michaelpg4d04ee92016-04-08 19:56:28498 * @param {string} id The input method ID.
499 * @param {string} currentId The ID of the currently enabled input method.
500 * @return {string} The class for the input method item.
501 * @private
502 */
503 getInputMethodItemClass_: function(id, currentId) {
michaelpgabbd180d2016-04-23 02:42:35504 assert(cr.isChromeOS);
michaelpg4d04ee92016-04-08 19:56:28505 return this.isCurrentInputMethod_(id, currentId) ? 'selected' : '';
506 },
michaelpg4d04ee92016-04-08 19:56:28507
michaelpgd700e562016-04-24 00:41:59508 getInputMethodName_: function(id) {
509 assert(cr.isChromeOS);
dbeam141ae1f2017-06-19 18:28:35510 var inputMethod =
511 this.languages.inputMethods.enabled.find(function(inputMethod) {
michaelpgd700e562016-04-24 00:41:59512 return inputMethod.id == id;
513 });
514 return inputMethod ? inputMethod.displayName : '';
515 },
dbeam141ae1f2017-06-19 18:28:35516 // </if>
michaelpgd700e562016-04-24 00:41:59517
michaelpg4d04ee92016-04-08 19:56:28518 /**
michaelpgb44ce492016-08-27 10:39:01519 * @param {!Event} e
520 * @private
521 */
dpapad46b5ca12016-10-15 02:11:42522 onDotsTap_: function(e) {
michaelpg4cb21262016-12-14 02:46:48523 // Set a copy of the LanguageState object since it is not data-bound to the
524 // languages model directly.
dbeam141ae1f2017-06-19 18:28:35525 this.detailLanguage_ = /** @type {!LanguageState} */ (Object.assign(
michaelpg4cb21262016-12-14 02:46:48526 {},
dbeam141ae1f2017-06-19 18:28:35527 /** @type {!{model: !{item: !LanguageState}}} */ (e).model.item));
michaelpgb44ce492016-08-27 10:39:01528
529 // Ensure the template has been stamped.
dbeam141ae1f2017-06-19 18:28:35530 var menu = /** @type {?CrActionMenuElement} */ (this.$.menu.getIfExists());
michaelpgc3b245a42016-09-22 03:20:56531 if (!menu) {
dbeam141ae1f2017-06-19 18:28:35532 menu = /** @type {!CrActionMenuElement} */ (this.$.menu.get());
533 // <if expr="chromeos">
dpapadeb8e8df2017-04-19 17:45:26534 this.tweakMenuForCrOS_(menu);
dbeam141ae1f2017-06-19 18:28:35535 // </if>
michaelpgb44ce492016-08-27 10:39:01536 }
michaelpgc3b245a42016-09-22 03:20:56537
dpapad46b5ca12016-10-15 02:11:42538 menu.showAt(/** @type {!Element} */ (e.target));
michaelpgc3b245a42016-09-22 03:20:56539 },
540
541 /**
Renjie Liub350ff322017-09-05 05:02:36542 * @param {boolean} newVal The new value of languagesOpened_.
543 * @param {boolean} oldVal The old value of languagesOpened_.
544 * @private
545 */
546 onLanguagesOpenedChanged_: function(newVal, oldVal) {
547 if (!oldVal && newVal) {
548 chrome.send(
549 'metricsHandler:recordBooleanHistogram',
550 [LANGUAGE_SETTING_IS_SHOWN_UMA_NAME, true]);
551 }
552 },
553
554 /**
michaelpgc5bbdca2017-01-18 02:59:37555 * Closes the shared action menu after a short delay, so when a checkbox is
556 * tapped it can be seen to change state before disappearing.
557 * @private
558 */
559 closeMenuSoon_: function() {
dbeam141ae1f2017-06-19 18:28:35560 var menu = /** @type {!CrActionMenuElement} */ (this.$.menu.get());
michaelpgc5bbdca2017-01-18 02:59:37561 setTimeout(function() {
562 if (menu.open)
563 menu.close();
564 }, settings.kMenuCloseDelay);
565 },
566
dbeam141ae1f2017-06-19 18:28:35567 // <if expr="chromeos or is_win">
michaelpgc5bbdca2017-01-18 02:59:37568 /**
michaelpgc3b245a42016-09-22 03:20:56569 * Handler for the restart button.
570 * @private
571 */
572 onRestartTap_: function() {
dbeam141ae1f2017-06-19 18:28:35573 // <if expr="chromeos">
michaelpgc3b245a42016-09-22 03:20:56574 settings.LifetimeBrowserProxyImpl.getInstance().signOutAndRestart();
dbeam141ae1f2017-06-19 18:28:35575 // </if>
576 // <if expr="is_win">
michaelpgc3b245a42016-09-22 03:20:56577 settings.LifetimeBrowserProxyImpl.getInstance().restart();
dbeam141ae1f2017-06-19 18:28:35578 // </if>
michaelpgb44ce492016-08-27 10:39:01579 },
dbeam141ae1f2017-06-19 18:28:35580 // </if>
michaelpg10719a72016-12-07 09:05:21581
582 /**
583 * Toggles the expand button within the element being listened to.
584 * @param {!Event} e
585 * @private
586 */
587 toggleExpandButton_: function(e) {
588 // The expand button handles toggling itself.
589 var expandButtonTag = 'CR-EXPAND-BUTTON';
590 if (e.target.tagName == expandButtonTag)
591 return;
592
593 /** @type {!CrExpandButtonElement} */
594 var expandButton = e.currentTarget.querySelector(expandButtonTag);
595 assert(expandButton);
596 expandButton.expanded = !expandButton.expanded;
597 },
michaelpg790ff8a2015-09-03 03:27:22598});
michaelpg0f479fec2015-09-25 04:03:49599})();