Index: Source/core/dom/Position.cpp |
diff --git a/Source/core/dom/Position.cpp b/Source/core/dom/Position.cpp |
index 023359bf78dc21f83061e1a2a402e88f38cd055c..4226e3fefaa930f226bfe18daff66ec23fafe69b 100644 |
--- a/Source/core/dom/Position.cpp |
+++ b/Source/core/dom/Position.cpp |
@@ -231,6 +231,14 @@ Position Position::parentAnchoredEquivalent() const |
return Position(containerNode(), computeOffsetInContainerNode(), PositionIsOffsetInAnchor); |
} |
+Position Position::toOffsetInAnchor() const |
+{ |
+ if (isNull()) |
+ return Position(); |
+ |
+ return Position(containerNode(), computeOffsetInContainerNode(), Position::PositionIsOffsetInAnchor); |
+} |
+ |
Node* Position::computeNodeBeforePosition() const |
{ |
if (!m_anchorNode) |
@@ -272,6 +280,34 @@ Node* Position::computeNodeAfterPosition() const |
return 0; |
} |
+// An implementation of |Range::firstNode()|. |
+Node* Position::nodeAsRangeFirstNode() const |
+{ |
+ ASSERT(m_anchorType == PositionIsOffsetInAnchor); |
+ if (!m_anchorNode) |
+ return nullptr; |
+ if (m_anchorNode->offsetInCharacters()) |
+ return m_anchorNode.get(); |
+ if (Node* child = NodeTraversal::childAt(*m_anchorNode, m_offset)) |
+ return child; |
+ if (!m_offset) |
+ return m_anchorNode.get(); |
+ return NodeTraversal::nextSkippingChildren(*m_anchorNode); |
+} |
+ |
+// An implementation of |Range::pastLastNode()|. |
+Node* Position::nodeAsRangePastLastNode() const |
+{ |
+ ASSERT(m_anchorType == PositionIsOffsetInAnchor); |
+ if (!m_anchorNode) |
+ return nullptr; |
+ if (m_anchorNode->offsetInCharacters()) |
+ return NodeTraversal::nextSkippingChildren(*m_anchorNode); |
+ if (Node* child = NodeTraversal::childAt(*m_anchorNode, m_offset)) |
+ return child; |
+ return NodeTraversal::nextSkippingChildren(*m_anchorNode); |
+} |
+ |
Position::AnchorType Position::anchorTypeForLegacyEditingPosition(Node* anchorNode, int offset) |
{ |
if (anchorNode && editingIgnoresContent(anchorNode)) { |