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

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java

Issue 1137673005: Deal with backspace keycodes getting sent by IME during compositions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add another test for repeat keydowns Created 5 years, 7 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 e1989c752c17a6201daf6d5a16f9d33adfe9523f..75c8bd841deba1ddb41d9b5db317a682e308232b 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
@@ -343,6 +343,11 @@ public class AdapterInputConnection extends BaseInputConnection {
*/
@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
+ return deleteSurroundingTextImpl(beforeLength, afterLength, false);
+ }
+
+ private boolean deleteSurroundingTextImpl(
+ int beforeLength, int afterLength, boolean fromPhysicalKey) {
if (DEBUG) {
Log.w(TAG, "deleteSurroundingText [" + beforeLength + " " + afterLength + "]");
}
@@ -355,6 +360,12 @@ public class AdapterInputConnection extends BaseInputConnection {
super.deleteSurroundingText(beforeLength, afterLength);
updateSelectionIfRequired();
+ // If this was called due to a physical key, no need to generate a key event here as
+ // the caller will take care of forwarding the original.
+ if (fromPhysicalKey) {
+ return true;
+ }
+
// For single-char deletion calls |ImeAdapter.sendKeyEventWithKeyCode| with the real key
// code. For multi-character deletion, executes deletion by calling
// |ImeAdapter.deleteSurroundingText| and sends synthetic key events with a dummy key code.
@@ -387,43 +398,37 @@ public class AdapterInputConnection extends BaseInputConnection {
if (DEBUG) {
Log.w(TAG, "sendKeyEvent [" + event.getAction() + "] [" + event.getKeyCode() + "]");
}
- // If this is a key-up, and backspace/del or if the key has a character representation,
+
+ int action = event.getAction();
+ int keycode = event.getKeyCode();
+ int unicodeChar = event.getUnicodeChar();
+
+ // If this is backspace/del or if the key has a character representation,
// need to update the underlying Editable (i.e. the local representation of the text
- // being edited).
- if (event.getAction() == KeyEvent.ACTION_UP) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
- deleteSurroundingText(1, 0);
- return true;
- } else if (event.getKeyCode() == KeyEvent.KEYCODE_FORWARD_DEL) {
- deleteSurroundingText(0, 1);
- return true;
- } else {
- int unicodeChar = event.getUnicodeChar();
- if (unicodeChar != 0) {
- int selectionStart = Selection.getSelectionStart(mEditable);
- int selectionEnd = Selection.getSelectionEnd(mEditable);
- if (selectionStart > selectionEnd) {
- int temp = selectionStart;
- selectionStart = selectionEnd;
- selectionEnd = temp;
- }
- mEditable.replace(selectionStart, selectionEnd,
- Character.toString((char) unicodeChar));
- }
- }
- } else if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ // being edited). Some IMEs like Jellybean stock IME and Samsung IME mix in delete
+ // KeyPress events instead of calling deleteSurroundingText.
+ if (action == KeyEvent.ACTION_DOWN && keycode == KeyEvent.KEYCODE_DEL) {
+ deleteSurroundingTextImpl(1, 0, true);
+ } else if (action == KeyEvent.ACTION_DOWN && keycode == KeyEvent.KEYCODE_FORWARD_DEL) {
+ deleteSurroundingTextImpl(0, 1, true);
+ } else if (action == KeyEvent.ACTION_DOWN && keycode == KeyEvent.KEYCODE_ENTER) {
+ // Finish text composition when pressing enter, as that may submit a form field.
// TODO(aurimas): remove this workaround when crbug.com/278584 is fixed.
- if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
- beginBatchEdit();
- finishComposingText();
- mImeAdapter.translateAndSendNativeEvents(event);
- endBatchEdit();
- return true;
- } else if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
- return true;
- } else if (event.getKeyCode() == KeyEvent.KEYCODE_FORWARD_DEL) {
- return true;
+ beginBatchEdit();
+ finishComposingText();
+ mImeAdapter.translateAndSendNativeEvents(event);
+ endBatchEdit();
+ return true;
+ } else if (action == KeyEvent.ACTION_UP && unicodeChar != 0) {
+ int selectionStart = Selection.getSelectionStart(mEditable);
+ int selectionEnd = Selection.getSelectionEnd(mEditable);
+ if (selectionStart > selectionEnd) {
+ int temp = selectionStart;
+ selectionStart = selectionEnd;
+ selectionEnd = temp;
}
+ mEditable.replace(selectionStart, selectionEnd,
+ Character.toString((char) unicodeChar));
}
mImeAdapter.translateAndSendNativeEvents(event);
return true;
« no previous file with comments | « no previous file | content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698