Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c5924e9 authored by Cary Clark's avatar Cary Clark
Browse files

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
parent b386a86c
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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,8 +396,10 @@ import java.util.ArrayList;
                Log.v(LOGTAG, "onTextChanged start=" + start
                        + " start + before=" + (start + before));
            }
            if (!mInSetTextAndKeepSelection) {
                mWebView.setSelection(start, start + before);
            }
        }
        if (!cannotUseKeyEvents) {
            int length = events.length;
            for (int i = 0; i < length; i++) {
@@ -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();
    }

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