preserve webkit-side text selection

When webkit modifies a text field programmatically, it may change
the selection. This competes with the UI thread attempting to
set the selection in response to the IME next button and changes
made by the trackball.

One recent fix (https://android-git.corp.google.com/g/#change,26904)
sets the selection from the UI side after the IME generated click.
Unfortunately, this can be generated under other circumstances,
so this change qualifies this with mOkayForFocusNotToMatch, which
is only set after the IME next button is pressed.

The other change qualfies onTextChanged calls so that if it was
triggered by setTextAndKeepSelection, the webkit-side selection
is unchanged.

fixes http://b/issue?id=2096746
This commit is contained in:
Cary Clark
2009-09-30 10:24:19 -04:00
parent b386a86c1c
commit 0c5924e9dd
2 changed files with 12 additions and 5 deletions

View File

@@ -87,11 +87,12 @@ import java.util.ArrayList;
// Gets set to true when the the IME jumps to the next textfield. When this
// happens, the next time the user hits a key it is okay for the focus
// pointer to not match the WebTextView's node pointer
private boolean mOkayForFocusNotToMatch;
boolean mOkayForFocusNotToMatch;
// Whether or not a selection change was generated from webkit. If it was,
// we do not need to pass the selection back to webkit.
private boolean mFromWebKit;
private boolean mGotTouchDown;
private boolean mInSetTextAndKeepSelection;
// Array to store the final character added in onTextChanged, so that its
// KeyEvents may be determined.
private char[] mCharacter = new char[1];
@@ -395,7 +396,9 @@ import java.util.ArrayList;
Log.v(LOGTAG, "onTextChanged start=" + start
+ " start + before=" + (start + before));
}
mWebView.setSelection(start, start + before);
if (!mInSetTextAndKeepSelection) {
mWebView.setSelection(start, start + before);
}
}
if (!cannotUseKeyEvents) {
int length = events.length;
@@ -791,7 +794,9 @@ import java.util.ArrayList;
/* package */ void setTextAndKeepSelection(String text) {
mPreChange = text.toString();
Editable edit = (Editable) getText();
mInSetTextAndKeepSelection = true;
edit.replace(0, edit.length(), text);
mInSetTextAndKeepSelection = false;
updateCachedTextfield();
}

View File

@@ -4804,9 +4804,11 @@ public class WebView extends AbsoluteLayout
/* package */ void passToJavaScript(String currentText, KeyEvent event) {
if (nativeCursorWantsKeyEvents() && !nativeCursorMatchesFocus()) {
mWebViewCore.sendMessage(EventHub.CLICK);
int select = nativeFocusCandidateIsTextField() ?
nativeFocusCandidateMaxLength() : 0;
setSelection(select, select);
if (mWebTextView.mOkayForFocusNotToMatch) {
int select = nativeFocusCandidateIsTextField() ?
nativeFocusCandidateMaxLength() : 0;
setSelection(select, select);
}
}
WebViewCore.JSKeyData arg = new WebViewCore.JSKeyData();
arg.mEvent = event;