diff options
author | John Reck <jreck@google.com> | 2011-10-21 13:01:48 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-10-21 13:01:48 -0700 |
commit | 2dd2e5b4eb95280bb18717c1a31ca8db40a6413b (patch) | |
tree | 3b3f25344789be3a4f8488fbba4ab1c67455af02 | |
parent | 943da7b895b7cc69cdaed7979cff422a7dbaac19 (diff) | |
parent | e20bfd9b33960a4ad0c451efdff642bb17bda53f (diff) | |
download | frameworks_base-2dd2e5b4eb95280bb18717c1a31ca8db40a6413b.zip frameworks_base-2dd2e5b4eb95280bb18717c1a31ca8db40a6413b.tar.gz frameworks_base-2dd2e5b4eb95280bb18717c1a31ca8db40a6413b.tar.bz2 |
Merge changes I2df047b6,I791eeb3c into ics-mr0
* changes:
Fix rebuildWebTextView issues
DO NOT MERGE Fixed spell check failing to change word.
-rw-r--r-- | core/java/android/webkit/WebTextView.java | 54 | ||||
-rw-r--r-- | core/java/android/webkit/WebView.java | 29 |
2 files changed, 52 insertions, 31 deletions
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java index b0ecf09..5ee1b8a 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; @@ -1075,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 6e81530..a50fc89 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: |