1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "core/dom/Position.h"
8 #include "core/editing/EditingTestBase.h"
12 class PositionTest
: public EditingTestBase
{
15 TEST_F(PositionTest
, downstreamAfterAnchor
)
17 const char* bodyContent
= "<p id='host'><b id='one'>1</b></p><b id='two'>22</b>";
18 const char* shadowContent
= "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>";
19 setBodyContent(bodyContent
);
20 setShadowContent(shadowContent
);
21 updateLayoutAndStyleForPainting();
23 RefPtrWillBeRawPtr
<Element
> host
= document().getElementById("host");
25 EXPECT_EQ(Position::lastPositionInNode(host
.get()), Position::afterNode(host
.get()).downstream());
26 EXPECT_EQ(PositionInComposedTree::lastPositionInNode(host
.get()), PositionInComposedTree::afterNode(host
.get()).downstream());
29 TEST_F(PositionTest
, NextNodeIndex
)
31 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</p>";
32 const char* shadowContent
= "<content select=#two></content><content select=#one></content>";
33 setBodyContent(bodyContent
);
34 setShadowContent(shadowContent
);
35 Node
* host
= document().getElementById("host");
36 Node
* two
= document().getElementById("two");
38 EXPECT_EQ(Position(host
, 3), Position(two
, 2).next());
39 EXPECT_EQ(PositionInComposedTree(host
, 1), PositionInComposedTree(two
, 2).next());
42 TEST_F(PositionTest
, NodeAsRangeLastNodeNull
)
44 EXPECT_EQ(nullptr, Position().nodeAsRangeLastNode());
45 EXPECT_EQ(nullptr, PositionInComposedTree().nodeAsRangeLastNode());
48 TEST_F(PositionTest
, NodeAsRangeLastNode
)
50 const char* bodyContent
= "<p id='p1'>11</p><p id='p2'></p><p id='p3'>33</p>";
51 setBodyContent(bodyContent
);
52 Node
* p1
= document().getElementById("p1");
53 Node
* p2
= document().getElementById("p2");
54 Node
* p3
= document().getElementById("p3");
55 Node
* body
= EditingStrategy::parent(*p1
);
56 Node
* t1
= EditingStrategy::firstChild(*p1
);
57 Node
* t3
= EditingStrategy::firstChild(*p3
);
59 EXPECT_EQ(body
, Position::inParentBeforeNode(*p1
).nodeAsRangeLastNode());
60 EXPECT_EQ(t1
, Position::inParentBeforeNode(*p2
).nodeAsRangeLastNode());
61 EXPECT_EQ(p2
, Position::inParentBeforeNode(*p3
).nodeAsRangeLastNode());
62 EXPECT_EQ(t1
, Position::inParentAfterNode(*p1
).nodeAsRangeLastNode());
63 EXPECT_EQ(p2
, Position::inParentAfterNode(*p2
).nodeAsRangeLastNode());
64 EXPECT_EQ(t3
, Position::inParentAfterNode(*p3
).nodeAsRangeLastNode());
65 EXPECT_EQ(t3
, Position::afterNode(p3
).nodeAsRangeLastNode());
67 EXPECT_EQ(body
, PositionInComposedTree::inParentBeforeNode(*p1
).nodeAsRangeLastNode());
68 EXPECT_EQ(t1
, PositionInComposedTree::inParentBeforeNode(*p2
).nodeAsRangeLastNode());
69 EXPECT_EQ(p2
, PositionInComposedTree::inParentBeforeNode(*p3
).nodeAsRangeLastNode());
70 EXPECT_EQ(t1
, PositionInComposedTree::inParentAfterNode(*p1
).nodeAsRangeLastNode());
71 EXPECT_EQ(p2
, PositionInComposedTree::inParentAfterNode(*p2
).nodeAsRangeLastNode());
72 EXPECT_EQ(t3
, PositionInComposedTree::inParentAfterNode(*p3
).nodeAsRangeLastNode());
73 EXPECT_EQ(t3
, PositionInComposedTree::afterNode(p3
).nodeAsRangeLastNode());
76 TEST_F(PositionTest
, NodeAsRangeLastNodeShadow
)
78 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</p>";
79 const char* shadowContent
= "<a id='a'><content select=#two></content><content select=#one></content></a>";
80 setBodyContent(bodyContent
);
81 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
83 Node
* host
= document().getElementById("host");
84 Node
* n1
= document().getElementById("one");
85 Node
* n2
= document().getElementById("two");
86 Node
* t0
= EditingStrategy::firstChild(*host
);
87 Node
* t1
= EditingStrategy::firstChild(*n1
);
88 Node
* t2
= EditingStrategy::firstChild(*n2
);
89 Node
* t3
= EditingStrategy::lastChild(*host
);
90 Node
* a
= shadowRoot
->getElementById("a");
92 EXPECT_EQ(t0
, Position::inParentBeforeNode(*n1
).nodeAsRangeLastNode());
93 EXPECT_EQ(t1
, Position::inParentBeforeNode(*n2
).nodeAsRangeLastNode());
94 EXPECT_EQ(t1
, Position::inParentAfterNode(*n1
).nodeAsRangeLastNode());
95 EXPECT_EQ(t2
, Position::inParentAfterNode(*n2
).nodeAsRangeLastNode());
96 EXPECT_EQ(t3
, Position::afterNode(host
).nodeAsRangeLastNode());
98 EXPECT_EQ(t2
, PositionInComposedTree::inParentBeforeNode(*n1
).nodeAsRangeLastNode());
99 EXPECT_EQ(a
, PositionInComposedTree::inParentBeforeNode(*n2
).nodeAsRangeLastNode());
100 EXPECT_EQ(t1
, PositionInComposedTree::inParentAfterNode(*n1
).nodeAsRangeLastNode());
101 EXPECT_EQ(t2
, PositionInComposedTree::inParentAfterNode(*n2
).nodeAsRangeLastNode());
102 EXPECT_EQ(t1
, PositionInComposedTree::afterNode(host
).nodeAsRangeLastNode());
105 TEST_F(PositionTest
, ToPositionInComposedTreeWithActiveInsertionPoint
)
107 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b>22</p>";
108 const char* shadowContent
= "<a id='a'><content select=#one id='content'></content><content></content></a>";
109 setBodyContent(bodyContent
);
110 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
111 RefPtrWillBeRawPtr
<Element
> anchor
= shadowRoot
->getElementById("a");
113 EXPECT_EQ(positionInComposedTree(*anchor
, 0), toPositionInComposedTree(positionInDOMTree(*anchor
, 0)));
114 EXPECT_EQ(positionInComposedTree(*anchor
, 1), toPositionInComposedTree(positionInDOMTree(*anchor
, 1)));
115 EXPECT_EQ(PositionInComposedTree(anchor
, PositionAnchorType::AfterChildren
), toPositionInComposedTree(positionInDOMTree(*anchor
, 2)));
118 TEST_F(PositionTest
, ToPositionInComposedTreeWithInactiveInsertionPoint
)
120 const char* bodyContent
= "<p id='p'><content></content></p>";
121 setBodyContent(bodyContent
);
122 RefPtrWillBeRawPtr
<Element
> anchor
= document().getElementById("p");
124 EXPECT_EQ(positionInComposedTree(*anchor
, 0), toPositionInComposedTree(positionInDOMTree(*anchor
, 0)));
125 EXPECT_EQ(PositionInComposedTree(anchor
, PositionAnchorType::AfterChildren
), toPositionInComposedTree(positionInDOMTree(*anchor
, 1)));
128 TEST_F(PositionTest
, ToPositionInComposedTreeWithShadowRoot
)
130 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b>22</p>";
131 const char* shadowContent
= "<a><content select=#one></content></a>";
132 setBodyContent(bodyContent
);
133 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
134 RefPtrWillBeRawPtr
<Element
> host
= document().getElementById("host");
136 EXPECT_EQ(positionInComposedTree(*host
, 0), toPositionInComposedTree(positionInDOMTree(*shadowRoot
, 0)));
137 EXPECT_EQ(PositionInComposedTree(host
, PositionAnchorType::AfterChildren
), toPositionInComposedTree(positionInDOMTree(*shadowRoot
, 1)));
140 TEST_F(PositionTest
, ToPositionInComposedTreeWithShadowRootContainingSingleContent
)
142 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b>22</p>";
143 const char* shadowContent
= "<content select=#one></content>";
144 setBodyContent(bodyContent
);
145 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
146 RefPtrWillBeRawPtr
<Element
> host
= document().getElementById("host");
148 EXPECT_EQ(positionInComposedTree(*host
, 0), toPositionInComposedTree(positionInDOMTree(*shadowRoot
, 0)));
149 EXPECT_EQ(PositionInComposedTree(host
, PositionAnchorType::AfterChildren
), toPositionInComposedTree(positionInDOMTree(*shadowRoot
, 1)));
152 TEST_F(PositionTest
, ToPositionInComposedTreeWithEmptyShadowRoot
)
154 const char* bodyContent
= "<p id='host'>00<b id='one'>11</b>22</p>";
155 const char* shadowContent
= "";
156 setBodyContent(bodyContent
);
157 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
158 RefPtrWillBeRawPtr
<Element
> host
= document().getElementById("host");
160 EXPECT_EQ(PositionInComposedTree(host
, PositionAnchorType::AfterChildren
), toPositionInComposedTree(positionInDOMTree(*shadowRoot
, 0)));
163 TEST_F(PositionTest
, upstreamAfterAnchor
)
165 const char* bodyContent
= "<p id='host'><b id='one'>1</b></p>";
166 const char* shadowContent
= "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>";
167 setBodyContent(bodyContent
);
168 RefPtrWillBeRawPtr
<ShadowRoot
> shadowRoot
= setShadowContent(shadowContent
);
169 updateLayoutAndStyleForPainting();
171 RefPtrWillBeRawPtr
<Element
> host
= document().getElementById("host");
172 RefPtrWillBeRawPtr
<Element
> one
= document().getElementById("one");
173 RefPtrWillBeRawPtr
<Element
> three
= shadowRoot
->getElementById("three");
175 EXPECT_EQ(Position(one
->firstChild(), 1), Position::afterNode(host
.get()).upstream());
176 EXPECT_EQ(PositionInComposedTree(three
->firstChild(), 3), PositionInComposedTree::afterNode(host
.get()).upstream());