| Index: chrome/browser/resources/options/chromeos_language_options.js
|
| ===================================================================
|
| --- chrome/browser/resources/options/chromeos_language_options.js (revision 71729)
|
| +++ chrome/browser/resources/options/chromeos_language_options.js (working copy)
|
| @@ -1,761 +0,0 @@
|
| -// Copyright (c) 2010 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.
|
| -
|
| -// TODO(kochi): Generalize the notification as a component and put it
|
| -// in js/cr/ui/notification.js .
|
| -
|
| -cr.define('options', function() {
|
| -
|
| - const OptionsPage = options.OptionsPage;
|
| - const AddLanguageOverlay = options.language.AddLanguageOverlay;
|
| - const LanguageList = options.language.LanguageList;
|
| -
|
| - // Some input methods like Chinese Pinyin have config pages.
|
| - // This is the map of the input method names to their config page names.
|
| - const INPUT_METHOD_ID_TO_CONFIG_PAGE_NAME = {
|
| - 'chewing': 'languageChewing',
|
| - 'hangul': 'languageHangul',
|
| - 'mozc': 'languageMozc',
|
| - 'mozc-dv': 'languageMozc',
|
| - 'mozc-jp': 'languageMozc',
|
| - 'pinyin': 'languagePinyin',
|
| - };
|
| -
|
| - /////////////////////////////////////////////////////////////////////////////
|
| - // LanguageOptions class:
|
| -
|
| - /**
|
| - * Encapsulated handling of ChromeOS language options page.
|
| - * @constructor
|
| - */
|
| - function LanguageOptions(model) {
|
| - OptionsPage.call(this, 'language', localStrings.getString('languagePage'),
|
| - 'languagePage');
|
| - }
|
| -
|
| - cr.addSingletonGetter(LanguageOptions);
|
| -
|
| - // Inherit LanguageOptions from OptionsPage.
|
| - LanguageOptions.prototype = {
|
| - __proto__: OptionsPage.prototype,
|
| -
|
| - /**
|
| - * Initializes LanguageOptions page.
|
| - * Calls base class implementation to starts preference initialization.
|
| - */
|
| - initializePage: function() {
|
| - OptionsPage.prototype.initializePage.call(this);
|
| -
|
| - var languageOptionsList = $('language-options-list');
|
| - LanguageList.decorate(languageOptionsList);
|
| -
|
| - languageOptionsList.addEventListener('change',
|
| - this.handleLanguageOptionsListChange_.bind(this));
|
| - languageOptionsList.addEventListener('save',
|
| - this.handleLanguageOptionsListSave_.bind(this));
|
| -
|
| - this.addEventListener('visibleChange',
|
| - this.handleVisibleChange_.bind(this));
|
| -
|
| - this.initializeInputMethodList_();
|
| - this.initializeLanguageCodeToInputMehotdIdsMap_();
|
| -
|
| - // Set up add button.
|
| - $('language-options-add-button').onclick = function(e) {
|
| - // Add the language without showing the overlay if it's specified in
|
| - // the URL hash (ex. lang_add=ja). Used for automated testing.
|
| - var match = document.location.hash.match(/\blang_add=([\w-]+)/);
|
| - if (match) {
|
| - var addLanguageCode = match[1];
|
| - $('language-options-list').addLanguage(addLanguageCode);
|
| - } else {
|
| - OptionsPage.showOverlay('addLanguageOverlay');
|
| - }
|
| - };
|
| - // Set up remove button.
|
| - $('language-options-remove-button').addEventListener('click',
|
| - this.handleRemoveButtonClick_.bind(this));
|
| -
|
| - // Setup add language overlay page.
|
| - OptionsPage.registerOverlay(AddLanguageOverlay.getInstance());
|
| -
|
| - // Listen to user clicks on the add language list.
|
| - var addLanguageList = $('add-language-overlay-language-list');
|
| - addLanguageList.addEventListener('click',
|
| - this.handleAddLanguageListClick_.bind(this));
|
| - },
|
| -
|
| - // The preference is a CSV string that describes preload engines
|
| - // (i.e. active input methods).
|
| - preloadEnginesPref: 'settings.language.preload_engines',
|
| - // The list of preload engines, like ['mozc', 'pinyin'].
|
| - preloadEngines_: [],
|
| - // The preference is a string that describes the spell check
|
| - // dictionary language, like "en-US".
|
| - spellCheckDictionaryPref: 'spellcheck.dictionary',
|
| - spellCheckDictionary_: "",
|
| - // The map of language code to input method IDs, like:
|
| - // {'ja': ['mozc', 'mozc-jp'], 'zh-CN': ['pinyin'], ...}
|
| - languageCodeToInputMethodIdsMap_: {},
|
| -
|
| - /**
|
| - * Initializes the input method list.
|
| - */
|
| - initializeInputMethodList_: function() {
|
| - var inputMethodList = $('language-options-input-method-list');
|
| - var inputMethodListData = templateData.inputMethodList;
|
| -
|
| - // Add all input methods, but make all of them invisible here. We'll
|
| - // change the visibility in handleLanguageOptionsListChange_() based
|
| - // on the selected language. Note that we only have less than 100
|
| - // input methods, so creating DOM nodes at once here should be ok.
|
| - for (var i = 0; i < inputMethodListData.length; i++) {
|
| - var inputMethod = inputMethodListData[i];
|
| - var input = document.createElement('input');
|
| - input.type = 'checkbox';
|
| - input.inputMethodId = inputMethod.id;
|
| - // Listen to user clicks.
|
| - input.addEventListener('click',
|
| - this.handleCheckboxClick_.bind(this));
|
| - var label = document.createElement('label');
|
| - label.appendChild(input);
|
| - label.appendChild(document.createTextNode(inputMethod.displayName));
|
| - label.style.display = 'none';
|
| - label.languageCodeSet = inputMethod.languageCodeSet;
|
| - // Add the configure button if the config page is present for this
|
| - // input method.
|
| - if (inputMethod.id in INPUT_METHOD_ID_TO_CONFIG_PAGE_NAME) {
|
| - var pageName = INPUT_METHOD_ID_TO_CONFIG_PAGE_NAME[inputMethod.id];
|
| - var button = this.createConfigureInputMethodButton_(inputMethod.id,
|
| - pageName);
|
| - label.appendChild(button);
|
| - }
|
| -
|
| - inputMethodList.appendChild(label);
|
| - }
|
| - // Listen to pref change once the input method list is initialized.
|
| - Preferences.getInstance().addEventListener(this.preloadEnginesPref,
|
| - this.handlePreloadEnginesPrefChange_.bind(this));
|
| - Preferences.getInstance().addEventListener(this.spellCheckDictionaryPref,
|
| - this.handleSpellCheckDictionaryPrefChange_.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * Creates a configure button for the given input method ID.
|
| - * @param {string} inputMethodId Input method ID (ex. "pinyin").
|
| - * @param {string} pageName Name of the config page (ex. "languagePinyin").
|
| - * @private
|
| - */
|
| - createConfigureInputMethodButton_: function(inputMethodId, pageName) {
|
| - var button = document.createElement('button');
|
| - button.textContent = localStrings.getString('configure');
|
| - button.onclick = function(e) {
|
| - // Prevent the default action (i.e. changing the checked property
|
| - // of the checkbox). The button click here should not be handled
|
| - // as checkbox click.
|
| - e.preventDefault();
|
| - chrome.send('inputMethodOptionsOpen', [inputMethodId]);
|
| - OptionsPage.showPageByName(pageName);
|
| - }
|
| - return button;
|
| - },
|
| -
|
| - /**
|
| - * Handles OptionsPage's visible property change event.
|
| - * @param {Event} e Property change event.
|
| - * @private
|
| - */
|
| - handleVisibleChange_: function(e) {
|
| - if (this.visible) {
|
| - $('language-options-list').redraw();
|
| - chrome.send('languageOptionsOpen');
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Handles languageOptionsList's change event.
|
| - * @param {Event} e Change event.
|
| - * @private
|
| - */
|
| - handleLanguageOptionsListChange_: function(e) {
|
| - var languageOptionsList = $('language-options-list');
|
| - var languageCode = languageOptionsList.getSelectedLanguageCode();
|
| - // Select the language if it's specified in the URL hash (ex. lang=ja).
|
| - // Used for automated testing.
|
| - var match = document.location.hash.match(/\blang=([\w-]+)/);
|
| - if (match) {
|
| - var specifiedLanguageCode = match[1];
|
| - if (languageOptionsList.selectLanguageByCode(specifiedLanguageCode)) {
|
| - languageCode = specifiedLanguageCode;
|
| - }
|
| - }
|
| - this.updateSelectedLanguageName_(languageCode);
|
| - this.updateUiLanguageButton_(languageCode);
|
| - this.updateSpellCheckLanguageButton_(languageCode);
|
| - this.updateInputMethodList_(languageCode);
|
| - this.updateLanguageListInAddLanguageOverlay_();
|
| - },
|
| -
|
| - /**
|
| - * Handles languageOptionsList's save event.
|
| - * @param {Event} e Save event.
|
| - * @private
|
| - */
|
| - handleLanguageOptionsListSave_: function(e) {
|
| - // Sort the preload engines per the saved languages before save.
|
| - this.preloadEngines_ = this.sortPreloadEngines_(this.preloadEngines_);
|
| - this.savePreloadEnginesPref_();
|
| - },
|
| -
|
| - /**
|
| - * Sorts preloadEngines_ by languageOptionsList's order.
|
| - * @param {Array} preloadEngines List of preload engines.
|
| - * @return {Array} Returns sorted preloadEngines.
|
| - * @private
|
| - */
|
| - sortPreloadEngines_: function(preloadEngines) {
|
| - // For instance, suppose we have two languages and associated input
|
| - // methods:
|
| - //
|
| - // - Korean: hangul
|
| - // - Chinese: pinyin
|
| - //
|
| - // The preloadEngines preference should look like "hangul,pinyin".
|
| - // If the user reverse the order, the preference should be reorderd
|
| - // to "pinyin,hangul".
|
| - var languageOptionsList = $('language-options-list');
|
| - var languageCodes = languageOptionsList.getLanguageCodes();
|
| -
|
| - // Convert the list into a dictonary for simpler lookup.
|
| - var preloadEngineSet = {};
|
| - for (var i = 0; i < preloadEngines.length; i++) {
|
| - preloadEngineSet[preloadEngines[i]] = true;
|
| - }
|
| -
|
| - // Create the new preload engine list per the language codes.
|
| - var newPreloadEngines = [];
|
| - for (var i = 0; i < languageCodes.length; i++) {
|
| - var languageCode = languageCodes[i];
|
| - var inputMethodIds = this.languageCodeToInputMethodIdsMap_[
|
| - languageCode];
|
| - // Check if we have active input methods associated with the language.
|
| - for (var j = 0; j < inputMethodIds.length; j++) {
|
| - var inputMethodId = inputMethodIds[j];
|
| - if (inputMethodId in preloadEngineSet) {
|
| - // If we have, add it to the new engine list.
|
| - newPreloadEngines.push(inputMethodId);
|
| - // And delete it from the set. This is necessary as one input
|
| - // method can be associated with more than one language thus
|
| - // we should avoid having duplicates in the new list.
|
| - delete preloadEngineSet[inputMethodId];
|
| - }
|
| - }
|
| - }
|
| -
|
| - return newPreloadEngines;
|
| - },
|
| -
|
| - /**
|
| - * Initializes the map of language code to input method IDs.
|
| - * @private
|
| - */
|
| - initializeLanguageCodeToInputMehotdIdsMap_: function() {
|
| - var inputMethodList = templateData.inputMethodList;
|
| - for (var i = 0; i < inputMethodList.length; i++) {
|
| - var inputMethod = inputMethodList[i];
|
| - for (var languageCode in inputMethod.languageCodeSet) {
|
| - if (languageCode in this.languageCodeToInputMethodIdsMap_) {
|
| - this.languageCodeToInputMethodIdsMap_[languageCode].push(
|
| - inputMethod.id);
|
| - } else {
|
| - this.languageCodeToInputMethodIdsMap_[languageCode] =
|
| - [inputMethod.id];
|
| - }
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Updates the currently selected language name.
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @private
|
| - */
|
| - updateSelectedLanguageName_: function(languageCode) {
|
| - var languageDisplayName = LanguageList.getDisplayNameFromLanguageCode(
|
| - languageCode);
|
| - var languageNativeDisplayName =
|
| - LanguageList.getNativeDisplayNameFromLanguageCode(languageCode);
|
| - // If the native name is different, add it.
|
| - if (languageDisplayName != languageNativeDisplayName) {
|
| - languageDisplayName += ' - ' + languageNativeDisplayName;
|
| - }
|
| - // Update the currently selected language name.
|
| - $('language-options-language-name').textContent = languageDisplayName;
|
| - },
|
| -
|
| - /**
|
| - * Updates the UI language button.
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @private
|
| - */
|
| - updateUiLanguageButton_: function(languageCode) {
|
| - var uiLanguageButton = $('language-options-ui-language-button');
|
| - // Check if the language code matches the current UI language.
|
| - if (languageCode == templateData.currentUiLanguageCode) {
|
| - // If it matches, the button just says that the UI language is
|
| - // currently in use.
|
| - uiLanguageButton.textContent =
|
| - localStrings.getString('is_displayed_in_this_language');
|
| - // Make it look like a text label.
|
| - uiLanguageButton.className = 'text-button';
|
| - // Remove the event listner.
|
| - uiLanguageButton.onclick = undefined;
|
| - } else if (languageCode in templateData.uiLanguageCodeSet) {
|
| - // If the language is supported as UI language, users can click on
|
| - // the button to change the UI language.
|
| - uiLanguageButton.textContent =
|
| - localStrings.getString('display_in_this_language');
|
| - uiLanguageButton.className = '';
|
| - // Send the change request to Chrome.
|
| - uiLanguageButton.onclick = function(e) {
|
| - chrome.send('uiLanguageChange', [languageCode]);
|
| - }
|
| - $('language-options-ui-sign-out-button').onclick = function(e) {
|
| - chrome.send('uiLanguageSignOut');
|
| - }
|
| - } else {
|
| - // If the language is not supported as UI language, the button
|
| - // just says that Chromium OS cannot be displayed in this language.
|
| - uiLanguageButton.textContent =
|
| - localStrings.getString('cannot_be_displayed_in_this_language');
|
| - uiLanguageButton.className = 'text-button';
|
| - uiLanguageButton.onclick = undefined;
|
| - }
|
| - uiLanguageButton.style.display = 'block';
|
| - $('language-options-ui-notification-bar').style.display = 'none';
|
| - },
|
| -
|
| - /**
|
| - * Updates the spell check language button.
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @private
|
| - */
|
| - updateSpellCheckLanguageButton_: function(languageCode) {
|
| - var spellCheckLanguageButton = $(
|
| - 'language-options-spell-check-language-button');
|
| - // Check if the language code matches the current spell check language.
|
| - if (languageCode == this.spellCheckDictionary_) {
|
| - // If it matches, the button just says that the spell check language is
|
| - // currently in use.
|
| - spellCheckLanguageButton.textContent =
|
| - localStrings.getString('is_used_for_spell_checking');
|
| - // Make it look like a text label.
|
| - spellCheckLanguageButton.className = 'text-button';
|
| - // Remove the event listner.
|
| - spellCheckLanguageButton.onclick = undefined;
|
| - } else if (languageCode in templateData.spellCheckLanguageCodeSet) {
|
| - // If the language is supported as spell check language, users can
|
| - // click on the button to change the spell check language.
|
| - spellCheckLanguageButton.textContent =
|
| - localStrings.getString('use_this_for_spell_checking');
|
| - spellCheckLanguageButton.className = '';
|
| - spellCheckLanguageButton.languageCode = languageCode;
|
| - // Add an event listner to the click event.
|
| - spellCheckLanguageButton.addEventListener('click',
|
| - this.handleSpellCheckLanguageButtonClick_.bind(this));
|
| - } else {
|
| - // If the language is not supported as spell check language, the
|
| - // button just says that this language cannot be used for spell
|
| - // checking.
|
| - spellCheckLanguageButton.textContent =
|
| - localStrings.getString('cannot_be_used_for_spell_checking');
|
| - spellCheckLanguageButton.className = 'text-button';
|
| - spellCheckLanguageButton.onclick = undefined;
|
| - }
|
| - spellCheckLanguageButton.style.display = 'block';
|
| - $('language-options-ui-notification-bar').style.display = 'none';
|
| - },
|
| -
|
| - /**
|
| - * Updates the input method list.
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @private
|
| - */
|
| - updateInputMethodList_: function(languageCode) {
|
| - // Give one of the checkboxes or buttons focus, if it's specified in the
|
| - // URL hash (ex. focus=mozc). Used for automated testing.
|
| - var focusInputMethodId = -1;
|
| - var match = document.location.hash.match(/\bfocus=([\w:-]+)\b/);
|
| - if (match) {
|
| - focusInputMethodId = match[1];
|
| - }
|
| - // Change the visibility of the input method list. Input methods that
|
| - // matches |languageCode| will become visible.
|
| - var inputMethodList = $('language-options-input-method-list');
|
| - var labels = inputMethodList.querySelectorAll('label');
|
| - for (var i = 0; i < labels.length; i++) {
|
| - var label = labels[i];
|
| - if (languageCode in label.languageCodeSet) {
|
| - label.style.display = 'block';
|
| - var input = label.childNodes[0];
|
| - // Give it focus if the ID matches.
|
| - if (input.inputMethodId == focusInputMethodId) {
|
| - input.focus();
|
| - }
|
| - } else {
|
| - label.style.display = 'none';
|
| - }
|
| - }
|
| - if (focusInputMethodId == 'remove') {
|
| - $('language-options-remove-button').focus();
|
| - } else if (focusInputMethodId == 'add') {
|
| - $('language-options-add-button').focus();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Updates the language list in the add language overlay.
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @private
|
| - */
|
| - updateLanguageListInAddLanguageOverlay_: function(languageCode) {
|
| - // Change the visibility of the language list in the add language
|
| - // overlay. Languages that are already active will become invisible,
|
| - // so that users don't add the same language twice.
|
| - var languageOptionsList = $('language-options-list');
|
| - var languageCodes = languageOptionsList.getLanguageCodes();
|
| - var languageCodeSet = {};
|
| - for (var i = 0; i < languageCodes.length; i++) {
|
| - languageCodeSet[languageCodes[i]] = true;
|
| - }
|
| - var addLanguageList = $('add-language-overlay-language-list');
|
| - var lis = addLanguageList.querySelectorAll('li');
|
| - for (var i = 0; i < lis.length; i++) {
|
| - // The first child button knows the language code.
|
| - var button = lis[i].childNodes[0];
|
| - if (button.languageCode in languageCodeSet) {
|
| - lis[i].style.display = 'none';
|
| - } else {
|
| - lis[i].style.display = 'block';
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Handles preloadEnginesPref change.
|
| - * @param {Event} e Change event.
|
| - * @private
|
| - */
|
| - handlePreloadEnginesPrefChange_: function(e) {
|
| - var value = e.value.value;
|
| - this.preloadEngines_ = this.filterBadPreloadEngines_(value.split(','));
|
| - this.updateCheckboxesFromPreloadEngines_();
|
| - },
|
| -
|
| - /**
|
| - * Handles input method checkbox's click event.
|
| - * @param {Event} e Click event.
|
| - * @private
|
| - */
|
| - handleCheckboxClick_ : function(e) {
|
| - var checkbox = e.target;
|
| - if (this.preloadEngines_.length == 1 && !checkbox.checked) {
|
| - // Don't allow disabling the last input method.
|
| - this.showNotification_(
|
| - localStrings.getString('please_add_another_input_method'),
|
| - localStrings.getString('ok_button'));
|
| - checkbox.checked = true;
|
| - return;
|
| - }
|
| - if (checkbox.checked) {
|
| - chrome.send('inputMethodEnable', [checkbox.inputMethodId]);
|
| - } else {
|
| - chrome.send('inputMethodDisable', [checkbox.inputMethodId]);
|
| - }
|
| - this.updatePreloadEnginesFromCheckboxes_();
|
| - this.preloadEngines_ = this.sortPreloadEngines_(this.preloadEngines_);
|
| - this.savePreloadEnginesPref_();
|
| - },
|
| -
|
| - /**
|
| - * Handles add language list's click event.
|
| - * @param {Event} e Click event.
|
| - */
|
| - handleAddLanguageListClick_ : function(e) {
|
| - var languageOptionsList = $('language-options-list');
|
| - var languageCode = e.target.languageCode;
|
| - // languageCode can be undefined, if click was made on some random
|
| - // place in the overlay, rather than a button. Ignore it.
|
| - if (!languageCode) {
|
| - return;
|
| - }
|
| - languageOptionsList.addLanguage(languageCode);
|
| - var inputMethodIds = this.languageCodeToInputMethodIdsMap_[languageCode];
|
| - // Enable the first input method for the language added.
|
| - if (inputMethodIds && inputMethodIds[0] &&
|
| - // Don't add the input method it's already present. This can
|
| - // happen if the same input method is shared among multiple
|
| - // languages (ex. English US keyboard is used for English US and
|
| - // Filipino).
|
| - this.preloadEngines_.indexOf(inputMethodIds[0]) == -1) {
|
| - this.preloadEngines_.push(inputMethodIds[0]);
|
| - this.updateCheckboxesFromPreloadEngines_();
|
| - this.savePreloadEnginesPref_();
|
| - }
|
| - OptionsPage.clearOverlays();
|
| - },
|
| -
|
| - /**
|
| - * Handles remove button's click event.
|
| - * @param {Event} e Click event.
|
| - */
|
| - handleRemoveButtonClick_: function(e) {
|
| - var languageOptionsList = $('language-options-list');
|
| - var languageCode = languageOptionsList.getSelectedLanguageCode();
|
| - // Don't allow removing the language if it's as UI language.
|
| - if (languageCode == templateData.currentUiLanguageCode) {
|
| - this.showNotification_(
|
| - localStrings.getString('this_language_is_currently_in_use'),
|
| - localStrings.getString('ok_button'));
|
| - return;
|
| - }
|
| - // Disable input methods associated with |languageCode|.
|
| - // Don't allow removing the language if cerntain conditions are met.
|
| - // See removePreloadEnginesByLanguageCode_() for details.
|
| - if (!this.removePreloadEnginesByLanguageCode_(languageCode)) {
|
| - this.showNotification_(
|
| - localStrings.getString('please_add_another_language'),
|
| - localStrings.getString('ok_button'));
|
| - return;
|
| - }
|
| - languageOptionsList.removeSelectedLanguage();
|
| - },
|
| -
|
| - /**
|
| - * Handles spellCheckDictionaryPref change.
|
| - * @param {Event} e Change event.
|
| - * @private
|
| - */
|
| - handleSpellCheckDictionaryPrefChange_: function(e) {
|
| - var languageCode = e.value.value
|
| - this.spellCheckDictionary_ = languageCode;
|
| - var languageOptionsList = $('language-options-list');
|
| - var selectedLanguageCode = languageOptionsList.getSelectedLanguageCode();
|
| - this.updateSpellCheckLanguageButton_(selectedLanguageCode);
|
| - },
|
| -
|
| - /**
|
| - * Handles spellCheckLanguageButton click.
|
| - * @param {Event} e Click event.
|
| - * @private
|
| - */
|
| - handleSpellCheckLanguageButtonClick_: function(e) {
|
| - var languageCode = e.target.languageCode;
|
| - // Save the preference.
|
| - Preferences.setStringPref(this.spellCheckDictionaryPref,
|
| - languageCode);
|
| - chrome.send('spellCheckLanguageChange', [languageCode]);
|
| - },
|
| -
|
| - /**
|
| - * Removes preload engines associated with the given language code.
|
| - * However, this function does not remove engines (input methods) that
|
| - * are used for other active languages. For instance, if "xkb:us::eng"
|
| - * is used for English and Filipino, and the two languages are active,
|
| - * this function does not remove "xkb:us::eng" when either of these
|
| - * languages is removed. Instead, it'll remove "xkb:us::eng" when the
|
| - * both languages are gone.
|
| - *
|
| - * @param {string} languageCode Language code (ex. "fr").
|
| - * @return {boolean} Returns true on success.
|
| - * @private
|
| - */
|
| - removePreloadEnginesByLanguageCode_: function(languageCode) {
|
| - // First create the set of engines to be removed from input methods
|
| - // associated with the language code.
|
| - var enginesToBeRemovedSet = {};
|
| - var inputMethodIds = this.languageCodeToInputMethodIdsMap_[languageCode];
|
| - for (var i = 0; i < inputMethodIds.length; i++) {
|
| - enginesToBeRemovedSet[inputMethodIds[i]] = true;
|
| - }
|
| -
|
| - // Then eliminate engines that are also used for other active languages.
|
| - var languageCodes = $('language-options-list').getLanguageCodes();
|
| - for (var i = 0; i < languageCodes.length; i++) {
|
| - // Skip the target language code.
|
| - if (languageCodes[i] == languageCode) {
|
| - continue;
|
| - }
|
| - // Check if input methods used in this language are included in
|
| - // enginesToBeRemovedSet. If so, eliminate these from the set, so
|
| - // we don't remove this time.
|
| - var inputMethodIdsForAnotherLanguage =
|
| - this.languageCodeToInputMethodIdsMap_[languageCodes[i]];
|
| - for (var j = 0; j < inputMethodIdsForAnotherLanguage.length; j++) {
|
| - var inputMethodId = inputMethodIdsForAnotherLanguage[j];
|
| - if (inputMethodId in enginesToBeRemovedSet) {
|
| - delete enginesToBeRemovedSet[inputMethodId];
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Update the preload engine list with the to-be-removed set.
|
| - var newPreloadEngines = [];
|
| - for (var i = 0; i < this.preloadEngines_.length; i++) {
|
| - if (!(this.preloadEngines_[i] in enginesToBeRemovedSet)) {
|
| - newPreloadEngines.push(this.preloadEngines_[i]);
|
| - }
|
| - }
|
| - // Don't allow this operation if it causes the number of preload
|
| - // engines to be zero.
|
| - if (newPreloadEngines.length == 0) {
|
| - return false;
|
| - }
|
| - this.preloadEngines_ = newPreloadEngines;
|
| - this.savePreloadEnginesPref_();
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * Saves the preload engines preference.
|
| - * @private
|
| - */
|
| - savePreloadEnginesPref_: function() {
|
| - Preferences.setStringPref(this.preloadEnginesPref,
|
| - this.preloadEngines_.join(','));
|
| - },
|
| -
|
| - /**
|
| - * Updates the checkboxes in the input method list from the preload
|
| - * engines preference.
|
| - * @private
|
| - */
|
| - updateCheckboxesFromPreloadEngines_: function() {
|
| - // Convert the list into a dictonary for simpler lookup.
|
| - var dictionary = {};
|
| - for (var i = 0; i < this.preloadEngines_.length; i++) {
|
| - dictionary[this.preloadEngines_[i]] = true;
|
| - }
|
| -
|
| - var inputMethodList = $('language-options-input-method-list');
|
| - var checkboxes = inputMethodList.querySelectorAll('input');
|
| - for (var i = 0; i < checkboxes.length; i++) {
|
| - checkboxes[i].checked = (checkboxes[i].inputMethodId in dictionary);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Updates the preload engines preference from the checkboxes in the
|
| - * input method list.
|
| - * @private
|
| - */
|
| - updatePreloadEnginesFromCheckboxes_: function() {
|
| - this.preloadEngines_ = [];
|
| - var inputMethodList = $('language-options-input-method-list');
|
| - var checkboxes = inputMethodList.querySelectorAll('input');
|
| - for (var i = 0; i < checkboxes.length; i++) {
|
| - if (checkboxes[i].checked) {
|
| - this.preloadEngines_.push(checkboxes[i].inputMethodId);
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Filters bad preload engines in case bad preload engines are
|
| - * stored in the preference. Removes duplicates as well.
|
| - * @param {Array} preloadEngines List of preload engines.
|
| - * @private
|
| - */
|
| - filterBadPreloadEngines_: function(preloadEngines) {
|
| - // Convert the list into a dictonary for simpler lookup.
|
| - var dictionary = {};
|
| - for (var i = 0; i < templateData.inputMethodList.length; i++) {
|
| - dictionary[templateData.inputMethodList[i].id] = true;
|
| - }
|
| -
|
| - var filteredPreloadEngines = [];
|
| - var seen = {};
|
| - for (var i = 0; i < preloadEngines.length; i++) {
|
| - // Check if the preload engine is present in the
|
| - // dictionary, and not duplicate. Otherwise, skip it.
|
| - if (preloadEngines[i] in dictionary && !(preloadEngines[i] in seen)) {
|
| - filteredPreloadEngines.push(preloadEngines[i]);
|
| - seen[preloadEngines[i]] = true;
|
| - }
|
| - }
|
| - return filteredPreloadEngines;
|
| - },
|
| -
|
| - // TODO(kochi): This is an adapted copy from new_new_tab.js.
|
| - // If this will go as final UI, refactor this to share the component with
|
| - // new new tab page.
|
| - /**
|
| - * Shows notification
|
| - * @private
|
| - */
|
| - notificationTimeout_: null,
|
| - showNotification_ : function(text, actionText, opt_delay) {
|
| - var notificationElement = $('notification');
|
| - var actionLink = notificationElement.querySelector('.link-color');
|
| - var delay = opt_delay || 10000;
|
| -
|
| - function show() {
|
| - window.clearTimeout(this.notificationTimeout_);
|
| - notificationElement.classList.add('show');
|
| - document.body.classList.add('notification-shown');
|
| - }
|
| -
|
| - function hide() {
|
| - window.clearTimeout(this.notificationTimeout_);
|
| - notificationElement.classList.remove('show');
|
| - document.body.classList.remove('notification-shown');
|
| - // Prevent tabbing to the hidden link.
|
| - actionLink.tabIndex = -1;
|
| - // Setting tabIndex to -1 only prevents future tabbing to it. If,
|
| - // however, the user switches window or a tab and then moves back to
|
| - // this tab the element may gain focus. We therefore make sure that we
|
| - // blur the element so that the element focus is not restored when
|
| - // coming back to this window.
|
| - actionLink.blur();
|
| - }
|
| -
|
| - function delayedHide() {
|
| - this.notificationTimeout_ = window.setTimeout(hide, delay);
|
| - }
|
| -
|
| - notificationElement.firstElementChild.textContent = text;
|
| - actionLink.textContent = actionText;
|
| -
|
| - actionLink.onclick = hide;
|
| - actionLink.onkeydown = function(e) {
|
| - if (e.keyIdentifier == 'Enter') {
|
| - hide();
|
| - }
|
| - };
|
| - notificationElement.onmouseover = show;
|
| - notificationElement.onmouseout = delayedHide;
|
| - actionLink.onfocus = show;
|
| - actionLink.onblur = delayedHide;
|
| - // Enable tabbing to the link now that it is shown.
|
| - actionLink.tabIndex = 0;
|
| -
|
| - show();
|
| - delayedHide();
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * Chrome callback for when the UI language preference is saved.
|
| - */
|
| - LanguageOptions.uiLanguageSaved = function() {
|
| - $('language-options-ui-language-button').style.display = 'none';
|
| - $('language-options-ui-notification-bar').style.display = 'block';
|
| - };
|
| -
|
| - // Export
|
| - return {
|
| - LanguageOptions: LanguageOptions
|
| - };
|
| -
|
| -});
|
|
|