Index: Source/core/editing/VisibleUnits.cpp |
diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp |
index 65353feb5cc9d42d40ab4bb5f92ab93931693fe0..4e63a99c2592c7c39ff47f8a9a83f44093885691 100644 |
--- a/Source/core/editing/VisibleUnits.cpp |
+++ b/Source/core/editing/VisibleUnits.cpp |
@@ -2359,6 +2359,31 @@ static VisiblePosition skipToEndOfEditingBoundary(const VisiblePosition& pos, co |
return firstEditableVisiblePositionAfterPositionInRoot(pos.deepEquivalent(), highestRoot); |
} |
+UChar32 characterAfter(const VisiblePosition& visiblePosition) |
+{ |
+ // We canonicalize to the first of two equivalent candidates, but the second |
+ // of the two candidates is the one that will be inside the text node |
+ // containing the character after this visible position. |
+ Position pos = mostForwardCaretPosition(visiblePosition.deepEquivalent()); |
+ if (!pos.isOffsetInAnchor()) |
+ return 0; |
+ Node* containerNode = pos.computeContainerNode(); |
+ if (!containerNode || !containerNode->isTextNode()) |
+ return 0; |
+ unsigned offset = static_cast<unsigned>(pos.offsetInContainerNode()); |
+ Text* textNode = toText(containerNode); |
+ unsigned length = textNode->length(); |
+ if (offset >= length) |
+ return 0; |
+ |
+ return textNode->data().characterStartingAt(offset); |
+} |
+ |
+UChar32 characterBefore(const VisiblePosition& visiblePosition) |
+{ |
+ return characterAfter(previousPositionOf(visiblePosition)); |
+} |
+ |
VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule) |
{ |
VisiblePosition next(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosition.affinity()); |