diff options
author | John Reck <jreck@google.com> | 2012-02-02 13:16:04 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2012-02-02 14:03:14 -0800 |
commit | df71abcaa1e7975b2fbc7522d006829223093825 (patch) | |
tree | 995032adc1fc3ef290a069293f0b9a8588173005 /Source/WebKit/android | |
parent | 97616e122163d8573c1fb93084ea469bc23d396a (diff) | |
download | external_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.cpp | 44 | ||||
-rw-r--r-- | Source/WebKit/android/nav/WebView.cpp | 11 |
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; } |