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

Commit f23e1679 authored by George Mount's avatar George Mount
Browse files

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 e68a6936
Loading
Loading
Loading
Loading
+34 −19
Original line number Diff line number Diff line
@@ -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.
        // 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);
        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 = 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;