| Index: Source/core/editing/Position.cpp
|
| diff --git a/Source/core/editing/Position.cpp b/Source/core/editing/Position.cpp
|
| index d35a8427071725f9284d88b25ff914c3b2da6f2d..635cc65accb70b160bb612c63ddae4d901c7af88 100644
|
| --- a/Source/core/editing/Position.cpp
|
| +++ b/Source/core/editing/Position.cpp
|
| @@ -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)
|
| {
|
|
|