Commit 8de0b6f6 authored by My Nguyen's avatar My Nguyen Committed by Commit Bot

[OsSettingsLanguages] Disable remove button if language is not removable

Removable condition is different for Language Settings V2 as we are
decoupling device language and input methods from language preference.

Current view: http://screen/4ax5XVRUryvctHW

Bug: 1113439
Change-Id: I0d31f7eda4a3fbe6bf10abd5654b0b0282f603b4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2417673
Commit-Queue: My Nguyen <myy@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Reviewed-by: default avatarRegan Hsu <hsuregan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809203}
parent f824d268
...@@ -133,7 +133,8 @@ ...@@ -133,7 +133,8 @@
$i18n{moveDown} $i18n{moveDown}
</button> </button>
<button class="dropdown-item" role="menuitem" <button class="dropdown-item" role="menuitem"
on-click="onRemoveLanguageClick_"> on-click="onRemoveLanguageClick_"
disabled="[[!detailLanguage_.state.removable]]">
$i18n{removeLanguage} $i18n{removeLanguage}
</button> </button>
</cr-action-menu> </cr-action-menu>
......
...@@ -103,6 +103,7 @@ js_library("languages.m") { ...@@ -103,6 +103,7 @@ js_library("languages.m") {
"//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:i18n_behavior.m", "//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:promise_resolver.m", "//ui/webui/resources/js:promise_resolver.m",
] ]
externs_list = [ externs_list = [
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/assert.html">
<link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/cr.html">
<link rel="import" href="chrome://resources/html/load_time_data.html">
<link rel="import" href="chrome://resources/html/promise_resolver.html"> <link rel="import" href="chrome://resources/html/promise_resolver.html">
<link rel="import" href="../prefs/prefs.html"> <link rel="import" href="../prefs/prefs.html">
<link rel="import" href="../prefs/prefs_behavior.html"> <link rel="import" href="../prefs/prefs_behavior.html">
......
...@@ -738,11 +738,12 @@ Polymer({ ...@@ -738,11 +738,12 @@ Polymer({
// Remove the language from spell check. // Remove the language from spell check.
this.deletePrefListItem('spellcheck.dictionaries', languageCode); this.deletePrefListItem('spellcheck.dictionaries', languageCode);
if (cr.isChromeOS) { // For language settings V2, languages and input methods are decoupled
// so there's no need to remove related input methods.
if (cr.isChromeOS && !this.isChromeOSLanguageSettingsV2_()) {
// Remove input methods that don't support any other enabled language. // Remove input methods that don't support any other enabled language.
const inputMethods = this.languageInputMethods_.get(languageCode) || []; const inputMethods = this.languageInputMethods_.get(languageCode) || [];
for (let i = 0; i < inputMethods.length; i++) { for (const inputMethod of inputMethods) {
const inputMethod = inputMethods[i];
const supportsOtherEnabledLanguages = inputMethod.languageCodes.some( const supportsOtherEnabledLanguages = inputMethod.languageCodes.some(
otherLanguageCode => otherLanguageCode !== languageCode && otherLanguageCode => otherLanguageCode !== languageCode &&
this.isLanguageEnabled(otherLanguageCode)); this.isLanguageEnabled(otherLanguageCode));
...@@ -756,6 +757,17 @@ Polymer({ ...@@ -756,6 +757,17 @@ Polymer({
this.languageSettingsPrivate_.disableLanguage(languageCode); this.languageSettingsPrivate_.disableLanguage(languageCode);
}, },
/**
* @private
*/
isChromeOSLanguageSettingsV2_() {
if (!cr.isChromeOS) {
return false;
}
return loadTimeData.valueExists('enableLanguageSettingsV2') &&
loadTimeData.getBoolean('enableLanguageSettingsV2');
},
/** /**
* @param {!LanguageState} languageState * @param {!LanguageState} languageState
* @return {boolean} * @return {boolean}
...@@ -772,7 +784,10 @@ Polymer({ ...@@ -772,7 +784,10 @@ Polymer({
*/ */
canDisableLanguage(languageState) { canDisableLanguage(languageState) {
// Cannot disable the prospective UI language. // Cannot disable the prospective UI language.
if (languageState.language.code === this.languages.prospectiveUILanguage) { // Exception for Chrome OS language settings V2 as we are decoupling
// language preference from UI language.
if (languageState.language.code === this.languages.prospectiveUILanguage &&
!this.isChromeOSLanguageSettingsV2_()) {
return false; return false;
} }
...@@ -790,6 +805,13 @@ Polymer({ ...@@ -790,6 +805,13 @@ Polymer({
return true; return true;
} }
// ChromeOS language settings V2 does not remove input methods when removing
// languages, so there's no need to check for other enabled input methods
// below.
if (this.isChromeOSLanguageSettingsV2_()) {
return true;
}
// If this is the only enabled language that is supported by all enabled // If this is the only enabled language that is supported by all enabled
// component IMEs, it cannot be disabled because we need those IMEs. // component IMEs, it cannot be disabled because we need those IMEs.
const otherInputMethodsEnabled = const otherInputMethodsEnabled =
......
...@@ -176,6 +176,86 @@ suite('languages page', () => { ...@@ -176,6 +176,86 @@ suite('languages page', () => {
assertEquals('en-US', languageHelper.getPref(languagesPref).value); assertEquals('en-US', languageHelper.getPref(languagesPref).value);
}); });
test('the only translate blocked language is not removable', () => {
//'en-US' is preconfigured to be the only translate blocked language.
assertDeepEquals(
['en-US'], languageHelper.prefs.translate_blocked_languages.value);
const items = languagesList.querySelectorAll('.list-item');
const domRepeat = assert(languagesList.querySelector('dom-repeat'));
const item = Array.from(items).find(function(el) {
return domRepeat.itemForElement(el) &&
domRepeat.itemForElement(el).language.code === 'en-US';
});
// Opens the menu and selects Remove.
item.querySelector('cr-icon-button').click();
assertTrue(actionMenu.open);
const removeMenuItem = getMenuItem('removeLanguage');
assertTrue(removeMenuItem.disabled);
assertFalse(removeMenuItem.hidden);
});
test('device language is removable', () => {
// 'en-US' is the preconfigured UI language.
assertEquals('en-US', languageHelper.languages.prospectiveUILanguage);
// Add 'sw' to translate_blocked_languages.
languageHelper.setPrefValue(
'translate_blocked_languages', ['en-US', 'sw']);
Polymer.dom.flush();
const items = languagesList.querySelectorAll('.list-item');
const domRepeat = assert(languagesList.querySelector('dom-repeat'));
const item = Array.from(items).find(function(el) {
return domRepeat.itemForElement(el) &&
domRepeat.itemForElement(el).language.code === 'en-US';
});
// Opens the menu and selects Remove.
item.querySelector('cr-icon-button').click();
assertTrue(actionMenu.open);
const removeMenuItem = getMenuItem('removeLanguage');
assertFalse(removeMenuItem.disabled);
assertFalse(removeMenuItem.hidden);
removeMenuItem.click();
assertFalse(actionMenu.open);
assertEquals('sw', languageHelper.getPref(languagesPref).value);
});
test('single preferred language is not removable', () => {
languageHelper.setPrefValue(
'settings.language.preferred_languages', 'sw');
Polymer.dom.flush();
const items = languagesList.querySelectorAll('.list-item');
const domRepeat = assert(languagesList.querySelector('dom-repeat'));
const item = Array.from(items).find(function(el) {
return domRepeat.itemForElement(el) &&
domRepeat.itemForElement(el).language.code === 'sw';
});
// Opens the menu and selects Remove.
item.querySelector('cr-icon-button').click();
assertTrue(actionMenu.open);
const removeMenuItem = getMenuItem('removeLanguage');
assertTrue(removeMenuItem.disabled);
assertFalse(removeMenuItem.hidden);
});
test('removing a language does not remove related input methods', () => {
const sw = '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw';
const swUS = 'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw';
languageHelper.addInputMethod(sw);
languageHelper.addInputMethod(swUS);
assertEquals(4, languageHelper.languages.inputMethods.enabled.length);
// Disable Swahili. The Swahili-only keyboard should not be removed.
languageHelper.disableLanguage('sw');
assertEquals(4, languageHelper.languages.inputMethods.enabled.length);
});
test('has move up/down buttons', () => { test('has move up/down buttons', () => {
// Adds several languages. // Adds several languages.
for (const language of ['en-CA', 'en-US', 'tk', 'no']) { for (const language of ['en-CA', 'en-US', 'tk', 'no']) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment