diff options
author | George Mount <mount@google.com> | 2012-05-15 13:25:12 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-15 13:25:12 -0700 |
commit | 10f686b8c96114108ebbad4bd86b1810871d54f5 (patch) | |
tree | fba0505bd4bada0f888ce1821d6d361b387531f9 /Source/WebKit/android/jni | |
parent | bbaf943fc6f340f257b9fce2ec802b1cf2deed36 (diff) | |
parent | e47f743261938b674d8871217236c03420bd2020 (diff) | |
download | external_webkit-10f686b8c96114108ebbad4bd86b1810871d54f5.zip external_webkit-10f686b8c96114108ebbad4bd86b1810871d54f5.tar.gz external_webkit-10f686b8c96114108ebbad4bd86b1810871d54f5.tar.bz2 |
Merge "Only start or end selection with non-empty text fields." into jb-dev
Diffstat (limited to 'Source/WebKit/android/jni')
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 35 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.h | 2 |
2 files changed, 36 insertions, 1 deletions
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index af76daa..bb3307c 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -1686,6 +1686,35 @@ 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) +{ + int direction = comparePositions(start, stop); + if (direction == 0) + return start; + bool forward = direction < 0; + EAffinity affinity = forward ? DOWNSTREAM : UPSTREAM; + bool move; + Position pos = start; + bool movedTooFar = false; + do { + move = true; + Node* node = pos.anchorNode(); + if (node && node->isTextNode() && node->renderer()) { + RenderText *textRenderer = toRenderText(node->renderer()); + move = !textRenderer->textLength(); + } + if (move) { + Position nextPos = forward ? pos.next() : pos.previous(); + movedTooFar = nextPos.isNull() || pos == nextPos + || ((comparePositions(nextPos, stop) < 0) != forward); + pos = nextPos; + } + } while (move && !movedTooFar); + if (movedTooFar) + pos = stop; + return pos; +} + void WebViewCore::selectText(int startX, int startY, int endX, int endY) { SelectionController* sc = focusedFrame()->selection(); @@ -1722,7 +1751,11 @@ void WebViewCore::selectText(int startX, int startY, int endX, int endY) endPosition = prevEndPosition; } - VisibleSelection selection(startPosition, endPosition); + Position start = startPosition.deepEquivalent(); + Position end = endPosition.deepEquivalent(); + start = trimSelectionPosition(start, end); + end = trimSelectionPosition(end, start); + VisibleSelection selection(start, end); // Only allow changes between caret positions or to text selection. bool selectChangeAllowed = (!selection.isCaret() || sc->isCaret()); if (selectChangeAllowed && sc->shouldChangeSelection(selection)) diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h index a3c1e7c..fb732e5 100644 --- a/Source/WebKit/android/jni/WebViewCore.h +++ b/Source/WebKit/android/jni/WebViewCore.h @@ -738,6 +738,8 @@ namespace android { static WebCore::IntRect positionToTextRect(const WebCore::Position& position, WebCore::EAffinity affinity); static bool isLtr(const WebCore::Position& position); + static WebCore::Position trimSelectionPosition( + const WebCore::Position& start, const WebCore::Position& stop); // called from constructor, to add this to a global list static void addInstance(WebViewCore*); |