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 @@
</template>
<div class="separator"></div>
<cr-icon-button class="icon-clear"
disabled$="[[disableRemoveInputMethod_(item,
languages.inputMethods.enabled.*)]]"
on-click="onRemoveInputMethodClick_"
title="[[getRemoveInputMethodTooltip_(item)]]">
</cr-icon-button>
......
......@@ -244,6 +244,23 @@ Polymer({
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
* @private
......
......@@ -90,11 +90,13 @@ suite('input page', () => {
items[0].querySelector('.display-name').textContent.trim());
assertTrue(!!items[0].querySelector('.internal-wrapper'));
assertFalse(!!items[0].querySelector('.external-wrapper'));
assertFalse(!!items[0].querySelector('.icon-clear').disabled);
assertEquals(
'US Dvorak keyboard',
items[1].querySelector('.display-name').textContent.trim());
assertTrue(!!items[1].querySelector('.external-wrapper'));
assertFalse(!!items[1].querySelector('.internal-wrapper'));
assertFalse(!!items[1].querySelector('.icon-clear').disabled);
});
test('navigates to input method options page', () => {
......@@ -143,6 +145,28 @@ suite('input page', () => {
items[0].querySelector('.display-name').textContent.trim() !==
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', () => {
......@@ -237,7 +261,7 @@ suite('input page', () => {
assertTrue(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:sw:sw'));
assertFalse(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw'));
'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw'));
assertTrue(languageHelper.isInputMethodEnabled(
'_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:vi:vi'));
});
......
......@@ -162,7 +162,7 @@ cr.define('settings', function() {
enabled: false,
},
{
id: '_comp_ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw',
id: 'ime_abcdefghijklmnopqrstuvwxyzabcdefxkb:us:sw',
displayName: 'US Swahili keyboard',
languageCodes: ['en', 'en-US', 'sw'],
tags: [
......
......@@ -152,7 +152,7 @@ suite('settings-languages', function() {
// Add input methods for Swahili.
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(swUS);
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