Index: chrome/browser/resources/settings/languages_page/manage_languages_page.js |
diff --git a/chrome/browser/resources/settings/languages_page/manage_languages_page.js b/chrome/browser/resources/settings/languages_page/manage_languages_page.js |
index cf92005f6993c83fade6f3083b614ef9177fffac..1fe8ba47b217b2511d9e06dca1c8295131f47463 100644 |
--- a/chrome/browser/resources/settings/languages_page/manage_languages_page.js |
+++ b/chrome/browser/resources/settings/languages_page/manage_languages_page.js |
@@ -22,7 +22,7 @@ Polymer({ |
}, |
/** |
- * @type {LanguagesModel|undefined} |
+ * @type {!LanguagesModel|undefined} |
*/ |
languages: { |
type: Object, |
@@ -30,7 +30,8 @@ Polymer({ |
}, |
/** |
- * @private {Array<{code: string, displayName: string, enabled: boolean}>| |
+ * @private {!Array<!{code: string, displayName: string, |
+ * nativeDisplayName: string, enabled: boolean}>| |
* undefined} |
*/ |
availableLanguages_: Array, |
@@ -42,7 +43,7 @@ Polymer({ |
/** |
* Handler for removing a language. |
- * @param {!{model: !{item: !Language}}} e |
+ * @param {!{model: !{item: !LanguageInfo}}} e |
* @private |
*/ |
onRemoveLanguageTap_: function(e) { |
@@ -59,38 +60,45 @@ Polymer({ |
}, |
/** |
- * True if a language is not the prospective UI language or the last remaining |
- * language. |
+ * True if a language is not the current or prospective UI language. |
* @param {string} languageCode |
- * @param {!Array<!LanguageInfo>} enableLanguage |
- * @private |
+ * @param {!Array<!LanguageInfo>} prospectiveUILanguage |
* @return {boolean} |
+ * @private |
*/ |
- canRemoveLanguage_: function(languageCode, enabledLanguages) { |
- var appLocale = this.prefs.intl.app_locale.value || navigator.language; |
- if (languageCode == appLocale) |
- return false; |
- if (enabledLanguages.length == 1) |
+ canRemoveLanguage_: function(languageCode, prospectiveUILanguage) { |
+ if (languageCode == navigator.language || |
+ languageCode == prospectiveUILanguage) { |
return false; |
+ } |
+ assert(this.languages.enabledLanguages.length > 1); |
return true; |
}, |
/** |
- * Updates the available languages to be bound to the iron-list. |
- * TODO(michaelpg): Update properties of individual items instead of |
- * rebuilding entire list. |
+ * Updates the available languages that are bound to the iron-list. |
* @private |
*/ |
enabledLanguagesChanged_: function() { |
- var availableLanguages = []; |
- for (var i = 0; i < this.languages.supportedLanguages.length; i++) { |
- var language = this.languages.supportedLanguages[i]; |
- availableLanguages.push({ |
- code: language.code, |
- displayName: language.displayName, |
- enabled: this.$.languages.isEnabled(language.code) |
- }); |
+ if (!this.availableLanguages_) { |
+ var availableLanguages = []; |
+ for (var i = 0; i < this.languages.supportedLanguages.length; i++) { |
+ var language = this.languages.supportedLanguages[i]; |
+ availableLanguages.push({ |
+ code: language.code, |
+ displayName: language.displayName, |
+ nativeDisplayName: language.nativeDisplayName, |
+ enabled: this.$.languages.isEnabled(language.code) |
+ }); |
+ } |
+ // Set the Polymer property after building the full array. |
+ this.availableLanguages_ = availableLanguages; |
+ } else { |
+ // Update the available languages in place. |
+ for (var i = 0; i < this.availableLanguages_.length; i++) { |
+ this.set('availableLanguages_.' + i + '.enabled', |
+ this.$.languages.isEnabled(this.availableLanguages_[i].code)); |
+ } |
} |
- this.availableLanguages_ = availableLanguages; |
}, |
}); |