Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Unified Diff: chrome/browser/resources/settings/languages_page/languages.js

Issue 1902893003: MD Settings: simplify language model and data binding (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/settings/languages_page/languages.js
diff --git a/chrome/browser/resources/settings/languages_page/languages.js b/chrome/browser/resources/settings/languages_page/languages.js
index 190b261c1d728ab79ef325bd99069f0f6460e728..fe31190d118f0a23b7fd54bfe9f17f139c63844f 100644
--- a/chrome/browser/resources/settings/languages_page/languages.js
+++ b/chrome/browser/resources/settings/languages_page/languages.js
@@ -63,7 +63,7 @@ SettingsLanguagesSingletonElement = Polymer({
properties: {
/**
- * @type {LanguagesModel|undefined}
+ * @type {!LanguagesModel|undefined}
*/
languages: {
type: Object,
@@ -88,21 +88,22 @@ SettingsLanguagesSingletonElement = Polymer({
return new PromiseResolver();
},
},
+
+ /** @type {!LanguageSettingsPrivate} */
+ languageSettingsPrivate: Object,
},
/**
- * Hash map of languages.supportedLanguages using language codes as keys for
- * fast lookup.
- * @private {!Object<!chrome.languageSettingsPrivate.Language>}
+ * Hash map of supported languages by language codes for fast lookup.
+ * @private {!Map<string, !chrome.languageSettingsPrivate.Language>}
*/
- supportedLanguageMap_: {},
+ supportedLanguageMap_: new Map(),
/**
- * Hash map of languages.enabledLanguages using language codes as keys for
- * fast lookup.
- * @private {!Object<!LanguageInfo>}
+ * Hash set of enabled language codes for membership testing.
+ * @private {!Set<string>}
*/
- enabledLanguageMap_: {},
+ enabledLanguageSet_: new Set(),
observers: [
'preferredLanguagesPrefChanged_(' +
@@ -114,6 +115,9 @@ SettingsLanguagesSingletonElement = Polymer({
'translateLanguagesPrefChanged_(' +
'prefs.translate_blocked_languages.value.*,' +
'languages)',
+ 'prospectiveUILanguageChanged_(' +
+ 'prefs.intl.app_locale.value,' +
+ 'languages)',
],
/** @override */
@@ -149,17 +153,16 @@ SettingsLanguagesSingletonElement = Polymer({
* @private
*/
preferredLanguagesPrefChanged_: function() {
- var enabledLanguages =
- this.getEnabledLanguages_(this.languages.translateTarget);
-
- // Reset the enabled language map before updating
- // languages.enabledLanguages.
- this.enabledLanguageMap_ = {};
- for (var i = 0; i < enabledLanguages.length; i++) {
- var languageInfo = enabledLanguages[i];
- this.enabledLanguageMap_[languageInfo.language.code] = languageInfo;
- }
- this.set('languages.enabledLanguages', enabledLanguages);
+ var enabledLanguageStates =
+ this.getEnabledLanguageStates_(this.languages.translateTarget);
+
+ // Recreate the enabled language set before updating languages.enabled.
+ this.enabledLanguageSet_.clear();
+ for (var languageState of enabledLanguageStates)
+ this.enabledLanguageSet_.add(languageState.language.code);
+
+ this.set('languages.enabled', enabledLanguageStates);
+ this.updateRemovableLanguages_();
},
/**
@@ -167,30 +170,35 @@ SettingsLanguagesSingletonElement = Polymer({
* @private
*/
spellCheckDictionariesPrefChanged_: function() {
- var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */(
+ var spellCheckSet = this.makeSetFromArray_(/** @type {!Array<string>} */(
this.getPref('spellcheck.dictionaries').value));
- for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
- var languageCode = this.languages.enabledLanguages[i].language.code;
- this.set('languages.enabledLanguages.' + i + '.state.spellCheckEnabled',
- !!spellCheckMap[languageCode]);
+ for (var i = 0; i < this.languages.enabled.length; i++) {
+ var languageState = this.languages.enabled[i];
+ this.set('languages.enabled.' + i + '.spellCheckEnabled',
+ !!spellCheckSet.has(languageState.language.code));
}
},
/** @private */
translateLanguagesPrefChanged_: function() {
var translateBlockedPref = this.getPref('translate_blocked_languages');
- var translateBlockedMap = this.makeMapFromArray_(
+ var translateBlockedSet = this.makeSetFromArray_(
/** @type {!Array<string>} */(translateBlockedPref.value));
- for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
+ for (var i = 0; i < this.languages.enabled.length; i++) {
var translateCode = this.convertLanguageCodeForTranslate(
- this.languages.enabledLanguages[i].language.code);
+ this.languages.enabled[i].language.code);
this.set(
- 'languages.enabledLanguages.' + i + '.state.translateEnabled',
- !translateBlockedMap[translateCode]);
+ 'languages.enabled.' + i + '.translateEnabled',
+ !translateBlockedSet.has(translateCode));
}
},
+ /** @private */
+ prospectiveUILanguageChanged_: function() {
+ this.updateRemovableLanguages_();
+ },
+
/**
* Constructs the languages model.
* @param {!Array<!chrome.languageSettingsPrivate.Language>}
@@ -201,84 +209,95 @@ SettingsLanguagesSingletonElement = Polymer({
*/
createModel_: function(supportedLanguages, translateTarget) {
// Populate the hash map of supported languages.
- for (var i = 0; i < supportedLanguages.length; i++) {
- var language = supportedLanguages[i];
+ for (var language of supportedLanguages) {
language.supportsUI = !!language.supportsUI;
language.supportsTranslate = !!language.supportsTranslate;
language.supportsSpellcheck = !!language.supportsSpellcheck;
- this.supportedLanguageMap_[language.code] = language;
+ this.supportedLanguageMap_.set(language.code, language);
}
- // Create a list of enabled language info from the supported languages.
- var enabledLanguages = this.getEnabledLanguages_(translateTarget);
- // Populate the hash map of enabled languages.
- for (var i = 0; i < enabledLanguages.length; i++) {
- var languageInfo = enabledLanguages[i];
- this.enabledLanguageMap_[languageInfo.language.code] = languageInfo;
- }
+ // Create a list of enabled languages from the supported languages.
+ var enabledLanguageStates = this.getEnabledLanguageStates_(translateTarget);
+ // Populate the hash set of enabled languages.
+ for (var languageState of enabledLanguageStates)
+ this.enabledLanguageSet_.add(languageState.language.code);
// Initialize the Polymer languages model.
this.languages = /** @type {!LanguagesModel} */({
- supportedLanguages: supportedLanguages,
- enabledLanguages: enabledLanguages,
+ supported: supportedLanguages,
+ enabled: enabledLanguageStates,
translateTarget: translateTarget,
});
},
/**
- * Returns a list of LanguageInfos for each enabled language in the supported
+ * Returns a list of LanguageStates for each enabled language in the supported
* languages list.
* @param {string} translateTarget Language code of the default translate
* target language.
- * @return {!Array<!LanguageInfo>}
+ * @return {!Array<!LanguageState>}
* @private
*/
- getEnabledLanguages_: function(translateTarget) {
+ getEnabledLanguageStates_: function(translateTarget) {
assert(CrSettingsPrefs.isInitialized);
var pref = this.getPref(preferredLanguagesPrefName);
var enabledLanguageCodes = pref.value.split(',');
- var enabledLanguages = /** @type {!Array<!LanguageInfo>} */ [];
-
var spellCheckPref = this.getPref('spellcheck.dictionaries');
- var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */(
+ var spellCheckSet = this.makeSetFromArray_(/** @type {!Array<string>} */(
spellCheckPref.value));
var translateBlockedPref = this.getPref('translate_blocked_languages');
- var translateBlockedMap = this.makeMapFromArray_(
+ var translateBlockedSet = this.makeSetFromArray_(
/** @type {!Array<string>} */(translateBlockedPref.value));
+ var enabledLanguageStates = [];
for (var i = 0; i < enabledLanguageCodes.length; i++) {
var code = enabledLanguageCodes[i];
- var language = this.supportedLanguageMap_[code];
+ var language = this.supportedLanguageMap_.get(code);
// Skip unsupported languages.
if (!language)
continue;
- var state = /** @type {LanguageState} */({});
- state.spellCheckEnabled = !!spellCheckMap[code];
+ var languageState = /** @type {LanguageState} */({});
+ languageState.language = language;
+ languageState.spellCheckEnabled = !!spellCheckSet.has(code);
// Translate is considered disabled if this language maps to any translate
// language that is blocked.
var translateCode = this.convertLanguageCodeForTranslate(code);
- state.translateEnabled = !!language.supportsTranslate &&
- !translateBlockedMap[translateCode] &&
+ languageState.translateEnabled = !!language.supportsTranslate &&
+ !translateBlockedSet.has(translateCode) &&
translateCode != translateTarget;
- enabledLanguages.push(/** @type {LanguageInfo} */(
- {language: language, state: state}));
+ enabledLanguageStates.push(languageState);
+ }
+ return enabledLanguageStates;
+ },
+
+ /**
+ * Updates the |removable| property of the enabled language states based
+ * on what other languages are enabled.
+ * @private
+ */
+ updateRemovableLanguages_: function() {
+ assert(this.languages);
+ for (var i = 0; i < this.languages.enabled.length; i++) {
+ var languageState = this.languages.enabled[i];
+ this.set('languages.enabled.' + i + '.removable',
+ this.canDisableLanguage(languageState.language.code));
}
- return enabledLanguages;
},
/**
- * Creates an object whose keys are the elements of the list.
- * @param {!Array<string>} list
- * @return {!Object<boolean>}
+ * Creates a Set from the elements of the arary.
+ * @param {!Array<T>} list
+ * @return {!Set<T>}
+ * @template T
stevenjb 2016/04/20 20:40:49 nit: Can the @template be listed first? It seems c
michaelpg 2016/04/20 23:19:59 It's the more common way (we don't have many examp
* @private
*/
- makeMapFromArray_: function(list) {
- var map = {};
- for (var i = 0; i < list.length; i++)
- map[list[i]] = true;
- return map;
+ makeSetFromArray_: function(list) {
+ var set = new Set();
+ for (var item of list)
+ set.add(item);
+ return set;
},
// LanguageHelper implementation.
@@ -290,21 +309,21 @@ SettingsLanguagesSingletonElement = Polymer({
return this.resolver_.promise;
},
-<if expr="chromeos or is_win">
/**
* Sets the prospective UI language to the chosen language. This won't affect
* the actual UI language until a restart.
* @param {string} languageCode
*/
setUILanguage: function(languageCode) {
+ assert(cr.isChromeOS || cr.isWindows);
chrome.send('setUILanguage', [languageCode]);
},
/** Resets the prospective UI language back to the actual UI language. */
resetUILanguage: function() {
+ assert(cr.isChromeOS || cr.isWindows);
chrome.send('setUILanguage', [navigator.language]);
},
-</if>
/**
* Returns the "prospective" UI language, i.e. the one to be used on next
@@ -322,7 +341,7 @@ SettingsLanguagesSingletonElement = Polymer({
* @return {boolean} True if the language is enabled.
*/
isLanguageEnabled: function(languageCode) {
- return !!this.enabledLanguageMap_[languageCode];
+ return this.enabledLanguageSet_.has(languageCode);
},
/**
@@ -378,7 +397,7 @@ SettingsLanguagesSingletonElement = Polymer({
}
// Cannot disable the only enabled language.
- if (this.languages.enabledLanguages.length == 1)
+ if (this.languages.enabled.length == 1)
return false;
return true;
@@ -449,7 +468,7 @@ SettingsLanguagesSingletonElement = Polymer({
* @return {!chrome.languageSettingsPrivate.Language|undefined}
*/
getLanguage: function(languageCode) {
- return this.supportedLanguageMap_[languageCode];
+ return this.supportedLanguageMap_.get(languageCode);
},
});
})();

Powered by Google App Engine
This is Rietveld 408576698