Commit fb2df3c9 authored by yosin@chromium.org's avatar yosin@chromium.org

Move character{After,Before}() for VisiblePosition to VisibleUnits.cpp

This patch moves |character{After,Before}()| for |VisiblePosition| to
"VisibleUnits.cpp" form "VisiblePosition.cpp" to make "VisiblePosition.cpp"
to simpler for improving code health and ease of templatizing |VisiblePosition|
class to introduce composed tree version.

This patch is a preparation of making selection to handle granularity for web
component, http://crrev.com/1277863002

BUG=513568

Review URL: https://codereview.chromium.org/1320233003

git-svn-id: svn://svn.chromium.org/blink/trunk@201519 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 5762fe51
...@@ -590,31 +590,6 @@ VisiblePosition visiblePositionOf(const PositionInComposedTree& position, TextAf ...@@ -590,31 +590,6 @@ VisiblePosition visiblePositionOf(const PositionInComposedTree& position, TextAf
return VisiblePosition::createWithoutCanonicalization(PositionWithAffinity(toPositionInDOMTree(canonicalized.position()), canonicalized.affinity())); return VisiblePosition::createWithoutCanonicalization(PositionWithAffinity(toPositionInDOMTree(canonicalized.position()), canonicalized.affinity()));
} }
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));
}
IntRect absoluteCaretBoundsOf(const VisiblePosition& visiblePosition) IntRect absoluteCaretBoundsOf(const VisiblePosition& visiblePosition)
{ {
LayoutObject* layoutObject; LayoutObject* layoutObject;
......
...@@ -131,11 +131,6 @@ VisiblePosition rightPositionOf(const VisiblePosition&); ...@@ -131,11 +131,6 @@ VisiblePosition rightPositionOf(const VisiblePosition&);
CORE_EXPORT Position canonicalPositionOf(const Position&); CORE_EXPORT Position canonicalPositionOf(const Position&);
CORE_EXPORT PositionInComposedTree canonicalPositionOf(const PositionInComposedTree&); CORE_EXPORT PositionInComposedTree canonicalPositionOf(const PositionInComposedTree&);
// TODO(yosin) We should move |characterAfter()| and |characterBefore()| to
// "VisibleUnits.cpp"
UChar32 characterAfter(const VisiblePosition&);
UChar32 characterBefore(const VisiblePosition&);
// TODO(yosin) We should move |honorEditingBoundaryAtOr{Before,After} to // TODO(yosin) We should move |honorEditingBoundaryAtOr{Before,After} to
// "VisibleUnits.cpp" as static function. // "VisibleUnits.cpp" as static function.
// next() and previous() will increment/decrement by a character cluster. // next() and previous() will increment/decrement by a character cluster.
......
...@@ -2359,6 +2359,31 @@ static VisiblePosition skipToEndOfEditingBoundary(const VisiblePosition& pos, co ...@@ -2359,6 +2359,31 @@ static VisiblePosition skipToEndOfEditingBoundary(const VisiblePosition& pos, co
return firstEditableVisiblePositionAfterPositionInRoot(pos.deepEquivalent(), highestRoot); 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 nextPositionOf(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule)
{ {
VisiblePosition next(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosition.affinity()); VisiblePosition next(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosition.affinity());
......
...@@ -85,6 +85,9 @@ CORE_EXPORT PositionInComposedTree mostForwardCaretPosition(const PositionInComp ...@@ -85,6 +85,9 @@ CORE_EXPORT PositionInComposedTree mostForwardCaretPosition(const PositionInComp
CORE_EXPORT bool isVisuallyEquivalentCandidate(const Position&); CORE_EXPORT bool isVisuallyEquivalentCandidate(const Position&);
CORE_EXPORT bool isVisuallyEquivalentCandidate(const PositionInComposedTree&); CORE_EXPORT bool isVisuallyEquivalentCandidate(const PositionInComposedTree&);
UChar32 characterAfter(const VisiblePosition&);
UChar32 characterBefore(const VisiblePosition&);
VisiblePosition nextPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary); VisiblePosition nextPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
VisiblePosition previousPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary); VisiblePosition previousPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment