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

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: Move to method of VisibleSelection, fix style nits 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 f782165a96ed8739caa56cceb63d11afa530737b..856ff982a29302075cb055935a8864f73cd84ad6 100644
--- a/Source/WebKit/chromium/src/WebFrameImpl.cpp
+++ b/Source/WebKit/chromium/src/WebFrameImpl.cpp
@@ -1368,15 +1368,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)
@@ -1387,31 +1379,46 @@ 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 frame()->selection()->selection().visiblePositionRespectingEditingBoundary(result.localPoint(), node);
}
int WebFrameImpl::printBegin(const WebPrintParams& printParams, const WebNode& constrainToNode, bool* useBrowserOverlays)

Powered by Google App Engine
This is Rietveld 408576698