| 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());
|
|
|