diff options
author | George Mount <mount@google.com> | 2012-06-06 16:24:00 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2012-06-06 16:40:22 -0700 |
commit | 2f25be4556024e8272a7a22e5b9a5c9b2caf2d65 (patch) | |
tree | 55e12c3555b1db4ec96e49ebb8e9b344ab7d57f5 /Source/WebKit/android | |
parent | d8befe2b1e15efadbcea9e46a91e1bf4e5519d98 (diff) | |
download | external_webkit-2f25be4556024e8272a7a22e5b9a5c9b2caf2d65.zip external_webkit-2f25be4556024e8272a7a22e5b9a5c9b2caf2d65.tar.gz external_webkit-2f25be4556024e8272a7a22e5b9a5c9b2caf2d65.tar.bz2 |
Fix edit text capturing selection.
Bug 6623128
Change-Id: Ia7a9f4bdf9478c8e1e8acb0e9f6e08d779185d11
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 42 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.h | 5 |
2 files changed, 24 insertions, 23 deletions
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index c0766e4..feb8ab4 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -1707,25 +1707,25 @@ IntPoint WebViewCore::convertGlobalContentToFrameContent(const IntPoint& point, return IntPoint(point.x() + frameOffset.x(), point.y() + frameOffset.y()); } -Position WebViewCore::trimSelectionPosition(const Position &start, const Position& stop) +VisiblePosition WebViewCore::trimSelectionPosition(const VisiblePosition &start, + const VisiblePosition& stop) { int direction = comparePositions(start, stop); if (direction == 0) return start; bool forward = direction < 0; - EAffinity affinity = forward ? DOWNSTREAM : UPSTREAM; bool move; - Position pos = start; + VisiblePosition pos = start; bool movedTooFar = false; do { move = true; - Node* node = pos.anchorNode(); + Node* node = pos.deepEquivalent().anchorNode(); if (node && node->isTextNode() && node->renderer()) { RenderText *textRenderer = toRenderText(node->renderer()); move = !textRenderer->textLength(); } if (move) { - Position nextPos = forward ? pos.next() : pos.previous(); + VisiblePosition nextPos = forward ? pos.next() : pos.previous(); movedTooFar = nextPos.isNull() || pos == nextPos || ((comparePositions(nextPos, stop) < 0) != forward); pos = nextPos; @@ -1761,37 +1761,37 @@ void WebViewCore::selectText(SelectText::HandleId handleId, int x, int y) bool draggingStart = (baseIsStart == draggingBase); if (draggingStart) { - startPosition = endPosition.honorEditableBoundaryAtOrAfter(startPosition); - if (startPosition.isNull()) - return; - if (selection.isCaret()) - start = end = startPosition.deepEquivalent(); - else { + if (selection.isRange()) { + startPosition = trimSelectionPosition(startPosition, endPosition); if ((startPosition != endPosition) && isEndOfBlock(startPosition)) { // Ensure startPosition is not at end of block VisiblePosition nextStartPosition(startPosition.next()); if (nextStartPosition.isNotNull()) startPosition = nextStartPosition; } - start = startPosition.deepEquivalent(); - start = trimSelectionPosition(start, end); } - } else { - endPosition = startPosition.honorEditableBoundaryAtOrAfter(endPosition); - if (endPosition.isNull()) + startPosition = endPosition.honorEditableBoundaryAtOrAfter(startPosition); + if (startPosition.isNull()) return; + start = startPosition.deepEquivalent(); if (selection.isCaret()) - start = end = endPosition.deepEquivalent(); - else { - if ((startPosition != endPosition) && isStartOfBlock(endPosition)) { + end = start; + } else { + if (selection.isRange()) { + endPosition = trimSelectionPosition(endPosition, startPosition); + if ((start != end) && isStartOfBlock(endPosition)) { // Ensure endPosition is not at start of block VisiblePosition prevEndPosition(endPosition.previous()); if (!prevEndPosition.isNull()) endPosition = prevEndPosition; } - end = endPosition.deepEquivalent(); - end = trimSelectionPosition(end, start); } + endPosition = startPosition.honorEditableBoundaryAtOrAfter(endPosition); + if (endPosition.isNull()) + return; + end = endPosition.deepEquivalent(); + if (selection.isCaret()) + start = end; } selection = VisibleSelection(base, extent); diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h index cf1295c..ba35005 100644 --- a/Source/WebKit/android/jni/WebViewCore.h +++ b/Source/WebKit/android/jni/WebViewCore.h @@ -738,8 +738,9 @@ namespace android { static WebCore::IntRect positionToTextRect(const WebCore::Position& position, WebCore::EAffinity affinity, const WebCore::IntPoint& offset); static bool isLtr(const WebCore::Position& position); - static WebCore::Position trimSelectionPosition( - const WebCore::Position& start, const WebCore::Position& stop); + static WebCore::VisiblePosition trimSelectionPosition( + const WebCore::VisiblePosition& start, + const WebCore::VisiblePosition& stop); // called from constructor, to add this to a global list static void addInstance(WebViewCore*); |