Index: chrome/browser/resources/options/chromeos_language_list.js |
=================================================================== |
--- chrome/browser/resources/options/chromeos_language_list.js (revision 71729) |
+++ chrome/browser/resources/options/chromeos_language_list.js (working copy) |
@@ -1,351 +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. |
- |
-cr.define('options.language', function() { |
- const ArrayDataModel = cr.ui.ArrayDataModel; |
- const LanguageOptions = options.LanguageOptions; |
- const List = cr.ui.List; |
- const ListItem = cr.ui.ListItem; |
- const ListSingleSelectionModel = cr.ui.ListSingleSelectionModel; |
- |
- /** |
- * Creates a new language list. |
- * @param {Object=} opt_propertyBag Optional properties. |
- * @constructor |
- * @extends {cr.ui.List} |
- */ |
- var LanguageList = cr.ui.define('list'); |
- |
- /** |
- * Gets display name from the given language code. |
- * @param {string} languageCode Language code (ex. "fr"). |
- */ |
- LanguageList.getDisplayNameFromLanguageCode = function(languageCode) { |
- // Build the language code to display name dictionary at first time. |
- if (!this.languageCodeToDisplayName_) { |
- this.languageCodeToDisplayName_ = {}; |
- var languageList = templateData.languageList; |
- for (var i = 0; i < languageList.length; i++) { |
- var language = languageList[i]; |
- this.languageCodeToDisplayName_[language.code] = language.displayName; |
- } |
- } |
- |
- return this.languageCodeToDisplayName_[languageCode]; |
- } |
- |
- /** |
- * Gets native display name from the given language code. |
- * @param {string} languageCode Language code (ex. "fr"). |
- */ |
- LanguageList.getNativeDisplayNameFromLanguageCode = function(languageCode) { |
- // Build the language code to display name dictionary at first time. |
- if (!this.languageCodeToNativeDisplayName_) { |
- this.languageCodeToNativeDisplayName_ = {}; |
- var languageList = templateData.languageList; |
- for (var i = 0; i < languageList.length; i++) { |
- var language = languageList[i]; |
- this.languageCodeToNativeDisplayName_[language.code] = |
- language.nativeDisplayName; |
- } |
- } |
- |
- return this.languageCodeToNativeDisplayName_[languageCode]; |
- } |
- |
- /** |
- * Returns true if the given language code is valid. |
- * @param {string} languageCode Language code (ex. "fr"). |
- */ |
- LanguageList.isValidLanguageCode = function(languageCode) { |
- // Having the display name for the language code means that the |
- // language code is valid. |
- if (LanguageList.getDisplayNameFromLanguageCode(languageCode)) { |
- return true; |
- } |
- return false; |
- } |
- |
- LanguageList.prototype = { |
- __proto__: List.prototype, |
- |
- // The list item being dragged. |
- draggedItem: null, |
- // The drop position information: "below" or "above". |
- dropPos: null, |
- // The preference is a CSV string that describes preferred languages |
- // in Chrome OS. The language list is used for showing the language |
- // list in "Language and Input" options page. |
- preferredLanguagesPref: 'settings.language.preferred_languages', |
- // The preference is a CSV string that describes accept languages used |
- // for content negotiation. To be more precise, the list will be used |
- // in "Accept-Language" header in HTTP requests. |
- acceptLanguagesPref: 'intl.accept_languages', |
- |
- /** @inheritDoc */ |
- decorate: function() { |
- List.prototype.decorate.call(this); |
- this.selectionModel = new ListSingleSelectionModel; |
- |
- // HACK(arv): http://crbug.com/40902 |
- window.addEventListener('resize', this.redraw.bind(this)); |
- |
- // Listen to pref change. |
- Preferences.getInstance().addEventListener(this.preferredLanguagesPref, |
- this.handlePreferredLanguagesPrefChange_.bind(this)); |
- |
- // Listen to drag and drop events. |
- this.addEventListener('dragstart', this.handleDragStart_.bind(this)); |
- this.addEventListener('dragenter', this.handleDragEnter_.bind(this)); |
- this.addEventListener('dragover', this.handleDragOver_.bind(this)); |
- this.addEventListener('drop', this.handleDrop_.bind(this)); |
- }, |
- |
- createItem: function(languageCode) { |
- var languageDisplayName = |
- LanguageList.getDisplayNameFromLanguageCode(languageCode); |
- var languageNativeDisplayName = |
- LanguageList.getNativeDisplayNameFromLanguageCode(languageCode); |
- return new ListItem({ |
- label: languageDisplayName, |
- draggable: true, |
- languageCode: languageCode, |
- title: languageNativeDisplayName // Show native name as tooltip. |
- }); |
- }, |
- |
- /* |
- * Adds a language to the language list. |
- * @param {string} languageCode language code (ex. "fr"). |
- */ |
- addLanguage: function(languageCode) { |
- // It shouldn't happen but ignore the language code if it's |
- // null/undefined, or already present. |
- if (!languageCode || this.dataModel.indexOf(languageCode) >= 0) { |
- return; |
- } |
- this.dataModel.push(languageCode); |
- // Select the last item, which is the language added. |
- this.selectionModel.selectedIndex = this.dataModel.length - 1; |
- |
- this.savePreference_(); |
- }, |
- |
- /* |
- * Gets the language codes of the currently listed languages. |
- */ |
- getLanguageCodes: function() { |
- return this.dataModel.slice(); |
- }, |
- |
- /* |
- * Gets the language code of the selected language. |
- */ |
- getSelectedLanguageCode: function() { |
- return this.selectedItem; |
- }, |
- |
- /* |
- * Selects the language by the given language code. |
- * @returns {boolean} True if the operation is successful. |
- */ |
- selectLanguageByCode: function(languageCode) { |
- var index = this.dataModel.indexOf(languageCode); |
- if (index >= 0) { |
- this.selectionModel.selectedIndex = index; |
- return true; |
- } |
- return false; |
- }, |
- |
- /* |
- * Removes the currently selected language. |
- */ |
- removeSelectedLanguage: function() { |
- if (this.selectionModel.selectedIndex >= 0) { |
- this.dataModel.splice(this.selectionModel.selectedIndex, 1); |
- // Once the selected item is removed, there will be no selected item. |
- // Select the item pointed by the lead index. |
- this.selectionModel.selectedIndex = this.selectionModel.leadIndex; |
- this.savePreference_(); |
- } |
- }, |
- |
- /* |
- * Handles the dragstart event. |
- * @param {Event} e The dragstart event. |
- * @private |
- */ |
- handleDragStart_: function(e) { |
- var target = e.target; |
- // ListItem should be the only draggable element type in the page, |
- // but just in case. |
- if (target instanceof ListItem) { |
- this.draggedItem = target; |
- e.dataTransfer.effectAllowed = 'move'; |
- } |
- }, |
- |
- /* |
- * Handles the dragenter event. |
- * @param {Event} e The dragenter event. |
- * @private |
- */ |
- handleDragEnter_: function(e) { |
- e.preventDefault(); |
- }, |
- |
- /* |
- * Handles the dragover event. |
- * @param {Event} e The dragover event. |
- * @private |
- */ |
- handleDragOver_: function(e) { |
- var dropTarget = e.target; |
- // Determins whether the drop target is to accept the drop. |
- // The drop is only successful on another ListItem. |
- if (!(dropTarget instanceof ListItem) || |
- dropTarget == this.draggedItem) { |
- return; |
- } |
- // Compute the drop postion. Should we move the dragged item to |
- // below or above the drop target? |
- var rect = dropTarget.getBoundingClientRect(); |
- var dy = e.clientY - rect.top; |
- var yRatio = dy / rect.height; |
- var dropPos = yRatio <= .5 ? 'above' : 'below'; |
- this.dropPos = dropPos; |
- e.preventDefault(); |
- // TODO(satorux): Show the drop marker just like the bookmark manager. |
- }, |
- |
- /* |
- * Handles the drop event. |
- * @param {Event} e The drop event. |
- * @private |
- */ |
- handleDrop_: function(e) { |
- var dropTarget = e.target; |
- |
- // Delete the language from the original position. |
- var languageCode = this.draggedItem.languageCode; |
- var originalIndex = this.dataModel.indexOf(languageCode); |
- this.dataModel.splice(originalIndex, 1); |
- // Insert the language to the new position. |
- var newIndex = this.dataModel.indexOf(dropTarget.languageCode); |
- if (this.dropPos == 'below') |
- newIndex += 1; |
- this.dataModel.splice(newIndex, 0, languageCode); |
- // The cursor should move to the moved item. |
- this.selectionModel.selectedIndex = newIndex; |
- // Save the preference. |
- this.savePreference_(); |
- }, |
- |
- /** |
- * Handles preferred languages pref change. |
- * @param {Event} e The change event object. |
- * @private |
- */ |
- handlePreferredLanguagesPrefChange_: function(e) { |
- var languageCodesInCsv = e.value.value; |
- var languageCodes = this.filterBadLanguageCodes_( |
- languageCodesInCsv.split(',')); |
- this.load_(languageCodes); |
- }, |
- |
- /** |
- * Loads given language list. |
- * @param {Array} languageCodes List of language codes. |
- * @private |
- */ |
- load_: function(languageCodes) { |
- // Preserve the original selected index. See comments below. |
- var originalSelectedIndex = (this.selectionModel ? |
- this.selectionModel.selectedIndex : -1); |
- this.dataModel = new ArrayDataModel(languageCodes); |
- if (originalSelectedIndex >= 0 && |
- originalSelectedIndex < this.dataModel.length) { |
- // Restore the original selected index if the selected index is |
- // valid after the data model is loaded. This is neeeded to keep |
- // the selected language after the languge is added or removed. |
- this.selectionModel.selectedIndex = originalSelectedIndex; |
- // The lead index should be updated too. |
- this.selectionModel.leadIndex = originalSelectedIndex; |
- } else if (this.dataModel.length > 0){ |
- // Otherwise, select the first item if it's not empty. |
- // Note that ListSingleSelectionModel won't select an item |
- // automatically, hence we manually select the first item here. |
- this.selectionModel.selectedIndex = 0; |
- } |
- }, |
- |
- /** |
- * Saves the preference. |
- */ |
- savePreference_: function() { |
- // Encode the language codes into a CSV string. |
- Preferences.setStringPref(this.preferredLanguagesPref, |
- this.dataModel.slice().join(',')); |
- // Save the same language list as accept languages preference as |
- // well, but we need to expand the language list, to make it more |
- // acceptable. For instance, some web sites don't understand 'en-US' |
- // but 'en'. See crosbug.com/9884. |
- var acceptLanguages = this.expandLanguageCodes(this.dataModel.slice()); |
- Preferences.setStringPref(this.acceptLanguagesPref, |
- acceptLanguages.join(',')); |
- cr.dispatchSimpleEvent(this, 'save'); |
- }, |
- |
- /** |
- * Expands language codes to make these more suitable for Accept-Language. |
- * Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. |
- * 'en' won't appear twice as this function eliminates duplicates. |
- * @param {Array} languageCodes List of language codes. |
- * @private |
- */ |
- expandLanguageCodes: function(languageCodes) { |
- var expandedLanguageCodes = []; |
- var seen = {}; // Used to eliminiate duplicates. |
- for (var i = 0; i < languageCodes.length; i++) { |
- var languageCode = languageCodes[i]; |
- if (!(languageCode in seen)) { |
- expandedLanguageCodes.push(languageCode); |
- seen[languageCode] = true; |
- } |
- var parts = languageCode.split('-'); |
- if (!(parts[0] in seen)) { |
- expandedLanguageCodes.push(parts[0]); |
- seen[parts[0]] = true; |
- } |
- } |
- return expandedLanguageCodes; |
- }, |
- |
- /** |
- * Filters bad language codes in case bad language codes are |
- * stored in the preference. Removes duplicates as well. |
- * @param {Array} languageCodes List of language codes. |
- * @private |
- */ |
- filterBadLanguageCodes_: function(languageCodes) { |
- var filteredLanguageCodes = []; |
- var seen = {}; |
- for (var i = 0; i < languageCodes.length; i++) { |
- // Check if the the language code is valid, and not |
- // duplicate. Otherwise, skip it. |
- if (LanguageList.isValidLanguageCode(languageCodes[i]) && |
- !(languageCodes[i] in seen)) { |
- filteredLanguageCodes.push(languageCodes[i]); |
- seen[languageCodes[i]] = true; |
- } |
- } |
- return filteredLanguageCodes; |
- }, |
- }; |
- |
- return { |
- LanguageList: LanguageList |
- }; |
-}); |