diff options
| author | 2011-10-21 13:01:48 -0700 | |
|---|---|---|
| committer | 2011-10-21 13:01:48 -0700 | |
| commit | 2dd2e5b4eb95280bb18717c1a31ca8db40a6413b (patch) | |
| tree | 3b3f25344789be3a4f8488fbba4ab1c67455af02 | |
| parent | 943da7b895b7cc69cdaed7979cff422a7dbaac19 (diff) | |
| parent | e20bfd9b33960a4ad0c451efdff642bb17bda53f (diff) | |
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 b0ecf092ea58..5ee1b8a66067 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 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:  |