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

Side by Side Diff: chrome/browser/resources/settings/languages_page/languages.js

Issue 2573643005: Language settings: Fix Restart and Remove buttons shown at wrong times (Closed)
Patch Set: Created 4 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview 'settings-languages' handles Chrome's language and input 6 * @fileoverview 'settings-languages' handles Chrome's language and input
7 * method settings. The 'languages' property, which reflects the current 7 * method settings. The 'languages' property, which reflects the current
8 * language settings, must not be changed directly. Instead, changes to 8 * language settings, must not be changed directly. Instead, changes to
9 * language settings should be made using the LanguageHelper APIs provided by 9 * language settings should be made using the LanguageHelper APIs provided by
10 * this class via languageHelper. 10 * this class via languageHelper.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 /** 114 /**
115 * Hash map of input methods supported for each language. 115 * Hash map of input methods supported for each language.
116 * @type {!Map<string, 116 * @type {!Map<string,
117 * !Array<!chrome.languageSettingsPrivate.InputMethod>>} 117 * !Array<!chrome.languageSettingsPrivate.InputMethod>>}
118 * @private 118 * @private
119 */ 119 */
120 languageInputMethods_: { 120 languageInputMethods_: {
121 type: Object, 121 type: Object,
122 value: function() { return new Map(); }, 122 value: function() { return new Map(); },
123 }, 123 },
124
125 /** @private Prospective UI language when the page was loaded. */
126 originalProspectiveUILanguage_: String,
124 }, 127 },
125 128
126 observers: [ 129 observers: [
130 'prospectiveUILanguageChanged_(prefs.intl.app_locale.value)',
127 'preferredLanguagesPrefChanged_(' + 131 'preferredLanguagesPrefChanged_(' +
128 'prefs.' + preferredLanguagesPrefName + '.value, languages)', 132 'prefs.' + preferredLanguagesPrefName + '.value, languages)',
129 'spellCheckDictionariesPrefChanged_(' + 133 'spellCheckDictionariesPrefChanged_(' +
130 'prefs.spellcheck.dictionaries.value.*, languages)', 134 'prefs.spellcheck.dictionaries.value.*, languages)',
131 'translateLanguagesPrefChanged_(' + 135 'translateLanguagesPrefChanged_(' +
132 'prefs.translate_blocked_languages.value.*, languages)', 136 'prefs.translate_blocked_languages.value.*, languages)',
133 'updateRemovableLanguages_(' + 137 'updateRemovableLanguages_(' +
134 'prefs.intl.app_locale.value, languages.enabled)', 138 'prefs.intl.app_locale.value, languages.enabled)',
135 // Observe Chrome OS prefs (ignored for non-Chrome OS). 139 // Observe Chrome OS prefs (ignored for non-Chrome OS).
136 'updateRemovableLanguages_(' + 140 'updateRemovableLanguages_(' +
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 resolve(lists.componentExtensionImes.concat( 175 resolve(lists.componentExtensionImes.concat(
172 lists.thirdPartyExtensionImes)); 176 lists.thirdPartyExtensionImes));
173 }); 177 });
174 }.bind(this)); 178 }.bind(this));
175 179
176 promises[4] = new Promise(function(resolve) { 180 promises[4] = new Promise(function(resolve) {
177 this.inputMethodPrivate.getCurrentInputMethod(resolve); 181 this.inputMethodPrivate.getCurrentInputMethod(resolve);
178 }.bind(this)); 182 }.bind(this));
179 } 183 }
180 184
185 if (cr.isWindows || cr.isChromeOS) {
186 // Fetch the starting UI language, which affects which actions should be
187 // enabled.
188 promises.push(cr.sendWithPromise('getProspectiveUILanguage').then(
189 function(prospectiveUILanguage) {
190 this.originalProspectiveUILanguage_ =
191 prospectiveUILanguage || navigator.language;
192 }.bind(this)));
193 }
194
181 Promise.all(promises).then(function(results) { 195 Promise.all(promises).then(function(results) {
182 this.createModel_(results[1], results[2], results[3], results[4]); 196 this.createModel_(results[1], results[2], results[3], results[4]);
183 this.resolver_.resolve(); 197 this.resolver_.resolve();
184 }.bind(this)); 198 }.bind(this));
185 199
186 if (cr.isChromeOS) { 200 if (cr.isChromeOS) {
187 this.inputMethodPrivate.onChanged.addListener( 201 this.inputMethodPrivate.onChanged.addListener(
188 this.onInputMethodChanged_.bind(this)); 202 this.onInputMethodChanged_.bind(this));
189 } 203 }
190 }, 204 },
191 205
192 /** 206 /**
207 * Updates the prospective UI languages based on the new pref value.
208 * @param {string} prospectiveUILanguage
209 * @private
210 */
211 prospectiveUILanguageChanged_: function(prospectiveUILanguage) {
212 if (!this.languages)
213 return;
214
215 this.set('languages.prospectiveUILanguage',
216 prospectiveUILanguage || this.originalProspectiveUILanguage_);
217 },
218
219 /**
193 * Updates the list of enabled languages from the preferred languages pref. 220 * Updates the list of enabled languages from the preferred languages pref.
194 * @private 221 * @private
195 */ 222 */
196 preferredLanguagesPrefChanged_: function() { 223 preferredLanguagesPrefChanged_: function() {
197 var enabledLanguageStates = 224 var enabledLanguageStates =
198 this.getEnabledLanguageStates_(this.languages.translateTarget); 225 this.getEnabledLanguageStates_(this.languages.translateTarget);
199 226
200 // Recreate the enabled language set before updating languages.enabled. 227 // Recreate the enabled language set before updating languages.enabled.
201 this.enabledLanguageSet_.clear(); 228 this.enabledLanguageSet_.clear();
202 for (var languageState of enabledLanguageStates) 229 for (var languageState of enabledLanguageStates)
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 var enabledLanguageStates = this.getEnabledLanguageStates_(translateTarget); 308 var enabledLanguageStates = this.getEnabledLanguageStates_(translateTarget);
282 // Populate the hash set of enabled languages. 309 // Populate the hash set of enabled languages.
283 for (var languageState of enabledLanguageStates) 310 for (var languageState of enabledLanguageStates)
284 this.enabledLanguageSet_.add(languageState.language.code); 311 this.enabledLanguageSet_.add(languageState.language.code);
285 312
286 var model = /** @type {!LanguagesModel} */({ 313 var model = /** @type {!LanguagesModel} */({
287 supported: supportedLanguages, 314 supported: supportedLanguages,
288 enabled: enabledLanguageStates, 315 enabled: enabledLanguageStates,
289 translateTarget: translateTarget, 316 translateTarget: translateTarget,
290 }); 317 });
318 if (cr.isChromeOS || cr.isWindows) {
319 model.prospectiveUILanguage =
320 /** @type {string} */(this.getPref('intl.app_locale').value) ||
321 this.originalProspectiveUILanguage_;
322 }
291 if (cr.isChromeOS) { 323 if (cr.isChromeOS) {
292 model.inputMethods = /** @type {!InputMethodsModel} */({ 324 model.inputMethods = /** @type {!InputMethodsModel} */({
293 supported: supportedInputMethods, 325 supported: supportedInputMethods,
294 enabled: this.getEnabledInputMethods_(), 326 enabled: this.getEnabledInputMethods_(),
295 currentId: currentInputMethodId, 327 currentId: currentInputMethodId,
296 }); 328 });
297 } 329 }
298 330
299 // Initialize the Polymer languages model. 331 // Initialize the Polymer languages model.
300 this._setLanguages(model); 332 this._setLanguages(model);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 /** @return {!Promise} */ 451 /** @return {!Promise} */
420 whenReady: function() { 452 whenReady: function() {
421 return this.resolver_.promise; 453 return this.resolver_.promise;
422 }, 454 },
423 455
424 /** 456 /**
425 * Sets the prospective UI language to the chosen language. This won't affect 457 * Sets the prospective UI language to the chosen language. This won't affect
426 * the actual UI language until a restart. 458 * the actual UI language until a restart.
427 * @param {string} languageCode 459 * @param {string} languageCode
428 */ 460 */
429 setUILanguage: function(languageCode) { 461 setProspectiveUILanguage: function(languageCode) {
430 assert(cr.isChromeOS || cr.isWindows); 462 assert(cr.isChromeOS || cr.isWindows);
431 chrome.send('setUILanguage', [languageCode]); 463 chrome.send('setProspectiveUILanguage', [languageCode]);
432 }, 464 },
433 465
434 /** Resets the prospective UI language back to the actual UI language. */ 466 /** Resets the prospective UI language back to the actual UI language. */
435 resetUILanguage: function() { 467 resetProspectiveUILanguage: function() {
436 assert(cr.isChromeOS || cr.isWindows); 468 assert(cr.isChromeOS || cr.isWindows);
437 chrome.send('setUILanguage', [navigator.language]); 469 chrome.send(
470 'setProspectiveUILanguage', [this.originalProspectiveUILanguage_]);
438 }, 471 },
439 472
440 /** 473 /**
441 * Returns the "prospective" UI language, i.e. the one to be used on next 474 * True if the prospective UI language was changed from its starting value.
442 * restart. If the pref is not set, the current UI language is also the 475 * @return {boolean}
443 * "prospective" language.
444 * @return {string} Language code of the prospective UI language.
445 */ 476 */
446 getProspectiveUILanguage: function() { 477 requiresRestart: function() {
447 return /** @type {string} */(this.getPref('intl.app_locale').value) || 478 return this.originalProspectiveUILanguage_ !=
448 navigator.language; 479 this.languages.prospectiveUILanguage;
449 }, 480 },
450 481
451 /** 482 /**
452 * @param {string} languageCode 483 * @param {string} languageCode
453 * @return {boolean} True if the language is enabled. 484 * @return {boolean} True if the language is enabled.
454 */ 485 */
455 isLanguageEnabled: function(languageCode) { 486 isLanguageEnabled: function(languageCode) {
456 return this.enabledLanguageSet_.has(languageCode); 487 return this.enabledLanguageSet_.has(languageCode);
457 }, 488 },
458 489
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 this.languageSettingsPrivate.disableLanguage(languageCode); 530 this.languageSettingsPrivate.disableLanguage(languageCode);
500 this.enableTranslateLanguage(languageCode); 531 this.enableTranslateLanguage(languageCode);
501 }, 532 },
502 533
503 /** 534 /**
504 * @param {string} languageCode Language code for an enabled language. 535 * @param {string} languageCode Language code for an enabled language.
505 * @return {boolean} 536 * @return {boolean}
506 */ 537 */
507 canDisableLanguage: function(languageCode) { 538 canDisableLanguage: function(languageCode) {
508 // Cannot disable the prospective UI language. 539 // Cannot disable the prospective UI language.
509 if (languageCode == this.getProspectiveUILanguage()) 540 if (languageCode == this.languages.prospectiveUILanguage)
510 return false; 541 return false;
511 542
512 // Cannot disable the only enabled language. 543 // Cannot disable the only enabled language.
513 if (this.languages.enabled.length == 1) 544 if (this.languages.enabled.length == 1)
514 return false; 545 return false;
515 546
516 if (!cr.isChromeOS) 547 if (!cr.isChromeOS)
517 return true; 548 return true;
518 549
519 // If this is the only enabled language that is supported by all enabled 550 // If this is the only enabled language that is supported by all enabled
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 this.updateEnabledInputMethods_(); 768 this.updateEnabledInputMethods_();
738 }, 769 },
739 770
740 /** @param {string} id Removed input method ID. */ 771 /** @param {string} id Removed input method ID. */
741 onInputMethodRemoved_: function(id) { 772 onInputMethodRemoved_: function(id) {
742 assert(cr.isChromeOS); 773 assert(cr.isChromeOS);
743 this.updateEnabledInputMethods_(); 774 this.updateEnabledInputMethods_();
744 }, 775 },
745 }); 776 });
746 })(); 777 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698