Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |