Commit 60138f88 authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce composed tree version of nextVisuallyDistinctCandidate()

This patch introduces composed tree version of |nextVisuallyDistinctCandidate()|
by templatizing function to share algorithm.

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

BUG=513568
TEST=webkit_unit_tests --gtest_filter=EditingUtilitiesTest.NextVisuallyDistinctCandidate

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

git-svn-id: svn://svn.chromium.org/blink/trunk@201130 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent bd21e58d
......@@ -360,24 +360,35 @@ PositionInComposedTree nextCandidate(const PositionInComposedTree& position)
// |nextVisuallyDistinctCandidate| is similar to |nextCandidate| except
// for returning position which |downstream()| not equal to initial position's
// |downstream()|.
Position nextVisuallyDistinctCandidate(const Position& position)
template <typename Strategy>
static PositionAlgorithm<Strategy> nextVisuallyDistinctCandidateAlgorithm(const PositionAlgorithm<Strategy>& position)
{
if (position.isNull())
return Position();
return PositionAlgorithm<Strategy>();
PositionIterator p(position);
Position downstreamStart = mostForwardCaretPosition(position);
PositionIteratorAlgorithm<Strategy> p(position);
const PositionAlgorithm<Strategy> downstreamStart = mostForwardCaretPosition(position);
p.increment();
while (!p.atEnd()) {
Position candidate = p.computePosition();
PositionAlgorithm<Strategy> candidate = p.computePosition();
if (isVisuallyEquivalentCandidate(candidate) && mostForwardCaretPosition(candidate) != downstreamStart)
return candidate;
p.increment();
}
return Position();
return PositionAlgorithm<Strategy>();
}
Position nextVisuallyDistinctCandidate(const Position& position)
{
return nextVisuallyDistinctCandidateAlgorithm<EditingStrategy>(position);
}
PositionInComposedTree nextVisuallyDistinctCandidate(const PositionInComposedTree& position)
{
return nextVisuallyDistinctCandidateAlgorithm<EditingInComposedTreeStrategy>(position);
}
template <typename Strategy>
......
......@@ -162,7 +162,8 @@ PositionInComposedTree nextCandidate(const PositionInComposedTree&);
Position previousCandidate(const Position&);
PositionInComposedTree previousCandidate(const PositionInComposedTree&);
Position nextVisuallyDistinctCandidate(const Position&);
CORE_EXPORT Position nextVisuallyDistinctCandidate(const Position&);
CORE_EXPORT PositionInComposedTree nextVisuallyDistinctCandidate(const PositionInComposedTree&);
Position previousVisuallyDistinctCandidate(const Position&);
PositionInComposedTree previousVisuallyDistinctCandidate(const PositionInComposedTree&);
......
......@@ -25,4 +25,19 @@ TEST_F(EditingUtilitiesTest, NextNodeIndex)
EXPECT_EQ(PositionInComposedTree(host, 1), nextPositionOf(PositionInComposedTree(two, 2), PositionMoveType::CodePoint));
}
TEST_F(EditingUtilitiesTest, NextVisuallyDistinctCandidate)
{
const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</b><b id='three'>33</b></p>";
const char* shadowContent = "<content select=#two></content><content select=#one></content><content select=#three></content>";
setBodyContent(bodyContent);
setShadowContent(shadowContent);
updateLayoutAndStyleForPainting();
Node* one = document().getElementById("one");
Node* two = document().getElementById("two");
Node* three = document().getElementById("three");
EXPECT_EQ(Position(two->firstChild(), 1), nextVisuallyDistinctCandidate(Position(one, 1)));
EXPECT_EQ(PositionInComposedTree(three->firstChild(), 1), nextVisuallyDistinctCandidate(PositionInComposedTree(one, 1)));
}
} // namespace blink
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