| Index: Source/core/editing/Position.cpp
|
| diff --git a/Source/core/editing/Position.cpp b/Source/core/editing/Position.cpp
|
| index 6935d5d4597b37a658904a87ed5fd5cad98d3c13..6eb0101889e9ce8bfbc4355e538e46ca32c77d02 100644
|
| --- a/Source/core/editing/Position.cpp
|
| +++ b/Source/core/editing/Position.cpp
|
| @@ -619,9 +619,19 @@ bool inRenderedText(const PositionInComposedTree& position)
|
| }
|
|
|
| template <typename Strategy>
|
| -InlineBoxPosition PositionAlgorithm<Strategy>::computeInlineBoxPosition(TextAffinity affinity) const
|
| +static InlineBoxPosition computeInlineBoxPositionAlgorithm(const PositionAlgorithm<Strategy>& position, TextAffinity affinity)
|
| {
|
| - return computeInlineBoxPosition(affinity, primaryDirectionOf(*anchorNode()));
|
| + return computeInlineBoxPositionAlgorithm<Strategy>(position, affinity, primaryDirectionOf(*position.anchorNode()));
|
| +}
|
| +
|
| +InlineBoxPosition computeInlineBoxPosition(const Position& position, TextAffinity affinity)
|
| +{
|
| + return computeInlineBoxPositionAlgorithm<EditingStrategy>(position, affinity);
|
| +}
|
| +
|
| +InlineBoxPosition computeInlineBoxPosition(const PositionInComposedTree& position, TextAffinity affinity)
|
| +{
|
| + return computeInlineBoxPositionAlgorithm<EditingInComposedTreeStrategy>(position, affinity);
|
| }
|
|
|
| static bool isNonTextLeafChild(LayoutObject* object)
|
| @@ -683,28 +693,28 @@ PositionAlgorithm<Strategy> upstreamIgnoringEditingBoundaries(PositionAlgorithm<
|
| }
|
|
|
| template <typename Strategy>
|
| -InlineBoxPosition PositionAlgorithm<Strategy>::computeInlineBoxPosition(TextAffinity affinity, TextDirection primaryDirection) const
|
| +static InlineBoxPosition computeInlineBoxPositionAlgorithm(const PositionAlgorithm<Strategy>& position, TextAffinity affinity, TextDirection primaryDirection)
|
| {
|
| InlineBox* inlineBox = nullptr;
|
| - int caretOffset = computeEditingOffset();
|
| - LayoutObject* layoutObject = m_anchorNode->isShadowRoot() ? toShadowRoot(m_anchorNode)->host()->layoutObject() : m_anchorNode->layoutObject();
|
| + int caretOffset = position.computeEditingOffset();
|
| + Node* const anchorNode = position.anchorNode();
|
| + LayoutObject* layoutObject = anchorNode->isShadowRoot() ? toShadowRoot(anchorNode)->host()->layoutObject() : anchorNode->layoutObject();
|
|
|
| if (!layoutObject->isText()) {
|
| inlineBox = 0;
|
| - if (canHaveChildrenForEditing(anchorNode()) && layoutObject->isLayoutBlockFlow() && hasRenderedNonAnonymousDescendantsWithHeight(layoutObject)) {
|
| + if (canHaveChildrenForEditing(anchorNode) && layoutObject->isLayoutBlockFlow() && hasRenderedNonAnonymousDescendantsWithHeight(layoutObject)) {
|
| // Try a visually equivalent position with possibly opposite
|
| // editability. This helps in case |this| is in an editable block
|
| // but surrounded by non-editable positions. It acts to negate the
|
| // logic at the beginning of LayoutObject::createVisiblePosition().
|
| - PositionAlgorithm<Strategy> thisPosition = PositionAlgorithm<Strategy>(*this);
|
| - PositionAlgorithm<Strategy> equivalent = downstreamIgnoringEditingBoundaries(thisPosition);
|
| - if (equivalent == thisPosition) {
|
| - equivalent = upstreamIgnoringEditingBoundaries(thisPosition);
|
| - if (equivalent == thisPosition || downstreamIgnoringEditingBoundaries(equivalent) == thisPosition)
|
| + PositionAlgorithm<Strategy> equivalent = downstreamIgnoringEditingBoundaries(position);
|
| + if (equivalent == position) {
|
| + equivalent = upstreamIgnoringEditingBoundaries(position);
|
| + if (equivalent == position || downstreamIgnoringEditingBoundaries(equivalent) == position)
|
| return InlineBoxPosition(inlineBox, caretOffset);
|
| }
|
|
|
| - return equivalent.computeInlineBoxPosition(TextAffinity::Upstream, primaryDirection);
|
| + return computeInlineBoxPosition(equivalent, TextAffinity::Upstream, primaryDirection);
|
| }
|
| if (layoutObject->isBox()) {
|
| inlineBox = toLayoutBox(layoutObject)->inlineBoxWrapper();
|
| @@ -848,6 +858,16 @@ InlineBoxPosition PositionAlgorithm<Strategy>::computeInlineBoxPosition(TextAffi
|
| return InlineBoxPosition(inlineBox, inlineBox->caretRightmostOffset());
|
| }
|
|
|
| +InlineBoxPosition computeInlineBoxPosition(const Position& position, TextAffinity affinity, TextDirection primaryDirection)
|
| +{
|
| + return computeInlineBoxPositionAlgorithm<EditingStrategy>(position, affinity, primaryDirection);
|
| +}
|
| +
|
| +InlineBoxPosition computeInlineBoxPosition(const PositionInComposedTree& position, TextAffinity affinity, TextDirection primaryDirection)
|
| +{
|
| + return computeInlineBoxPositionAlgorithm<EditingInComposedTreeStrategy>(position, affinity, primaryDirection);
|
| +}
|
| +
|
| template <typename Strategy>
|
| void PositionAlgorithm<Strategy>::debugPosition(const char* msg) const
|
| {
|
|
|