summaryrefslogtreecommitdiffstats
path: root/core/java/android/webkit/WebTextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/webkit/WebTextView.java')
-rw-r--r--core/java/android/webkit/WebTextView.java54
1 files changed, 35 insertions, 19 deletions
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index b0ecf09..5ee1b8a 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -607,23 +607,31 @@ import junit.framework.Assert;
// character or the existing selection, so it will not get cleared
// above.
mGotDelete = false;
+ // Prefer sending javascript events, so when adding one character,
+ // don't replace the unchanged text.
+ if (count > 1 && before == count - 1) {
+ String replaceButOne = s.subSequence(start,
+ start + before).toString();
+ String replacedString = getText().subSequence(start,
+ start + before).toString();
+ if (replaceButOne.equals(replacedString)) {
+ // we're just adding one character
+ start += before;
+ before = 0;
+ count = 1;
+ }
+ }
// Find the last character being replaced. If it can be represented by
- // events, we will pass them to native (after replacing the beginning
- // of the changed text), so we can see javascript events.
- // Otherwise, replace the text being changed (including the last
- // character) in the textfield.
- TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
- KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
- KeyEvent[] events = kmap.getEvents(mCharacter);
- boolean cannotUseKeyEvents = null == events;
- int charactersFromKeyEvents = cannotUseKeyEvents ? 0 : 1;
- if (count > 1 || cannotUseKeyEvents) {
- String replace = s.subSequence(start,
- start + count - charactersFromKeyEvents).toString();
- mWebView.replaceTextfieldText(start, start + before, replace,
- start + count - charactersFromKeyEvents,
- start + count - charactersFromKeyEvents);
- } else {
+ // events, we will pass them to native so we can see javascript events.
+ // Otherwise, replace the text being changed in the textfield.
+ KeyEvent[] events = null;
+ if (count == 1) {
+ TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
+ KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
+ events = kmap.getEvents(mCharacter);
+ }
+ boolean useKeyEvents = (events != null);
+ if (useKeyEvents) {
// This corrects the selection which may have been affected by the
// trackball or auto-correct.
if (DebugFlags.WEB_TEXT_VIEW) {
@@ -633,8 +641,6 @@ import junit.framework.Assert;
if (!mInSetTextAndKeepSelection) {
mWebView.setSelection(start, start + before);
}
- }
- if (!cannotUseKeyEvents) {
int length = events.length;
for (int i = 0; i < length; i++) {
// We never send modifier keys to native code so don't send them
@@ -643,6 +649,12 @@ import junit.framework.Assert;
sendDomEvent(events[i]);
}
}
+ } else {
+ String replace = s.subSequence(start,
+ start + count).toString();
+ mWebView.replaceTextfieldText(start, start + before, replace,
+ start + count,
+ start + count);
}
updateCachedTextfield();
}
@@ -966,8 +978,11 @@ import junit.framework.Assert;
* @param text The new text to place in the textfield.
*/
/* package */ void setTextAndKeepSelection(String text) {
- mPreChange = text.toString();
Editable edit = getText();
+ mPreChange = text;
+ if (edit.toString().equals(text)) {
+ return;
+ }
int selStart = Selection.getSelectionStart(edit);
int selEnd = Selection.getSelectionEnd(edit);
mInSetTextAndKeepSelection = true;
@@ -1075,6 +1090,7 @@ import junit.framework.Assert;
setMaxLength(maxLength);
setHorizontallyScrolling(single);
setInputType(inputType);
+ clearComposingText();
setImeOptions(imeOptions);
setVisibility(VISIBLE);
if (!autoComplete) {