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

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: Move default template to right place 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 2016 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.
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 class EphemeralRangeTest : public EditingTestBase {
14 protected:
15 template <typename Traversal = NodeTraversal>
16 std::string traverseRange(Range*) const;
17
18 template <typename Strategy>
19 std::string traverseRange(const EphemeralRangeTemplate<Strategy>&) const;
20
21 Range* getBodyRange() const;
22 };
23
24 template <typename Traversal>
25 std::string EphemeralRangeTest::traverseRange(Range* range) const
26 {
27 std::stringstream nodesContent;
28 for (Node* node = range->firstNode(); node != range->pastLastNode(); node = Traversal::next(*node)) {
29 nodesContent << "[" << *node << "]";
30 }
31
32 return nodesContent.str();
33 }
34
35 template <typename Strategy>
36 std::string EphemeralRangeTest::traverseRange(const EphemeralRangeTemplate<Strat egy>& range) const
37 {
38 std::stringstream nodesContent;
39 for (const Node& node : range.nodes())
40 nodesContent << "[" << node << "]";
41
42 return nodesContent.str();
43 }
44
45 Range* EphemeralRangeTest::getBodyRange() const
46 {
47 Range* range = Range::create(document());
48 range->selectNode(document().body());
49 return range;
50 }
51
52 // Tests that |EphemeralRange::nodes()| will traverse the whole range exactly as
53 // |for (Node* n = firstNode(); n != pastLastNode(); n = Traversal::next(*n))|
54 // does.
55 TEST_F(EphemeralRangeTest, rangeTraversal)
56 {
57 const char* bodyContent = "<p id='host'><b id='one'></b><b id='two'>22</b></ p>";
58 setBodyContent(bodyContent);
59
60 const std::string expectedNodes("[BODY][P id=\"host\"][B id=\"one\"][B id=\" two\"][#text \"22\"]");
61
62 // Check two ways to traverse.
63 EXPECT_EQ(expectedNodes, traverseRange<>(getBodyRange()));
64 EXPECT_EQ(traverseRange<>(getBodyRange()), traverseRange(EphemeralRange(getB odyRange())));
65
66 // The same with FlatTree traversing.
67 EXPECT_EQ(expectedNodes, traverseRange<FlatTreeTraversal>(getBodyRange()));
68 EXPECT_EQ(
69 traverseRange<FlatTreeTraversal>(getBodyRange()),
70 traverseRange(EphemeralRangeInFlatTree(getBodyRange())));
71 }
72
73 // Tests that |inRange| helper will traverse the whole range with shadow DOM.
74 TEST_F(EphemeralRangeTest, rangeShadowTraversal)
75 {
76 const char* bodyContent = "<p id='host'><b id='one'></b><input type='text' v alue='some'></p>";
77 setBodyContent(bodyContent);
78
79 EXPECT_EQ(
80 "[BODY][P id=\"host\"][B id=\"one\"][INPUT]",
81 traverseRange<>(getBodyRange()));
82 EXPECT_EQ(traverseRange<>(getBodyRange()), traverseRange(EphemeralRange(getB odyRange())));
83
84 // In this case FlatTree traverse should differs from DOM tree traverse.
85 EXPECT_EQ(
86 "[BODY][P id=\"host\"][B id=\"one\"][INPUT][DIV id=\"inner-editor\"][#te xt \"some\"]",
87 traverseRange<FlatTreeTraversal>(getBodyRange()));
88 EXPECT_EQ(
89 traverseRange<FlatTreeTraversal>(getBodyRange()),
90 traverseRange(EphemeralRangeInFlatTree(getBodyRange())));
91 }
92
93 // Limit a range and check that it will be traversed correctly.
94 TEST_F(EphemeralRangeTest, rangeTraversalLimited)
95 {
96 const char* bodyContent = "<p id='host'><b id='one'></b><input type='text' v alue='some'><span id='two'></p>";
97 setBodyContent(bodyContent);
98
99 // Get a limited range from <body> to <b> nodes.
100 Range* untilB = getBodyRange();
101 untilB->setEnd(document().getElementById("one"), 0, IGNORE_EXCEPTION);
102 EXPECT_EQ(
103 "[BODY][P id=\"host\"][B id=\"one\"]",
104 traverseRange<>(untilB));
105
106 EXPECT_EQ(traverseRange<>(untilB), traverseRange(EphemeralRange(untilB)));
107
108 EXPECT_EQ(
109 "[BODY][P id=\"host\"][B id=\"one\"]",
110 traverseRange<FlatTreeTraversal>(untilB));
111 EXPECT_EQ(
112 traverseRange<FlatTreeTraversal>(untilB),
113 traverseRange(EphemeralRangeInFlatTree(untilB)));
114
115 // Get a limited range from <b> to <span> nodes.
116 Range* fromBToSpan = getBodyRange();
117 fromBToSpan->setStart(document().getElementById("one"), 0, IGNORE_EXCEPTION) ;
118 fromBToSpan->setEnd(document().getElementById("two"), 0, IGNORE_EXCEPTION);
119
120 EXPECT_EQ(
121 "[B id=\"one\"][INPUT][SPAN id=\"two\"]",
122 traverseRange<>(fromBToSpan));
123 EXPECT_EQ(traverseRange<>(fromBToSpan), traverseRange(EphemeralRange(fromBTo Span)));
124
125 EXPECT_EQ(
126 "[B id=\"one\"][INPUT][DIV id=\"inner-editor\"][#text \"some\"][SPAN id= \"two\"]",
127 traverseRange<FlatTreeTraversal>(fromBToSpan));
128 EXPECT_EQ(
129 traverseRange<FlatTreeTraversal>(fromBToSpan),
130 traverseRange(EphemeralRangeInFlatTree(fromBToSpan)));
131 }
132
133 TEST_F(EphemeralRangeTest, traversalEmptyRanges)
134 {
135 const char* bodyContent = "<p id='host'><b id='one'></b></p>";
136 setBodyContent(bodyContent);
137
138 // Expect no iterations in loop for an empty EphemeralRange.
139 EXPECT_EQ(std::string(), traverseRange(EphemeralRange()));
140
141 auto iterable = EphemeralRange().nodes();
142 // Tree iterators have only |operator !=| ATM.
143 EXPECT_FALSE(iterable.begin() != iterable.end());
144
145 const EphemeralRange singlePositionRange(getBodyRange()->startPosition());
146 EXPECT_FALSE(singlePositionRange.isNull());
147 EXPECT_EQ(std::string(), traverseRange(singlePositionRange));
148 EXPECT_EQ(
149 singlePositionRange.startPosition().nodeAsRangeFirstNode(),
150 singlePositionRange.endPosition().nodeAsRangePastLastNode());
151 }
152
153 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698