summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android
diff options
context:
space:
mode:
authorGeorge Mount <mount@google.com>2012-05-15 13:25:12 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-05-15 13:25:12 -0700
commit10f686b8c96114108ebbad4bd86b1810871d54f5 (patch)
treefba0505bd4bada0f888ce1821d6d361b387531f9 /Source/WebKit/android
parentbbaf943fc6f340f257b9fce2ec802b1cf2deed36 (diff)
parente47f743261938b674d8871217236c03420bd2020 (diff)
downloadexternal_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')
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp35
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h2
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*);