Make PositionInComposedTree::downstream() to work properly
[chromium-blink-merge.git] / third_party / WebKit / Source / core / dom / PositionTest.cpp
blob1066408d451b4b1ac9d7dfb2d1c946ef583e2959
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.
5 #include "config.h"
6 #include "core/dom/Position.h"
8 #include "core/editing/EditingTestBase.h"
10 namespace blink {
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());
179 } // namespace blink