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

Commit da182ded authored by George Mount's avatar George Mount Committed by John Reck
Browse files

DO NOT MERGE Fixed spell check failing to change word.

 Bug 5387838
 On WebView.rebuildWebTextView, setTextAndKeepSelection was
 being called, erasing the selections. Changed it so that
 when text is replaced with the exact same value, no replace
 is done. Also, on the Google search, when a spelling change
 was made, the final character was placed improperly. When
 a single character is added, the javascript events for the
 character are sent. When multiple characters are changed,
 the entire value is replaced with no javascript key events
 sent.

Change-Id: I791eeb3c96354cfe3cbfda7e8d05c81fcdeb152f
parent 2cf1cf09
Loading
Loading
Loading
Loading
+34 −19
Original line number Original line Diff line number Diff line
@@ -607,23 +607,31 @@ import junit.framework.Assert;
        // character or the existing selection, so it will not get cleared
        // character or the existing selection, so it will not get cleared
        // above.
        // above.
        mGotDelete = false;
        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
        // Find the last character being replaced.  If it can be represented by
        // events, we will pass them to native (after replacing the beginning
        // events, we will pass them to native so we can see javascript events.
        // of the changed text), so we can see javascript events.
        // Otherwise, replace the text being changed in the textfield.
        // Otherwise, replace the text being changed (including the last
        KeyEvent[] events = null;
        // character) in the textfield.
        if (count == 1) {
            TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
            TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
            KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
            KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
        KeyEvent[] events = kmap.getEvents(mCharacter);
            events = kmap.getEvents(mCharacter);
        boolean cannotUseKeyEvents = null == events;
        }
        int charactersFromKeyEvents = cannotUseKeyEvents ? 0 : 1;
        boolean useKeyEvents = (events != null);
        if (count > 1 || cannotUseKeyEvents) {
        if (useKeyEvents) {
            String replace = s.subSequence(start,
                    start + count - charactersFromKeyEvents).toString();
            mWebView.replaceTextfieldText(start, start + before, replace,
                    start + count - charactersFromKeyEvents,
                    start + count - charactersFromKeyEvents);
        } else {
            // This corrects the selection which may have been affected by the
            // This corrects the selection which may have been affected by the
            // trackball or auto-correct.
            // trackball or auto-correct.
            if (DebugFlags.WEB_TEXT_VIEW) {
            if (DebugFlags.WEB_TEXT_VIEW) {
@@ -633,8 +641,6 @@ import junit.framework.Assert;
            if (!mInSetTextAndKeepSelection) {
            if (!mInSetTextAndKeepSelection) {
                mWebView.setSelection(start, start + before);
                mWebView.setSelection(start, start + before);
            }
            }
        }
        if (!cannotUseKeyEvents) {
            int length = events.length;
            int length = events.length;
            for (int i = 0; i < length; i++) {
            for (int i = 0; i < length; i++) {
                // We never send modifier keys to native code so don't send them
                // We never send modifier keys to native code so don't send them
@@ -643,6 +649,12 @@ import junit.framework.Assert;
                    sendDomEvent(events[i]);
                    sendDomEvent(events[i]);
                }
                }
            }
            }
        } else {
            String replace = s.subSequence(start,
                    start + count).toString();
            mWebView.replaceTextfieldText(start, start + before, replace,
                    start + count,
                    start + count);
        }
        }
        updateCachedTextfield();
        updateCachedTextfield();
    }
    }
@@ -966,8 +978,11 @@ import junit.framework.Assert;
     * @param   text    The new text to place in the textfield.
     * @param   text    The new text to place in the textfield.
     */
     */
    /* package */ void setTextAndKeepSelection(String text) {
    /* package */ void setTextAndKeepSelection(String text) {
        mPreChange = text.toString();
        Editable edit = getText();
        Editable edit = getText();
        mPreChange = text;
        if (edit.toString().equals(text)) {
            return;
        }
        int selStart = Selection.getSelectionStart(edit);
        int selStart = Selection.getSelectionStart(edit);
        int selEnd = Selection.getSelectionEnd(edit);
        int selEnd = Selection.getSelectionEnd(edit);
        mInSetTextAndKeepSelection = true;
        mInSetTextAndKeepSelection = true;