Index: Source/core/editing/VisibleUnits.cpp |
diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp |
index 0feccec2f599e5a704cc678dbd444562b1ea1efb..f0ec0cc048206ca8863a056b3164af66639b75d5 100644 |
--- a/Source/core/editing/VisibleUnits.cpp |
+++ b/Source/core/editing/VisibleUnits.cpp |
@@ -1393,18 +1393,19 @@ VisiblePosition startOfParagraph(const VisiblePosition& c, EditingBoundaryCrossi |
return createVisiblePosition(Position(node, type)); |
} |
-VisiblePosition endOfParagraph(const VisiblePosition& c, EditingBoundaryCrossingRule boundaryCrossingRule) |
+template <typename Strategy> |
+static VisiblePositionTemplate<Strategy> endOfParagraphAlgorithm(const VisiblePositionTemplate<Strategy>& c, EditingBoundaryCrossingRule boundaryCrossingRule) |
{ |
if (c.isNull()) |
- return VisiblePosition(); |
+ return VisiblePositionTemplate<Strategy>(); |
- Position p = c.deepEquivalent(); |
+ const PositionAlgorithm<Strategy> p = c.deepEquivalent(); |
Node* startNode = p.anchorNode(); |
if (isRenderedAsNonInlineTableImageOrHR(startNode)) |
- return createVisiblePosition(positionAfterNode(startNode)); |
+ return createVisiblePosition(PositionAlgorithm<Strategy>::afterNode(startNode)); |
- Element* startBlock = enclosingBlock(startNode); |
+ Element* startBlock = enclosingBlock(PositionAlgorithm<Strategy>::firstPositionInOrBeforeNode(startNode), CannotCrossEditingBoundary); |
Element* stayInsideBlock = startBlock; |
Node* node = startNode; |
@@ -1419,19 +1420,19 @@ VisiblePosition endOfParagraph(const VisiblePosition& c, EditingBoundaryCrossing |
break; |
if (boundaryCrossingRule == CanSkipOverEditingBoundary) { |
while (n && n->hasEditableStyle() != startNodeIsEditable) |
- n = NodeTraversal::next(*n, stayInsideBlock); |
+ n = Strategy::next(*n, stayInsideBlock); |
if (!n || !n->isDescendantOf(highestRoot)) |
break; |
} |
LayoutObject* r = n->layoutObject(); |
if (!r) { |
- n = NodeTraversal::next(*n, stayInsideBlock); |
+ n = Strategy::next(*n, stayInsideBlock); |
continue; |
} |
const ComputedStyle& style = r->styleRef(); |
if (style.visibility() != VISIBLE) { |
- n = NodeTraversal::next(*n, stayInsideBlock); |
+ n = Strategy::next(*n, stayInsideBlock); |
continue; |
} |
@@ -1448,25 +1449,35 @@ VisiblePosition endOfParagraph(const VisiblePosition& c, EditingBoundaryCrossing |
int o = n == startNode ? offset : 0; |
for (int i = o; i < length; ++i) { |
if ((*text)[i] == '\n') |
- return createVisiblePosition(Position(toText(n), i)); |
+ return createVisiblePosition(PositionAlgorithm<Strategy>(toText(n), i)); |
} |
} |
node = n; |
offset = r->caretMaxOffset(); |
- n = NodeTraversal::next(*n, stayInsideBlock); |
- } else if (editingIgnoresContent(n) || isRenderedTableElement(n)) { |
+ n = Strategy::next(*n, stayInsideBlock); |
+ } else if (Strategy::editingIgnoresContent(n) || isRenderedTableElement(n)) { |
node = n; |
type = PositionAnchorType::AfterAnchor; |
- n = NodeTraversal::nextSkippingChildren(*n, stayInsideBlock); |
+ n = Strategy::nextSkippingChildren(*n, stayInsideBlock); |
} else { |
- n = NodeTraversal::next(*n, stayInsideBlock); |
+ n = Strategy::next(*n, stayInsideBlock); |
} |
} |
if (type == PositionAnchorType::OffsetInAnchor) |
- return createVisiblePosition(Position(node, offset)); |
+ return createVisiblePosition(PositionAlgorithm<Strategy>(node, offset)); |
- return createVisiblePosition(Position(node, type)); |
+ return createVisiblePosition(PositionAlgorithm<Strategy>(node, type)); |
+} |
+ |
+VisiblePosition endOfParagraph(const VisiblePosition& c, EditingBoundaryCrossingRule boundaryCrossingRule) |
+{ |
+ return endOfParagraphAlgorithm<EditingStrategy>(c, boundaryCrossingRule); |
+} |
+ |
+VisiblePositionInComposedTree endOfParagraph(const VisiblePositionInComposedTree& c, EditingBoundaryCrossingRule boundaryCrossingRule) |
+{ |
+ return endOfParagraphAlgorithm<EditingInComposedTreeStrategy>(c, boundaryCrossingRule); |
} |
// FIXME: isStartOfParagraph(startOfNextParagraph(pos)) is not always true |