Commit 561c1b05 authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce composed tree version of previousPositionOf()

This patch introduces composed tree version of |previousPositionOf()|
by templatizing original |previousPositionOf()| to work both DOM tree
position and composed tree position version for introducing composed tree
version of |VisibleSelection| class.

This patch also templatizes |skipToStartOfEditingBoundary()| used by
|previousPositionOf()|.

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

BUG=513568
TEST=n/a; no behavior changes

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

git-svn-id: svn://svn.chromium.org/blink/trunk@201963 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1fb8eda1
......@@ -2976,7 +2976,8 @@ VisiblePositionInComposedTree nextPositionOf(const VisiblePositionInComposedTree
return nextPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePosition, rule);
}
static VisiblePosition skipToStartOfEditingBoundary(const VisiblePosition& pos, const Position& anchor)
template <typename Strategy>
static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const VisiblePositionTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
{
if (pos.isNull())
return pos;
......@@ -2991,22 +2992,23 @@ static VisiblePosition skipToStartOfEditingBoundary(const VisiblePosition& pos,
// If this is not editable but |pos| has an editable root, skip to the start
if (!highestRoot && highestRootOfPos)
return createVisiblePosition(previousVisuallyDistinctCandidate(Position(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnchoredEquivalent()));
return createVisiblePosition(previousVisuallyDistinctCandidate(PositionAlgorithm<Strategy>(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnchoredEquivalent()));
// That must mean that |pos| is not editable. Return the last position
// before |pos| that is in the same editable region as this position
return lastEditableVisiblePositionBeforePositionInRoot(pos.deepEquivalent(), highestRoot);
}
VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule)
template <typename Strategy>
static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule)
{
Position pos = previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent());
const PositionAlgorithm<Strategy> pos = previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent());
// return null visible position if there is no previous visible position
if (pos.atStartOfTree())
return VisiblePosition();
return VisiblePositionTemplate<Strategy>();
VisiblePosition prev = createVisiblePosition(pos);
const VisiblePositionTemplate<Strategy> prev = createVisiblePosition(pos);
ASSERT(prev.deepEquivalent() != visiblePosition.deepEquivalent());
#if ENABLE(ASSERT)
......@@ -3015,7 +3017,7 @@ VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
// never yield another |TextAffinity::Upstream position| (unless line wrap
// length is 0!).
if (prev.isNotNull() && visiblePosition.affinity() == TextAffinity::Upstream) {
ASSERT(inSameLine(PositionWithAffinity(prev.deepEquivalent()), PositionWithAffinity(prev.deepEquivalent(), TextAffinity::Upstream)));
ASSERT(inSameLine(PositionWithAffinityTemplate<Strategy>(prev.deepEquivalent()), PositionWithAffinityTemplate<Strategy>(prev.deepEquivalent(), TextAffinity::Upstream)));
}
#endif
......@@ -3032,4 +3034,14 @@ VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent());
}
VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule)
{
return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule);
}
VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposedTree& visiblePosition, EditingBoundaryCrossingRule rule)
{
return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePosition, rule);
}
} // namespace blink
......@@ -105,7 +105,8 @@ VisiblePosition rightPositionOf(const VisiblePosition&);
CORE_EXPORT VisiblePosition nextPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInComposedTree nextPositionOf(const VisiblePositionInComposedTree&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
VisiblePosition previousPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePosition previousPositionOf(const VisiblePosition&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposedTree&, EditingBoundaryCrossingRule = CanCrossEditingBoundary);
// words
CORE_EXPORT VisiblePosition startOfWord(const VisiblePosition&, EWordSide = RightWordIfOnBoundary);
......
......@@ -268,6 +268,47 @@ TEST_F(VisibleUnitsTest, nextPositionOf)
EXPECT_EQ(PositionInComposedTree(one->firstChild(), 1), nextPositionOf(createVisiblePosition(PositionInComposedTree(two, 2))).deepEquivalent());
}
TEST_F(VisibleUnitsTest, previousPositionOf)
{
const char* bodyContent = "<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b id=three>333</b>";
const char* shadowContent = "<b id=four>4444</b><content select=#two></content><content select=#one></content><b id=five>55555</b>";
setBodyContent(bodyContent);
RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent, "host");
updateLayoutAndStyleForPainting();
Node* zero = document().getElementById("zero")->firstChild();
Node* one = document().getElementById("one")->firstChild();
Node* two = document().getElementById("two")->firstChild();
Node* three = document().getElementById("three")->firstChild();
Node* four = shadowRoot->getElementById("four")->firstChild();
Node* five = shadowRoot->getElementById("five")->firstChild();
EXPECT_EQ(Position(zero, 0), previousPositionOf(createVisiblePosition(Position(zero, 1))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(zero, 0), previousPositionOf(createVisiblePosition(PositionInComposedTree(zero, 1))).deepEquivalent());
EXPECT_EQ(Position(zero, 1), previousPositionOf(createVisiblePosition(Position(one, 0))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(two, 1), previousPositionOf(createVisiblePosition(PositionInComposedTree(one, 0))).deepEquivalent());
EXPECT_EQ(Position(one, 0), previousPositionOf(createVisiblePosition(Position(one, 1))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(two, 2), previousPositionOf(createVisiblePosition(PositionInComposedTree(one, 1))).deepEquivalent());
EXPECT_EQ(Position(one, 0), previousPositionOf(createVisiblePosition(Position(two, 0))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(four, 3), previousPositionOf(createVisiblePosition(PositionInComposedTree(two, 0))).deepEquivalent());
// DOM tree to shadow tree
EXPECT_EQ(Position(two, 2), previousPositionOf(createVisiblePosition(Position(three, 0))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(five, 5), previousPositionOf(createVisiblePosition(PositionInComposedTree(three, 0))).deepEquivalent());
// Shadow tree to DOM tree
EXPECT_EQ(Position(), previousPositionOf(createVisiblePosition(Position(four, 0))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(zero, 1), previousPositionOf(createVisiblePosition(PositionInComposedTree(four, 0))).deepEquivalent());
// Note: Canonicalization maps (five, 0) to (four, 4) in DOM tree and
// (one, 1) in composed tree.
EXPECT_EQ(Position(four, 4), previousPositionOf(createVisiblePosition(Position(five, 1))).deepEquivalent());
EXPECT_EQ(PositionInComposedTree(one, 1), previousPositionOf(createVisiblePosition(PositionInComposedTree(five, 1))).deepEquivalent());
}
TEST_F(VisibleUnitsTest, rendersInDifferentPositionAfterAnchor)
{
const char* bodyContent = "<p id='sample'>00</p>";
......
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