Commit 4f60c210 authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce isVisuallyEquivalentCandidate() as replacement of PositionAlgorithm::isCandidate()

This patch introduces |isVisuallyEquivalentCandidate()| as replacement of
|PositionAlgorithm::isCandidate()| to make what this functions for
improving readability.

Following patch will move |isVisuallyEquivalentCandidate()| to
"VisibleUnits.cpp" to reduce usages of |InlineBox| from "Position.cpp" as
part of making |PositionAlgorithm| class to free from |InlineBox|.

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

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

git-svn-id: svn://svn.chromium.org/blink/trunk@200917 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent ed949599
......@@ -338,7 +338,7 @@ PositionAlgorithm<Strategy> nextCandidateAlgorithm(const PositionAlgorithm<Strat
p.increment();
while (!p.atEnd()) {
PositionAlgorithm<Strategy> candidate = p.computePosition();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
return candidate;
p.increment();
......@@ -371,7 +371,7 @@ Position nextVisuallyDistinctCandidate(const Position& position)
p.increment();
while (!p.atEnd()) {
Position candidate = p.computePosition();
if (candidate.isCandidate() && candidate.downstream() != downstreamStart)
if (isVisuallyEquivalentCandidate(candidate) && candidate.downstream() != downstreamStart)
return candidate;
p.increment();
......@@ -388,7 +388,7 @@ PositionAlgorithm<Strategy> previousCandidateAlgorithm(const PositionAlgorithm<S
p.decrement();
while (!p.atStart()) {
PositionAlgorithm<Strategy> candidate = p.computePosition();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
return candidate;
p.decrement();
......@@ -422,7 +422,7 @@ PositionAlgorithm<Strategy> previousVisuallyDistinctCandidateAlgorithm(const Pos
p.decrement();
while (!p.atStart()) {
PositionAlgorithm<Strategy> candidate = p.computePosition();
if (candidate.isCandidate() && candidate.downstream() != downstreamStart)
if (isVisuallyEquivalentCandidate(candidate) && candidate.downstream() != downstreamStart)
return candidate;
p.decrement();
......@@ -1151,7 +1151,7 @@ static Position previousCharacterPosition(const Position& position, TextAffinity
Element* fromRootEditableElement = position.anchorNode()->rootEditableElement();
bool atStartOfLine = isStartOfLine(VisiblePosition(position, affinity));
bool rendered = position.isCandidate();
bool rendered = isVisuallyEquivalentCandidate(position);
Position currentPos = position;
while (!currentPos.atStartOfTree()) {
......@@ -1161,7 +1161,7 @@ static Position previousCharacterPosition(const Position& position, TextAffinity
return position;
if (atStartOfLine || !rendered) {
if (currentPos.isCandidate())
if (isVisuallyEquivalentCandidate(currentPos))
return currentPos;
} else if (rendersInDifferentPosition(position, currentPos)) {
return currentPos;
......
......@@ -1282,7 +1282,7 @@ IntRect FrameSelection::absoluteCaretBounds()
clearCaretRect();
} else {
if (isTextFormControl(m_selection))
updateCaretRect(PositionWithAffinity(m_selection.start().isCandidate() ? m_selection.start() : Position(), m_selection.affinity()));
updateCaretRect(PositionWithAffinity(isVisuallyEquivalentCandidate(m_selection.start()) ? m_selection.start() : Position(), m_selection.affinity()));
else
updateCaretRect(VisiblePosition(m_selection.start(), m_selection.affinity()));
}
......
......@@ -492,13 +492,16 @@ PositionAlgorithm<Strategy> PositionAlgorithm<Strategy>::downstream(EditingBound
return mostBackwardCaretPosition(*this, rule);
}
// TODO(yosin) We should move |isVisuallyEquivalentCandidate()| to
// "VisibleUnits.cpp" to reduce |LayoutObject| dependency in "Position.cpp".
template <typename Strategy>
bool PositionAlgorithm<Strategy>::isCandidate() const
static bool isVisuallyEquivalentCandidateAlgorithm(const PositionAlgorithm<Strategy>& position)
{
if (isNull())
Node* const anchorNode = position.anchorNode();
if (!anchorNode)
return false;
LayoutObject* layoutObject = anchorNode()->layoutObject();
LayoutObject* layoutObject = anchorNode->layoutObject();
if (!layoutObject)
return false;
......@@ -509,34 +512,37 @@ bool PositionAlgorithm<Strategy>::isCandidate() const
// TODO(leviw) The condition should be
// m_anchorType == PositionAnchorType::BeforeAnchor, but for now we
// still need to support legacy positions.
return !m_offset && !isAfterAnchor() && !nodeIsUserSelectNone(Strategy::parent(*anchorNode()));
if (position.isAfterAnchor())
return false;
return !position.computeEditingOffset() && !nodeIsUserSelectNone(Strategy::parent(*anchorNode));
}
if (layoutObject->isText())
return !nodeIsUserSelectNone(anchorNode()) && inRenderedText(*this);
return !nodeIsUserSelectNone(anchorNode) && inRenderedText(position);
if (layoutObject->isSVG()) {
// We don't consider SVG elements are contenteditable except for
// associated layoutObject returns isText() true, e.g. LayoutSVGInlineText.
// associated |layoutObject| returns |isText()| true,
// e.g. |LayoutSVGInlineText|.
return false;
}
if (isRenderedHTMLTableElement(anchorNode()) || Strategy::editingIgnoresContent(anchorNode()))
return (atFirstEditingPositionForNode() || atLastEditingPositionForNode()) && !nodeIsUserSelectNone(Strategy::parent(*anchorNode()));
if (isRenderedHTMLTableElement(anchorNode) || Strategy::editingIgnoresContent(anchorNode))
return (position.atFirstEditingPositionForNode() || position.atLastEditingPositionForNode()) && !nodeIsUserSelectNone(Strategy::parent(*anchorNode));
if (isHTMLHtmlElement(*m_anchorNode))
if (isHTMLHtmlElement(*anchorNode))
return false;
if (layoutObject->isLayoutBlockFlow() || layoutObject->isFlexibleBox() || layoutObject->isLayoutGrid()) {
if (toLayoutBlock(layoutObject)->logicalHeight() || isHTMLBodyElement(*m_anchorNode)) {
if (toLayoutBlock(layoutObject)->logicalHeight() || isHTMLBodyElement(*anchorNode)) {
if (!hasRenderedNonAnonymousDescendantsWithHeight(layoutObject))
return atFirstEditingPositionForNode() && !nodeIsUserSelectNone(anchorNode());
return m_anchorNode->hasEditableStyle() && !nodeIsUserSelectNone(anchorNode()) && atEditingBoundary(*this);
return position.atFirstEditingPositionForNode() && !nodeIsUserSelectNone(anchorNode);
return anchorNode->hasEditableStyle() && !nodeIsUserSelectNone(anchorNode) && atEditingBoundary(position);
}
} else {
LocalFrame* frame = m_anchorNode->document().frame();
LocalFrame* frame = anchorNode->document().frame();
bool caretBrowsing = frame->settings() && frame->settings()->caretBrowsingEnabled();
return (caretBrowsing || m_anchorNode->hasEditableStyle()) && !nodeIsUserSelectNone(anchorNode()) && atEditingBoundary(*this);
return (caretBrowsing || anchorNode->hasEditableStyle()) && !nodeIsUserSelectNone(anchorNode) && atEditingBoundary(position);
}
return false;
......@@ -544,6 +550,16 @@ bool PositionAlgorithm<Strategy>::isCandidate() const
// TODO(yosin) We should move |inRenderedText()| to "VisibleUnits.h" for
// reduce dependency of |LayoutObject| in |Position| class.
bool isVisuallyEquivalentCandidate(const Position& position)
{
return isVisuallyEquivalentCandidateAlgorithm<EditingStrategy>(position);
}
bool isVisuallyEquivalentCandidate(const PositionInComposedTree& position)
{
return isVisuallyEquivalentCandidateAlgorithm<EditingInComposedTreeStrategy>(position);
}
template <typename Strategy>
static bool inRenderedTextAlgorithm(const PositionAlgorithm<Strategy>& position)
{
......
......@@ -187,8 +187,6 @@ public:
PositionAlgorithm<Strategy> upstream(EditingBoundaryCrossingRule = CannotCrossEditingBoundary) const;
PositionAlgorithm<Strategy> downstream(EditingBoundaryCrossingRule = CannotCrossEditingBoundary) const;
bool isCandidate() const;
static PositionAlgorithm<Strategy> beforeNode(Node* anchorNode);
static PositionAlgorithm<Strategy> afterNode(Node* anchorNode);
static PositionAlgorithm<Strategy> inParentBeforeNode(const Node& anchorNode);
......@@ -444,6 +442,11 @@ CORE_EXPORT bool inRenderedText(const PositionInComposedTree&);
CORE_EXPORT int uncheckedPreviousOffset(const Node*, int current);
CORE_EXPORT int uncheckedNextOffset(const Node*, int current);
// TODO(yosin) We should move |isVisuallyEquivalentCandidate()| to
// "VisibleUnits.cpp" to reduce |LayoutObject| dependency in "Position.cpp".
CORE_EXPORT bool isVisuallyEquivalentCandidate(const Position&);
CORE_EXPORT bool isVisuallyEquivalentCandidate(const PositionInComposedTree&);
} // namespace blink
#ifndef NDEBUG
......
......@@ -253,7 +253,7 @@ Position VisiblePosition::leftVisuallyDistinctCandidate() const
p = Position::editingPositionOf(layoutObject->node(), offset);
if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
if ((isVisuallyEquivalentCandidate(p) && p.downstream() != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
return p;
ASSERT(p != m_deepPosition);
......@@ -415,7 +415,7 @@ Position VisiblePosition::rightVisuallyDistinctCandidate() const
p = Position::editingPositionOf(layoutObject->node(), offset);
if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
if ((isVisuallyEquivalentCandidate(p) && p.downstream() != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
return p;
ASSERT(p != m_deepPosition);
......@@ -548,9 +548,9 @@ static PositionType canonicalizeCandidate(const PositionType& candidate)
{
if (candidate.isNull())
return PositionType();
ASSERT(candidate.isCandidate());
ASSERT(isVisuallyEquivalentCandidate(candidate));
PositionType upstream = candidate.upstream();
if (upstream.isCandidate())
if (isVisuallyEquivalentCandidate(upstream))
return upstream;
return candidate;
}
......@@ -582,10 +582,10 @@ static PositionType canonicalPosition(const PositionType& passedPosition)
Node* node = position.computeContainerNode();
PositionType candidate = position.upstream();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
return candidate;
candidate = position.downstream();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
return candidate;
// When neither upstream or downstream gets us to a candidate (upstream/downstream won't leave
......
......@@ -107,7 +107,7 @@ static Position previousRootInlineBoxCandidatePosition(Node* node, const Visible
Position pos = isHTMLBRElement(*previousNode) ? positionBeforeNode(previousNode) :
Position::editingPositionOf(previousNode, caretMaxOffset(previousNode));
if (pos.isCandidate())
if (isVisuallyEquivalentCandidate(pos))
return pos;
previousNode = previousLeafWithSameEditability(previousNode, editableType);
......@@ -129,7 +129,7 @@ static Position nextRootInlineBoxCandidatePosition(Node* node, const VisiblePosi
Position pos;
pos = Position::editingPositionOf(nextNode, caretMinOffset(nextNode));
if (pos.isCandidate())
if (isVisuallyEquivalentCandidate(pos))
return pos;
nextNode = nextLeafWithSameEditability(nextNode, editableType);
......@@ -1595,10 +1595,10 @@ bool rendersInDifferentPosition(const Position& position1, const Position& posit
return true;
}
if (isHTMLBRElement(*position1.anchorNode()) && position2.isCandidate())
if (isHTMLBRElement(*position1.anchorNode()) && isVisuallyEquivalentCandidate(position2))
return true;
if (isHTMLBRElement(*position2.anchorNode()) && position1.isCandidate())
if (isHTMLBRElement(*position2.anchorNode()) && isVisuallyEquivalentCandidate(position1))
return true;
if (!inSameContainingBlockFlowElement(position1.anchorNode(), position2.anchorNode()))
......
......@@ -184,7 +184,7 @@ void InsertParagraphSeparatorCommand::doApply()
// Use the leftmost candidate.
insertionPosition = insertionPosition.upstream();
if (!insertionPosition.isCandidate())
if (!isVisuallyEquivalentCandidate(insertionPosition))
insertionPosition = insertionPosition.downstream();
// Adjust the insertion position after the delete
......
......@@ -177,7 +177,7 @@ void InsertTextCommand::doApply()
deleteInsignificantText(startPosition, startPosition.downstream());
if (!startPosition.inDocument())
startPosition = positionBeforeStartNode;
if (!startPosition.isCandidate())
if (!isVisuallyEquivalentCandidate(startPosition))
startPosition = startPosition.downstream();
startPosition = positionAvoidingSpecialElementBoundary(startPosition);
......
......@@ -804,11 +804,11 @@ void LayoutView::commitPendingSelectionAlgorithm()
// and will fill the gap before 'bar'.
PositionType startPos = Strategy::selectionStart(selection);
PositionType candidate = startPos.downstream();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
startPos = candidate;
PositionType endPos = Strategy::selectionEnd(selection);
candidate = endPos.upstream();
if (candidate.isCandidate())
if (isVisuallyEquivalentCandidate(candidate))
endPos = candidate;
// We can get into a state where the selection endpoints map to the same VisiblePosition when a selection is deleted
......
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