Commit 9277338a authored by yosin@chromium.org's avatar yosin@chromium.org

Move a member function inRenderedText() out from PositionAlgorithm template class

This patch moves |inRenderedText()| out from |PositionAlgorithm| template class
as a preparation of moving |inRenderedText()| to "VisibileUnits.cpp" to reduce
dependency of |LayoutObject| in "Position.cpp" for improving code health.

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

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

git-svn-id: svn://svn.chromium.org/blink/trunk@200890 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 55a4e0c3
...@@ -592,7 +592,7 @@ bool PositionAlgorithm<Strategy>::isCandidate() const ...@@ -592,7 +592,7 @@ bool PositionAlgorithm<Strategy>::isCandidate() const
} }
if (layoutObject->isText()) if (layoutObject->isText())
return !nodeIsUserSelectNone(anchorNode()) && inRenderedText(); return !nodeIsUserSelectNone(anchorNode()) && inRenderedText(*this);
if (layoutObject->isSVG()) { if (layoutObject->isSVG()) {
// We don't consider SVG elements are contenteditable except for // We don't consider SVG elements are contenteditable except for
...@@ -621,33 +621,47 @@ bool PositionAlgorithm<Strategy>::isCandidate() const ...@@ -621,33 +621,47 @@ bool PositionAlgorithm<Strategy>::isCandidate() const
return false; return false;
} }
// TODO(yosin) We should move |inRenderedText()| to "VisibleUnits.h" for
// reduce dependency of |LayoutObject| in |Position| class.
template <typename Strategy> template <typename Strategy>
bool PositionAlgorithm<Strategy>::inRenderedText() const static bool inRenderedTextAlgorithm(const PositionAlgorithm<Strategy>& position)
{ {
if (isNull() || !anchorNode()->isTextNode()) Node* const anchorNode = position.anchorNode();
if (!anchorNode || !anchorNode->isTextNode())
return false; return false;
LayoutObject* layoutObject = anchorNode()->layoutObject(); LayoutObject* layoutObject = anchorNode->layoutObject();
if (!layoutObject) if (!layoutObject)
return false; return false;
const int offsetInNode = position.computeEditingOffset();
LayoutText* textLayoutObject = toLayoutText(layoutObject); LayoutText* textLayoutObject = toLayoutText(layoutObject);
for (InlineTextBox *box = textLayoutObject->firstTextBox(); box; box = box->nextTextBox()) { for (InlineTextBox *box = textLayoutObject->firstTextBox(); box; box = box->nextTextBox()) {
if (m_offset < static_cast<int>(box->start()) && !textLayoutObject->containsReversedText()) { if (offsetInNode < static_cast<int>(box->start()) && !textLayoutObject->containsReversedText()) {
// The offset we're looking for is before this node // The offset we're looking for is before this node
// this means the offset must be in content that is // this means the offset must be in content that is
// not laid out. Return false. // not laid out. Return false.
return false; return false;
} }
if (box->containsCaretOffset(m_offset)) { if (box->containsCaretOffset(offsetInNode)) {
// Return false for offsets inside composed characters. // Return false for offsets inside composed characters.
return m_offset == 0 || m_offset == textLayoutObject->nextOffset(textLayoutObject->previousOffset(m_offset)); return offsetInNode == 0 || offsetInNode == textLayoutObject->nextOffset(textLayoutObject->previousOffset(offsetInNode));
} }
} }
return false; return false;
} }
bool inRenderedText(const Position& position)
{
return inRenderedTextAlgorithm<EditingStrategy>(position);
}
bool inRenderedText(const PositionInComposedTree& position)
{
return inRenderedTextAlgorithm<EditingInComposedTreeStrategy>(position);
}
bool isRenderedCharacter(const Position& position) bool isRenderedCharacter(const Position& position)
{ {
if (position.isNull()) if (position.isNull())
......
...@@ -191,7 +191,6 @@ public: ...@@ -191,7 +191,6 @@ public:
PositionAlgorithm<Strategy> downstream(EditingBoundaryCrossingRule = CannotCrossEditingBoundary) const; PositionAlgorithm<Strategy> downstream(EditingBoundaryCrossingRule = CannotCrossEditingBoundary) const;
bool isCandidate() const; bool isCandidate() const;
bool inRenderedText() const;
InlineBoxPosition computeInlineBoxPosition(TextAffinity) const; InlineBoxPosition computeInlineBoxPosition(TextAffinity) const;
InlineBoxPosition computeInlineBoxPosition(TextAffinity, TextDirection primaryDirection) const; InlineBoxPosition computeInlineBoxPosition(TextAffinity, TextDirection primaryDirection) const;
...@@ -448,6 +447,11 @@ inline PositionInComposedTree fromPositionInDOMTree<EditingInComposedTreeStrateg ...@@ -448,6 +447,11 @@ inline PositionInComposedTree fromPositionInDOMTree<EditingInComposedTreeStrateg
// to "VisibleUnits.cpp" to reduce |LayoutObject| dependency in "Position.cpp" // to "VisibleUnits.cpp" to reduce |LayoutObject| dependency in "Position.cpp"
bool hasRenderedNonAnonymousDescendantsWithHeight(LayoutObject*); bool hasRenderedNonAnonymousDescendantsWithHeight(LayoutObject*);
// TODO(yosin) We should move |inRenderedText()| to "VisibleUnits.h" for
// reduce dependency of |LayoutObject| in |Position| class.
CORE_EXPORT bool inRenderedText(const Position&);
CORE_EXPORT bool inRenderedText(const PositionInComposedTree&);
} // namespace blink } // namespace blink
#ifndef NDEBUG #ifndef NDEBUG
......
...@@ -1559,10 +1559,10 @@ bool rendersInDifferentPosition(const Position& position1, const Position& posit ...@@ -1559,10 +1559,10 @@ bool rendersInDifferentPosition(const Position& position1, const Position& posit
if (!inSameContainingBlockFlowElement(position1.anchorNode(), position2.anchorNode())) if (!inSameContainingBlockFlowElement(position1.anchorNode(), position2.anchorNode()))
return true; return true;
if (position1.anchorNode()->isTextNode() && !position1.inRenderedText()) if (position1.anchorNode()->isTextNode() && !inRenderedText(position1))
return false; return false;
if (position2.anchorNode()->isTextNode() && !position2.inRenderedText()) if (position2.anchorNode()->isTextNode() && !inRenderedText(position2))
return false; return false;
const int renderedOffset1 = renderedOffsetOf(position1); const int renderedOffset1 = renderedOffsetOf(position1);
......
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