Commit f4e7778e authored by My Nguyen's avatar My Nguyen Committed by Commit Bot

[OsSettingsLanguages] Disable removing last component input method

Logic is partly carried over from manage_input_methods.js

The original CL that added this logic doesn't explain much
https://crrev.com/1908483003.

This CL https://crrev.com/c/1109441 suggests component IMEs are
pre-installed system IMEs, which makes sense to ensure at least one is
enabled in case the third-party one get removed and users can no longer
type.

Button disabled view: http://screen/3qQgdYTc6UQBn8Y

Bug: 1113439
Change-Id: I4d07687a8ac0a2c705d8e83bfb938909149a2723
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2413677
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@{#807843}
parent c2c919db
...@@ -149,6 +149,8 @@ ...@@ -149,6 +149,8 @@
</template> </template>
<div class="separator"></div> <div class="separator"></div>
<cr-icon-button class="icon-clear" <cr-icon-button class="icon-clear"
disabled$="[[disableRemoveInputMethod_(item,
languages.inputMethods.enabled.*)]]"
on-click="onRemoveInputMethodClick_" on-click="onRemoveInputMethodClick_"
title="[[getRemoveInputMethodTooltip_(item)]]"> title="[[getRemoveInputMethodTooltip_(item)]]">
</cr-icon-button> </cr-icon-button>
......
...@@ -244,6 +244,23 @@ Polymer({ ...@@ -244,6 +244,23 @@ Polymer({
cr.ui.focusWithoutInk(assert(this.$.addInputMethod)); cr.ui.focusWithoutInk(assert(this.$.addInputMethod));
}, },
/**
* @param {!chrome.languageSettingsPrivate.InputMethod} targetInputMethod
* @private
*/
disableRemoveInputMethod_(targetInputMethod) {
// Third-party IMEs can always be removed.
if (!this.languageHelper.isComponentIme(targetInputMethod)) {
return false;
}
// Disable remove if there is no other component IME (pre-installed
// system IMES) enabled.
return !this.languages.inputMethods.enabled.some(
inputMethod => inputMethod.id != targetInputMethod.id &&
this.languageHelper.isComponentIme(inputMethod));
},
/** /**
* @param {!chrome.languageSettingsPrivate.InputMethod} inputMethod * @param {!chrome.languageSettingsPrivate.InputMethod} inputMethod
* @private * @private
......
...@@ -90,11 +90,13 @@ suite('input page', () => { ...@@ -90,11 +90,13 @@ suite('input page', () => {
items[0].querySelector('.display-name').textContent.trim()); items[0].querySelector('.display-name').textContent.trim());
assertTrue(!!items[0].querySelector('.internal-wrapper')); assertTrue(!!items[0].querySelector('.internal-wrapper'));
assertFalse(!!items[0].querySelector('.external-wrapper')); assertFalse(!!items[0].querySelector('.external-wrapper'));
assertFalse(!!items[0].querySelector('.icon-clear').disabled);
assertEquals( assertEquals(
'US Dvorak keyboard', 'US Dvorak keyboard',
items[1].querySelector('.display-name').textContent.trim()); items[1].querySelector('.display-name').textContent.trim());
assertTrue(!!items[1].querySelector('.external-wrapper')); assertTrue(!!items[1].querySelector('.external-wrapper'));
assertFalse(!!items[1].querySelector('.internal-wrapper')); assertFalse(!!items[1].querySelector('.internal-wrapper'));
assertFalse(!!items[1].querySelector('.icon-clear').disabled);
}); });
test('navigates to input method options page', () => { test('navigates to input method options page', () => {
...@@ -143,6 +145,28 @@ suite('input page', () => { ...@@ -143,6 +145,28 @@ suite('input page', () => {
items[0].querySelector('.display-name').textContent.trim() !== items[0].querySelector('.display-name').textContent.trim() !==
inputMethodName); inputMethodName);
}); });
test('disables remove input method option', async () => {
// Add US Swahili keyboard, a third party IME
languageHelper.addInputMethod(
'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw');
// Remove US Dvorak keyboard, so there is only 1 component IME left.
languageHelper.removeInputMethod(
'_comp_ime_fgoepimhcoialccpbmpnnblemnepkkaoxkb:us:dvorak:eng');
Polymer.dom.flush();
const inputMethodsList = inputPage.$.inputMethodsList;
const items = inputMethodsList.querySelectorAll('.list-item');
assertEquals(3, items.length);
assertEquals(
'US keyboard',
items[0].querySelector('.display-name').textContent.trim());
assertTrue(!!items[0].querySelector('.icon-clear').disabled);
assertEquals(
'US Swahili keyboard',
items[1].querySelector('.display-name').textContent.trim());
assertFalse(!!items[1].querySelector('.icon-clear').disabled);
});
}); });
suite('input page', () => { suite('input page', () => {
...@@ -237,7 +261,7 @@ suite('input page', () => { ...@@ -237,7 +261,7 @@ suite('input page', () => {
assertTrue(languageHelper.isInputMethodEnabled( assertTrue(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw')); '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw'));
assertFalse(languageHelper.isInputMethodEnabled( assertFalse(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw')); 'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw'));
assertTrue(languageHelper.isInputMethodEnabled( assertTrue(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:vi:vi')); '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:vi:vi'));
}); });
......
...@@ -162,7 +162,7 @@ cr.define('settings', function() { ...@@ -162,7 +162,7 @@ cr.define('settings', function() {
enabled: false, enabled: false,
}, },
{ {
id: '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw', id: 'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw',
displayName: 'US Swahili keyboard', displayName: 'US Swahili keyboard',
languageCodes: ['en', 'en-US', 'sw'], languageCodes: ['en', 'en-US', 'sw'],
tags: [ tags: [
......
...@@ -152,7 +152,7 @@ suite('settings-languages', function() { ...@@ -152,7 +152,7 @@ suite('settings-languages', function() {
// Add input methods for Swahili. // Add input methods for Swahili.
const sw = '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw'; const sw = '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw';
const swUS = '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw'; const swUS = 'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw';
languageHelper.addInputMethod(sw); languageHelper.addInputMethod(sw);
languageHelper.addInputMethod(swUS); languageHelper.addInputMethod(swUS);
assertEquals(3, languageHelper.languages.inputMethods.enabled.length); assertEquals(3, languageHelper.languages.inputMethods.enabled.length);
......
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