Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: third_party/WebKit/Source/core/editing/EphemeralRangeTest.cpp

Issue 2251703002: Introduce EphemeralRange::nodes() helper to traverse over a range. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missing test file. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
tkent 2016/08/17 02:05:02 2015 -> 2016
Andrey Kraynov 2016/08/17 09:58:16 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/editing/EphemeralRange.h"
6
7 #include "core/dom/Range.h"
8 #include "core/editing/EditingTestBase.h"
9 #include <sstream>
10
11 namespace blink {
12
13 namespace {
14
15 class EphemeralRangeTest : public EditingTestBase {
16 protected:
17 template <typename Traversal>
18 std::string traverseRange(Range*) const;
19
20 template <typename Strategy>
21 std::string traverseRange(const EphemeralRangeTemplate<Strategy>&) const;
22
23 template <typename Strategy>
24 std::string traverseRange(const PositionTemplate<Strategy>&, const PositionT emplate<Strategy>&) const;
25
26 Range* getBodyRange() const;
27 };
28
29 template <typename Traversal = NodeTraversal>
30 std::string EphemeralRangeTest::traverseRange(Range* range) const
31 {
32 std::stringstream nodesContent;
33 for (Node* node = range->firstNode(); node != range->pastLastNode(); node = Traversal::next(*node)) {
34 nodesContent << "[" << *node << "]";
35 }
36
37 return nodesContent.str();
38 }
39
40 template <typename Strategy>
41 std::string EphemeralRangeTest::traverseRange(const EphemeralRangeTemplate<Strat egy>& range) const
42 {
43 std::stringstream nodesContent;
44 for (Node& node : inRange(range)) {
45 nodesContent << "[" << node << "]";
46 }
47
48 return nodesContent.str();
49 }
50
51 template <typename Strategy>
52 std::string EphemeralRangeTest::traverseRange(const PositionTemplate<Strategy>& start, const PositionTemplate<Strategy>& end) const
53 {
54 std::stringstream nodesContent;
55 for (Node& node : inRange(start, end)) {
56 nodesContent << "[" << node << "]";
57 }
58
59 return nodesContent.str();
60 }
61
62 Range* EphemeralRangeTest::getBodyRange() const
63 {
64 Range* range = Range::create(document());
65 range->selectNode(document().body());
66 return range;
67 }
68
69 } // namespace
70
71 // Tests that |inRange| helper will traverse the whole range exactly as
72 // |for (Node* n = firstNode(); n != pastLastNode(); n = Traversal::next(*n))|
73 // does.
74 TEST_F(EphemeralRangeTest, rangeTraversal)
75 {
76 const char* bodyContent = "<p id='host'><b id='one'></b><b id='two'>22</b></ p>";
77 setBodyContent(bodyContent);
78
79 const std::string expectedNodes("[BODY][P id=\"host\"][B id=\"one\"][B id=\" two\"][#text \"22\"]");
80
81 // Check all three ways to traverse.
82 EXPECT_EQ(expectedNodes, traverseRange<>(getBodyRange()));
83 EXPECT_EQ(traverseRange<>(getBodyRange()), traverseRange(EphemeralRange(getB odyRange())));
84 EXPECT_EQ(
85 traverseRange<>(getBodyRange()),
86 traverseRange(getBodyRange()->startPosition(), getBodyRange()->endPositi on()));
87
88 // The same with FlatTree traversing.
89 EXPECT_EQ(expectedNodes, traverseRange<FlatTreeTraversal>(getBodyRange()));
90 EXPECT_EQ(
91 traverseRange<FlatTreeTraversal>(getBodyRange()),
92 traverseRange(EphemeralRangeInFlatTree(getBodyRange())));
93 EXPECT_EQ(
94 traverseRange<FlatTreeTraversal>(getBodyRange()),
95 traverseRange(toPositionInFlatTree(getBodyRange()->startPosition()), toP ositionInFlatTree(getBodyRange()->endPosition())));
96 }
97
98 // Tests that |inRange| helper will traverse the whole range with shadow DOM.
99 TEST_F(EphemeralRangeTest, rangeShadowTraversal)
100 {
101 const char* bodyContent = "<p id='host'><b id='one'></b><input type='text' v alue='some'></p>";
102 setBodyContent(bodyContent);
103
104 EXPECT_EQ(
105 std::string("[BODY][P id=\"host\"][B id=\"one\"][INPUT]"),
106 traverseRange<>(getBodyRange()));
107 EXPECT_EQ(traverseRange<>(getBodyRange()), traverseRange(EphemeralRange(getB odyRange())));
108 EXPECT_EQ(
109 traverseRange<>(getBodyRange()),
110 traverseRange(getBodyRange()->startPosition(), getBodyRange()->endPositi on()));
111
112 // In this case FlatTree traverse should differs from DOM tree traverse.
113 EXPECT_EQ(
114 std::string("[BODY][P id=\"host\"][B id=\"one\"][INPUT][DIV id=\"inner-e ditor\"][#text \"some\"]"),
115 traverseRange<FlatTreeTraversal>(getBodyRange()));
116 EXPECT_EQ(
117 traverseRange<FlatTreeTraversal>(getBodyRange()),
118 traverseRange(toPositionInFlatTree(getBodyRange()->startPosition()), toP ositionInFlatTree(getBodyRange()->endPosition())));
119 }
120
121 // Limit a range and check that it will be traversed correctly.
122 TEST_F(EphemeralRangeTest, rangeTraversalLimited)
123 {
124 const char* bodyContent = "<p id='host'><b id='one'></b><input type='text' v alue='some'><span id='two'></p>";
125 setBodyContent(bodyContent);
126
127 // Get a limited range from <p> to <b> nodes.
128 Range* untilB = getBodyRange();
129 untilB->setEnd(document().getElementById("one"), 0, IGNORE_EXCEPTION);
130 EXPECT_EQ(
131 std::string("[BODY][P id=\"host\"][B id=\"one\"]"),
132 traverseRange<>(untilB));
133
134 EXPECT_EQ(traverseRange<>(untilB), traverseRange(EphemeralRange(untilB)));
135 EXPECT_EQ(
136 traverseRange<>(untilB),
137 traverseRange(untilB->startPosition(), untilB->endPosition()));
138
139 EXPECT_EQ(
140 std::string("[BODY][P id=\"host\"][B id=\"one\"]"),
141 traverseRange<FlatTreeTraversal>(untilB));
142 EXPECT_EQ(
143 traverseRange<FlatTreeTraversal>(untilB),
144 traverseRange(EphemeralRangeInFlatTree(untilB)));
145
146 // Get a limited range from <b> to <span> nodes.
147 Range* fromBToSpan = getBodyRange();
148 fromBToSpan->setStart(document().getElementById("one"), 0, IGNORE_EXCEPTION) ;
149 fromBToSpan->setEnd(document().getElementById("two"), 0, IGNORE_EXCEPTION);
150
151 EXPECT_EQ(
152 std::string("[B id=\"one\"][INPUT][SPAN id=\"two\"]"),
153 traverseRange<>(fromBToSpan));
154 EXPECT_EQ(traverseRange<>(fromBToSpan), traverseRange(EphemeralRange(fromBTo Span)));
155 EXPECT_EQ(
156 traverseRange<>(fromBToSpan),
157 traverseRange(fromBToSpan->startPosition(), fromBToSpan->endPosition())) ;
158
159 EXPECT_EQ(
160 std::string("[B id=\"one\"][INPUT][DIV id=\"inner-editor\"][#text \"some \"][SPAN id=\"two\"]"),
161 traverseRange<FlatTreeTraversal>(fromBToSpan));
162 EXPECT_EQ(
163 traverseRange<FlatTreeTraversal>(fromBToSpan),
164 traverseRange(EphemeralRangeInFlatTree(fromBToSpan)));
165 EXPECT_EQ(
166 traverseRange<FlatTreeTraversal>(fromBToSpan),
167 traverseRange(toPositionInFlatTree(fromBToSpan->startPosition()), toPosi tionInFlatTree(fromBToSpan->endPosition())));
168 }
169
170 TEST_F(EphemeralRangeTest, traversalWithNullCheck)
171 {
172 const char* bodyContent = "<p id='host'><b id='one'></b></p>";
173 setBodyContent(bodyContent);
174
175 Range* inner = getBodyRange();
176 inner->setEnd(document().getElementById("one"), 0, IGNORE_EXCEPTION);
177 auto iterable = inRange(inner->endPosition(), inner->startPosition());
178 auto it = iterable.begin();
179 const auto end = iterable.end();
180 while (!it.isNull() && it != end)
181 ++it;
182
183 EXPECT_TRUE(it.isNull());
184 EXPECT_NE(end, it);
185 }
186
187 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698