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

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

Issue 2261903002: Fix race condition in MD Settings Languages page causing inconsistent settings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update histograms Created 4 years, 4 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 f5161780aef3e59d8daef8293e14895923a1647e..6b49dc1b08ff4b62009af6f30af9d425f864db7f 100644
--- a/chrome/browser/resources/settings/languages_page/languages.js
+++ b/chrome/browser/resources/settings/languages_page/languages.js
@@ -138,8 +138,8 @@ Polymer({
'prefs.spellcheck.dictionaries.value.*, languages)',
'translateLanguagesPrefChanged_(' +
'prefs.translate_blocked_languages.value.*, languages)',
- 'prospectiveUILanguageChanged_(' +
- 'prefs.intl.app_locale.value, languages)',
+ 'updateRemovableLanguages_(' +
+ 'prefs.intl.app_locale.value, languages.enabled)',
// Observe Chrome OS prefs (ignored for non-Chrome OS).
'updateRemovableLanguages_(' +
'prefs.settings.language.preload_engines.value, ' +
@@ -211,7 +211,6 @@ Polymer({
this.enabledLanguageSet_.add(languageState.language.code);
this.set('languages.enabled', enabledLanguageStates);
- this.updateRemovableLanguages_();
},
/**
@@ -243,11 +242,6 @@ Polymer({
}
},
- /** @private */
- prospectiveUILanguageChanged_: function() {
- this.updateRemovableLanguages_();
- },
-
/**
* Constructs the languages model.
* @param {!Array<!chrome.languageSettingsPrivate.Language>}
@@ -475,12 +469,7 @@ Polymer({
if (!CrSettingsPrefs.isInitialized)
return;
- var languageCodes =
- this.getPref(preferredLanguagesPrefName).value.split(',');
- if (languageCodes.indexOf(languageCode) > -1)
- return;
- languageCodes.push(languageCode);
- this.languageSettingsPrivate.setLanguageList(languageCodes);
+ this.languageSettingsPrivate.enableLanguage(languageCode);
this.disableTranslateLanguage(languageCode);
},
@@ -512,13 +501,7 @@ Polymer({
}
// Remove the language from preferred languages.
- var languageCodes =
- this.getPref(preferredLanguagesPrefName).value.split(',');
- var languageIndex = languageCodes.indexOf(languageCode);
- if (languageIndex == -1)
- return;
- languageCodes.splice(languageIndex, 1);
- this.languageSettingsPrivate.setLanguageList(languageCodes);
+ this.languageSettingsPrivate.disableLanguage(languageCode);
this.enableTranslateLanguage(languageCode);
},
@@ -528,10 +511,8 @@ Polymer({
*/
canDisableLanguage: function(languageCode) {
// Cannot disable the prospective UI language.
- if ((cr.isChromeOS || cr.isWindows) &&
- languageCode == this.getProspectiveUILanguage()) {
+ if (languageCode == this.getProspectiveUILanguage())
return false;
- }
// Cannot disable the only enabled language.
if (this.languages.enabled.length == 1)
@@ -570,13 +551,25 @@ Polymer({
this.getPref(preferredLanguagesPrefName).value.split(',');
var originalIndex = languageCodes.indexOf(languageCode);
- var newIndex = originalIndex + offset;
- if (originalIndex == -1 || newIndex < 0 || newIndex >= languageCodes.length)
- return;
+ var newIndex = originalIndex;
+ var direction = Math.sign(offset);
+ var distance = Math.abs(offset);
+
+ // Step over the distance to find the target index.
+ while (distance > 0) {
+ newIndex += direction;
+ if (newIndex < 0 || newIndex >= languageCodes.length)
+ return;
+
+ // Skip over non-enabled languages, since they don't appear in the list
+ // (but we don't want to remove them).
+ if (this.enabledLanguageSet_.has(languageCodes[newIndex]))
+ distance--;
+ }
- languageCodes.splice(originalIndex, 1);
- languageCodes.splice(newIndex, 0, languageCode);
- this.languageSettingsPrivate.setLanguageList(languageCodes);
+ languageCodes[originalIndex] = languageCodes[newIndex];
+ languageCodes[newIndex] = languageCode;
+ this.setPrefValue(preferredLanguagesPrefName, languageCodes.join(','));
},
/**

Powered by Google App Engine
This is Rietveld 408576698