From da182deded05d0a8e166726a49ed26ab32c3ae9c Mon Sep 17 00:00:00 2001 From: George Mount Date: Mon, 17 Oct 2011 13:22:17 -0700 Subject: 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 --- core/java/android/webkit/WebTextView.java | 53 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java index b0ecf092ea58..ccacd0942662 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; -- cgit v1.2.3-59-g8ed1b From e20bfd9b33960a4ad0c451efdff642bb17bda53f Mon Sep 17 00:00:00 2001 From: John Reck Date: Fri, 21 Oct 2011 12:39:43 -0700 Subject: Fix rebuildWebTextView issues Bug: 5488135 Change-Id: I2df047b6de42dbe716008f69d720fa5fad3fe19d --- core/java/android/webkit/WebTextView.java | 1 + core/java/android/webkit/WebView.java | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java index ccacd0942662..5ee1b8a66067 100644 --- a/core/java/android/webkit/WebTextView.java +++ b/core/java/android/webkit/WebTextView.java @@ -1090,6 +1090,7 @@ import junit.framework.Assert; setMaxLength(maxLength); setHorizontallyScrolling(single); setInputType(inputType); + clearComposingText(); setImeOptions(imeOptions); setVisibility(VISIBLE); if (!autoComplete) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 6e81530396cd..a50fc8916019 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -4798,16 +4798,7 @@ public class WebView extends AbsoluteLayout mTextGeneration = 0; } mWebTextView.updateTextSize(); - Rect visibleRect = new Rect(); - calcOurContentVisibleRect(visibleRect); - // Note that sendOurVisibleRect calls viewToContent, so the coordinates - // should be in content coordinates. - Rect bounds = nativeFocusCandidateNodeBounds(); - Rect vBox = contentToViewRect(bounds); - mWebTextView.setRect(vBox.left, vBox.top, vBox.width(), vBox.height()); - if (!Rect.intersects(bounds, visibleRect)) { - revealSelection(); - } + updateWebTextViewPosition(); String text = nativeFocusCandidateText(); int nodePointer = nativeFocusCandidatePointer(); // This needs to be called before setType, which may call @@ -4816,7 +4807,6 @@ public class WebView extends AbsoluteLayout mWebTextView.setType(nativeFocusCandidateType()); // Gravity needs to be set after setType mWebTextView.setGravityForRtl(nativeFocusCandidateIsRtlText()); - updateWebTextViewPadding(); if (null == text) { if (DebugFlags.WEB_VIEW) { Log.v(LOGTAG, "rebuildWebTextView null == text"); @@ -4827,12 +4817,27 @@ public class WebView extends AbsoluteLayout InputMethodManager imm = InputMethodManager.peekInstance(); if (imm != null && imm.isActive(mWebTextView)) { imm.restartInput(mWebTextView); + mWebTextView.clearComposingText(); } if (isFocused()) { mWebTextView.requestFocus(); } } + public void updateWebTextViewPosition() { + Rect visibleRect = new Rect(); + calcOurContentVisibleRect(visibleRect); + // Note that sendOurVisibleRect calls viewToContent, so the coordinates + // should be in content coordinates. + Rect bounds = nativeFocusCandidateNodeBounds(); + Rect vBox = contentToViewRect(bounds); + mWebTextView.setRect(vBox.left, vBox.top, vBox.width(), vBox.height()); + if (!Rect.intersects(bounds, visibleRect)) { + revealSelection(); + } + updateWebTextViewPadding(); + } + /** * Update the padding of mWebTextView based on the native textfield/textarea */ @@ -8433,7 +8438,7 @@ public class WebView extends AbsoluteLayout // this is sent after finishing resize in WebViewCore. Make // sure the text edit box is still on the screen. if (inEditingMode() && nativeCursorIsTextInput()) { - rebuildWebTextView(); + updateWebTextViewPosition(); } break; case CLEAR_TEXT_ENTRY: -- cgit v1.2.3-59-g8ed1b