Commit 331ee13c authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce positionForPoint() in LocalFrame class as replacement of visiblePositionForPoint()

This patch introduces |positionForPoint()| in |LocalFrame| class as replacement
of |visiblePositionForPoint()| to reduce doing visible position
canonicalization for increasing chance to delay canonicalization with changing
|setPosition()| in |DragCaretController| and |VisibleSelection| constructor to
take |PositionWithAffinity|.

Note: Both of |VisbilePosition| constructor and |VisibleSelection| constructor
do visible position canaonicalization.

This patch is a preparation of making selection to handle granularity for web
component, http://crrev.com/1277863002

BUG=513568
TEST=n/a; no behavior changes

Review URL: https://codereview.chromium.org/1310323004

git-svn-id: svn://svn.chromium.org/blink/trunk@201110 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent a42c8dd4
......@@ -47,7 +47,7 @@ bool DragCaretController::isContentRichlyEditable() const
return isRichlyEditablePosition(m_position.deepEquivalent());
}
void DragCaretController::setCaretPosition(const VisiblePosition& position)
void DragCaretController::setCaretPosition(const PositionWithAffinity& position)
{
// for querying Layer::compositingState()
// This code is probably correct, since it doesn't occur in a stack that
......@@ -56,7 +56,7 @@ void DragCaretController::setCaretPosition(const VisiblePosition& position)
if (Node* node = m_position.deepEquivalent().anchorNode())
invalidateCaretRect(node);
m_position = position;
m_position = VisiblePosition(position);
Document* document = nullptr;
if (Node* node = m_position.deepEquivalent().anchorNode()) {
invalidateCaretRect(node);
......
......@@ -44,8 +44,8 @@ public:
bool hasCaret() const { return m_position.isNotNull(); }
const VisiblePosition& caretPosition() { return m_position; }
void setCaretPosition(const VisiblePosition&);
void clear() { setCaretPosition(VisiblePosition()); }
void setCaretPosition(const PositionWithAffinity&);
void clear() { setCaretPosition(PositionWithAffinity()); }
void nodeWillBeRemoved(Node&);
......
......@@ -70,6 +70,11 @@ VisibleSelection::VisibleSelection(const PositionInComposedTree& base, const Pos
{
}
VisibleSelection::VisibleSelection(const PositionWithAffinity& pos, bool isDirectional)
: VisibleSelection(pos.position(), pos.affinity(), isDirectional)
{
}
VisibleSelection::VisibleSelection(const VisiblePosition& pos, bool isDirectional)
: VisibleSelection(pos, pos, isDirectional)
{
......
......@@ -99,6 +99,7 @@ public:
explicit VisibleSelection(const EphemeralRange&, TextAffinity = SEL_DEFAULT_AFFINITY, bool isDirectional = false);
explicit VisibleSelection(const PositionWithAffinity&, bool isDirectional = false);
explicit VisibleSelection(const VisiblePosition&, bool isDirectional = false);
VisibleSelection(const VisiblePosition&, const VisiblePosition&, bool isDirectional = false);
......
......@@ -672,19 +672,19 @@ String LocalFrame::selectedTextForClipboard() const
return selection().selectedTextForClipboard();
}
VisiblePosition LocalFrame::visiblePositionForPoint(const IntPoint& framePoint)
PositionWithAffinity LocalFrame::positionForPoint(const IntPoint& framePoint)
{
HitTestResult result = eventHandler().hitTestResultAtPoint(framePoint);
Node* node = result.innerNodeOrImageMapImage();
if (!node)
return VisiblePosition();
return PositionWithAffinity();
LayoutObject* layoutObject = node->layoutObject();
if (!layoutObject)
return VisiblePosition();
VisiblePosition visiblePos = VisiblePosition(layoutObject->positionForPoint(result.localPoint()));
if (visiblePos.isNull())
visiblePos = VisiblePosition(firstPositionInOrBeforeNode(node));
return visiblePos;
return PositionWithAffinity();
const PositionWithAffinity position = layoutObject->positionForPoint(result.localPoint());
if (position.isNull())
return PositionWithAffinity(firstPositionInOrBeforeNode(node));
return position;
}
Document* LocalFrame::documentAtPoint(const IntPoint& pointInRootFrame)
......@@ -702,10 +702,11 @@ Document* LocalFrame::documentAtPoint(const IntPoint& pointInRootFrame)
EphemeralRange LocalFrame::rangeForPoint(const IntPoint& framePoint)
{
VisiblePosition position = visiblePositionForPoint(framePoint);
if (position.isNull())
const PositionWithAffinity positionWithAffinity = positionForPoint(framePoint);
if (positionWithAffinity.isNull())
return EphemeralRange();
VisiblePosition position(positionWithAffinity);
VisiblePosition previous = position.previous();
if (previous.isNotNull()) {
const EphemeralRange previousCharacterRange = makeRange(previous, position);
......
......@@ -72,7 +72,7 @@ class TreeScope;
class ScriptController;
class SpellChecker;
class TreeScope;
class VisiblePosition;
template <typename Strategy> class PositionWithAffinityTemplate;
class CORE_EXPORT LocalFrame : public Frame, public LocalFrameLifecycleNotifier, public WillBeHeapSupplementable<LocalFrame> {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(LocalFrame);
......@@ -159,7 +159,7 @@ public:
String selectedText() const;
String selectedTextForClipboard() const;
VisiblePosition visiblePositionForPoint(const IntPoint& framePoint);
PositionWithAffinityTemplate<EditingAlgorithm<NodeTraversal>> positionForPoint(const IntPoint& framePoint);
Document* documentAtPoint(const IntPoint& windowPoint);
EphemeralRangeTemplate<EditingAlgorithm<NodeTraversal>> rangeForPoint(const IntPoint& framePoint);
......
......@@ -374,7 +374,7 @@ bool DragController::tryDocumentDrag(DragData* dragData, DragDestinationAction a
}
if (!m_fileInputElementUnderMouse)
m_page->dragCaretController().setCaretPosition(m_documentUnderMouse->frame()->visiblePositionForPoint(point));
m_page->dragCaretController().setCaretPosition(m_documentUnderMouse->frame()->positionForPoint(point));
LocalFrame* innerFrame = element->document().frame();
dragSession.operation = dragIsMove(innerFrame->selection(), dragData) ? DragOperationMove : DragOperationCopy;
......@@ -428,7 +428,7 @@ static bool setSelectionToDragCaret(LocalFrame* frame, VisibleSelection& dragCar
{
frame->selection().setSelection(dragCaret);
if (frame->selection().isNone()) {
dragCaret = VisibleSelection(frame->visiblePositionForPoint(point));
dragCaret = VisibleSelection(frame->positionForPoint(point));
frame->selection().setSelection(dragCaret);
range = dragCaret.toNormalizedRange();
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment