summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2012-02-02 13:16:04 -0800
committerJohn Reck <jreck@google.com>2012-02-02 14:03:14 -0800
commitdf71abcaa1e7975b2fbc7522d006829223093825 (patch)
tree995032adc1fc3ef290a069293f0b9a8588173005 /Source/WebKit/android
parent97616e122163d8573c1fb93084ea469bc23d396a (diff)
downloadexternal_webkit-df71abcaa1e7975b2fbc7522d006829223093825.zip
external_webkit-df71abcaa1e7975b2fbc7522d006829223093825.tar.gz
external_webkit-df71abcaa1e7975b2fbc7522d006829223093825.tar.bz2
Snap selection handles to end of text
Instead of using WebKit's cursor location use the start and end of the text highlight region since we only highlight text and not other content like images Change-Id: I1b84b8a0be34c56e87169d215c581fdada745362
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp44
-rw-r--r--Source/WebKit/android/nav/WebView.cpp11
2 files changed, 30 insertions, 25 deletions
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp
index 6d89bdb..8498639 100644
--- a/Source/WebKit/android/jni/WebViewCore.cpp
+++ b/Source/WebKit/android/jni/WebViewCore.cpp
@@ -1781,19 +1781,6 @@ void WebViewCore::layerToAbsoluteOffset(const LayerAndroid* layer, IntPoint& off
}
}
-void setCaretInfo(const VisiblePosition& pos, SelectText::HandleId handle,
- SelectText* target)
-{
- IntPoint offset;
- LayerAndroid* layer = 0;
- IntRect rect = pos.absoluteCaretBounds();
- int layerId = WebViewCore::platformLayerIdFromNode(pos.deepEquivalent().anchorNode(), &layer);
- WebViewCore::layerToAbsoluteOffset(layer, offset);
- rect.move(-offset.x(), -offset.y());
- target->setCaretRect(handle, rect);
- target->setCaretLayerId(handle, layerId);
-}
-
SelectText* WebViewCore::createSelectText(const VisibleSelection& selection)
{
// We need to agressively check to see if this is an empty selection to prevent
@@ -1813,6 +1800,8 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection)
SelectText* selectTextContainer = new SelectText();
IntPoint frameOffset = convertGlobalContentToFrameContent(IntPoint());
+ IntRect startHandle;
+ IntRect endHandle;
Node* stopNode = range->pastLastNode();
for (Node* node = range->firstNode(); node != stopNode; node = node->traverseNextNode()) {
RenderObject* r = node->renderer();
@@ -1822,21 +1811,36 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection)
int startOffset = node == startContainer ? range->startOffset() : 0;
int endOffset = node == endContainer ? range->endOffset() : numeric_limits<int>::max();
LayerAndroid* layer = 0;
- platformLayerIdFromNode(node, &layer);
+ int layerId = platformLayerIdFromNode(node, &layer);
Vector<IntRect> rects;
renderText->absoluteRectsForRange(rects, startOffset, endOffset, true);
+ if (rects.size()) {
+ IntPoint offset;
+ layerToAbsoluteOffset(layer, offset);
+ endHandle = rects[rects.size() - 1];
+ endHandle.move(-offset.x(), -offset.y());
+ selectTextContainer->setCaretLayerId(SelectText::EndHandle, layerId);
+ if (startHandle.isEmpty()) {
+ startHandle = rects[0];
+ startHandle.move(-offset.x(), -offset.y());
+ selectTextContainer->setCaretLayerId(SelectText::StartHandle, layerId);
+ }
+ }
selectTextContainer->addHighlightRegion(layer, rects, frameOffset);
}
IntRect caretRect;
int layerId;
selectTextContainer->setBaseFirst(selection.isBaseFirst());
- setCaretInfo(selection.visibleStart(), SelectText::StartHandle, selectTextContainer);
- setCaretInfo(selection.visibleEnd(), SelectText::EndHandle, selectTextContainer);
- selectTextContainer->caretRect(SelectText::StartHandle)
- .move(-frameOffset.x(), -frameOffset.y());
- selectTextContainer->caretRect(SelectText::EndHandle)
- .move(-frameOffset.x(), -frameOffset.y());
+
+ // Squish the handle rects
+ startHandle.setWidth(1);
+ endHandle.move(endHandle.width() - 1, 0);
+ endHandle.setWidth(1);
+ startHandle.move(-frameOffset.x(), -frameOffset.y());
+ selectTextContainer->setCaretRect(SelectText::StartHandle, startHandle);
+ endHandle.move(-frameOffset.x(), -frameOffset.y());
+ selectTextContainer->setCaretRect(SelectText::EndHandle, endHandle);
selectTextContainer->setText(range->text());
diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp
index efdb67f..62cc6ce 100644
--- a/Source/WebKit/android/nav/WebView.cpp
+++ b/Source/WebKit/android/nav/WebView.cpp
@@ -1420,15 +1420,16 @@ int getHandleLayerId(SelectText::HandleId handleId, SkIRect& cursorRect) {
if (!selectText)
return -1;
int layerId = selectText->caretLayerId(handleId);
- const IntRect& r = selectText->caretRect(handleId);
- cursorRect.set(r.x(), r.y(), r.maxX(), r.maxY());
+ IntRect rect = selectText->caretRect(handleId);
if (layerId != -1) {
+ // We need to make sure the drawTransform is up to date as this is
+ // called before a draw() or drawGL()
+ m_baseLayer->updateLayerPositions(m_visibleRect);
LayerAndroid* root = compositeRoot();
LayerAndroid* layer = root ? root->findById(layerId) : 0;
- IntPoint offset;
- WebViewCore::layerToAbsoluteOffset(layer, offset);
- cursorRect.offset(offset.x(), offset.y());
+ rect = layer->drawTransform()->mapRect(rect);
}
+ cursorRect.set(rect.x(), rect.y(), rect.maxX(), rect.maxY());
return layerId;
}