Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Unified Diff: Source/WebKit/chromium/src/WebFrameImpl.cpp

Issue 15017002: WebFrame::selectRange and moveCaret should behave like mouse selection (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebKit/chromium/src/WebFrameImpl.cpp
diff --git a/Source/WebKit/chromium/src/WebFrameImpl.cpp b/Source/WebKit/chromium/src/WebFrameImpl.cpp
index 7546f49b3342613df44397dcbe7c6f04d9eef867..7701d6b227d25b418b2b98a2dd643a69e1d46e4f 100644
--- a/Source/WebKit/chromium/src/WebFrameImpl.cpp
+++ b/Source/WebKit/chromium/src/WebFrameImpl.cpp
@@ -1363,15 +1363,7 @@ bool WebFrameImpl::selectWordAroundCaret()
void WebFrameImpl::selectRange(const WebPoint& base, const WebPoint& extent)
{
- IntPoint unscaledBase = base;
- IntPoint unscaledExtent = extent;
- unscaledExtent.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
- unscaledBase.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
- VisiblePosition basePosition = visiblePositionForWindowPoint(unscaledBase);
- VisiblePosition extentPosition = visiblePositionForWindowPoint(unscaledExtent);
- VisibleSelection newSelection = VisibleSelection(basePosition, extentPosition);
- if (frame()->selection()->shouldChangeSelection(newSelection))
- frame()->selection()->setSelection(newSelection, CharacterGranularity);
+ moveRangeSelection(base, extent);
}
void WebFrameImpl::selectRange(const WebRange& webRange)
@@ -1382,31 +1374,44 @@ void WebFrameImpl::selectRange(const WebRange& webRange)
void WebFrameImpl::moveCaretSelectionTowardsWindowPoint(const WebPoint& point)
{
- IntPoint unscaledPoint(point);
- unscaledPoint.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
+ moveCaretSelection(point);
+}
+
+void WebFrameImpl::moveRangeSelection(const WebPoint& base, const WebPoint& extent) {
+ FrameSelection* selection = frame()->selection();
+ if (!selection)
+ return;
+ VisiblePosition basePosition = visiblePositionForWindowPoint(base);
+ VisiblePosition extentPosition = visiblePositionForWindowPoint(extent);
+ VisibleSelection newSelection = VisibleSelection(basePosition, extentPosition);
+ if (frame()->selection()->shouldChangeSelection(newSelection))
+ frame()->selection()->setSelection(newSelection, CharacterGranularity);
+}
+
+void WebFrameImpl::moveCaretSelection(const WebPoint& point) {
Element* editable = frame()->selection()->rootEditableElement();
if (!editable)
return;
- IntPoint contentsPoint = frame()->view()->windowToContents(unscaledPoint);
- LayoutPoint localPoint(editable->convertFromPage(contentsPoint));
- VisiblePosition position = editable->renderer()->positionForPoint(localPoint);
+ VisiblePosition position = visiblePositionForWindowPoint(point);
if (frame()->selection()->shouldChangeSelection(position))
frame()->selection()->moveTo(position, UserTriggered);
}
VisiblePosition WebFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
{
- HitTestRequest request = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowShadowContent;
- HitTestResult result(frame()->view()->windowToContents(IntPoint(point)));
+ FloatPoint unscaledPoint(point);
+ unscaledPoint.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
+ HitTestRequest request = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowShadowContent;
+ HitTestResult result(frame()->view()->windowToContents(roundedIntPoint(unscaledPoint)));
frame()->document()->renderView()->layer()->hitTest(request, result);
Node* node = result.targetNode();
if (!node)
return VisiblePosition();
- return node->renderer()->positionForPoint(result.localPoint());
+ return visiblePositionRespectingEditingBoundary(frame()->selection()->selection(), result.localPoint(), node);
}
int WebFrameImpl::printBegin(const WebPrintParams& printParams, const WebNode& constrainToNode, bool* useBrowserOverlays)

Powered by Google App Engine
This is Rietveld 408576698