Index: content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java b/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java |
index 65958083eb8888ab89729cac576bbfd74be4458d..f2ae82906223fa1bbd9e267a65018cf07fdfa879 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java |
@@ -8,6 +8,7 @@ import android.os.SystemClock; |
import android.text.Editable; |
import android.text.InputType; |
import android.text.Selection; |
+import android.text.TextUtils; |
import android.util.Log; |
import android.view.KeyEvent; |
import android.view.View; |
@@ -212,6 +213,7 @@ public class AdapterInputConnection extends BaseInputConnection { |
@Override |
public boolean setComposingText(CharSequence text, int newCursorPosition) { |
if (DEBUG) Log.w(TAG, "setComposingText [" + text + "] [" + newCursorPosition + "]"); |
+ if (maybePerformEmptyCompositionWorkaround(text)) return true; |
super.setComposingText(text, newCursorPosition); |
updateSelectionIfRequired(); |
return mImeAdapter.checkCompositionQueueAndCallNative(text.toString(), |
@@ -224,6 +226,7 @@ public class AdapterInputConnection extends BaseInputConnection { |
@Override |
public boolean commitText(CharSequence text, int newCursorPosition) { |
if (DEBUG) Log.w(TAG, "commitText [" + text + "] [" + newCursorPosition + "]"); |
+ if (maybePerformEmptyCompositionWorkaround(text)) return true; |
super.commitText(text, newCursorPosition); |
updateSelectionIfRequired(); |
return mImeAdapter.checkCompositionQueueAndCallNative(text.toString(), |
@@ -446,6 +449,33 @@ public class AdapterInputConnection extends BaseInputConnection { |
return mImeAdapter.getInputMethodManagerWrapper(); |
} |
+ /** |
+ * This method works around the issue crbug.com/373934 where Blink does not cancel |
+ * the composition when we send a commit with the empty text. |
+ * |
+ * TODO(aurimas) Remove this once crbug.com/373934 is fixed. |
+ * |
+ * @param text Text that software keyboard requested to commit. |
+ * @return Whether the workaround was performed. |
+ */ |
+ private boolean maybePerformEmptyCompositionWorkaround(CharSequence text) { |
+ int selectionStart = Selection.getSelectionStart(mEditable); |
+ int selectionEnd = Selection.getSelectionEnd(mEditable); |
+ int compositionStart = getComposingSpanStart(mEditable); |
+ int compositionEnd = getComposingSpanEnd(mEditable); |
+ if (TextUtils.isEmpty(text) && (selectionStart == selectionEnd) |
+ && compositionStart != INVALID_COMPOSITION |
+ && compositionEnd != INVALID_COMPOSITION) { |
+ beginBatchEdit(); |
+ finishComposingText(); |
+ int selection = Selection.getSelectionStart(mEditable); |
+ deleteSurroundingText(selection - compositionStart, selection - compositionEnd); |
+ endBatchEdit(); |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
@VisibleForTesting |
static class ImeState { |
public final String text; |