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

Side by Side Diff: third_party/WebKit/Source/core/dom/RangeTest.cpp

Issue 2701413003: Range: node offsets should be unsigned. (Closed)
Patch Set: Resolve std::numeric_limits<int>::max() leftover Created 3 years, 10 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/dom/Range.h" 5 #include "core/dom/Range.h"
6 6
7 #include "bindings/core/v8/ExceptionState.h" 7 #include "bindings/core/v8/ExceptionState.h"
8 #include "core/dom/Element.h" 8 #include "core/dom/Element.h"
9 #include "core/dom/NodeList.h" 9 #include "core/dom/NodeList.h"
10 #include "core/dom/Text.h" 10 #include "core/dom/Text.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 Range* range04 = Range::create(document(), oldText, 0, oldText, 4); 69 Range* range04 = Range::create(document(), oldText, 0, oldText, 4);
70 Range* range02 = Range::create(document(), oldText, 0, oldText, 2); 70 Range* range02 = Range::create(document(), oldText, 0, oldText, 2);
71 Range* range22 = Range::create(document(), oldText, 2, oldText, 2); 71 Range* range22 = Range::create(document(), oldText, 2, oldText, 2);
72 Range* range24 = Range::create(document(), oldText, 2, oldText, 4); 72 Range* range24 = Range::create(document(), oldText, 2, oldText, 4);
73 73
74 oldText->splitText(2, ASSERT_NO_EXCEPTION); 74 oldText->splitText(2, ASSERT_NO_EXCEPTION);
75 Text* newText = toText(oldText->nextSibling()); 75 Text* newText = toText(oldText->nextSibling());
76 76
77 EXPECT_TRUE(range04->boundaryPointsValid()); 77 EXPECT_TRUE(range04->boundaryPointsValid());
78 EXPECT_EQ(oldText, range04->startContainer()); 78 EXPECT_EQ(oldText, range04->startContainer());
79 EXPECT_EQ(0, range04->startOffset()); 79 EXPECT_EQ(0u, range04->startOffset());
80 EXPECT_EQ(newText, range04->endContainer()); 80 EXPECT_EQ(newText, range04->endContainer());
81 EXPECT_EQ(2, range04->endOffset()); 81 EXPECT_EQ(2u, range04->endOffset());
82 82
83 EXPECT_TRUE(range02->boundaryPointsValid()); 83 EXPECT_TRUE(range02->boundaryPointsValid());
84 EXPECT_EQ(oldText, range02->startContainer()); 84 EXPECT_EQ(oldText, range02->startContainer());
85 EXPECT_EQ(0, range02->startOffset()); 85 EXPECT_EQ(0u, range02->startOffset());
86 EXPECT_EQ(oldText, range02->endContainer()); 86 EXPECT_EQ(oldText, range02->endContainer());
87 EXPECT_EQ(2, range02->endOffset()); 87 EXPECT_EQ(2u, range02->endOffset());
88 88
89 // Our implementation always moves the boundary point at the separation point 89 // Our implementation always moves the boundary point at the separation point
90 // to the end of the original text node. 90 // to the end of the original text node.
91 EXPECT_TRUE(range22->boundaryPointsValid()); 91 EXPECT_TRUE(range22->boundaryPointsValid());
92 EXPECT_EQ(oldText, range22->startContainer()); 92 EXPECT_EQ(oldText, range22->startContainer());
93 EXPECT_EQ(2, range22->startOffset()); 93 EXPECT_EQ(2u, range22->startOffset());
94 EXPECT_EQ(oldText, range22->endContainer()); 94 EXPECT_EQ(oldText, range22->endContainer());
95 EXPECT_EQ(2, range22->endOffset()); 95 EXPECT_EQ(2u, range22->endOffset());
96 96
97 EXPECT_TRUE(range24->boundaryPointsValid()); 97 EXPECT_TRUE(range24->boundaryPointsValid());
98 EXPECT_EQ(oldText, range24->startContainer()); 98 EXPECT_EQ(oldText, range24->startContainer());
99 EXPECT_EQ(2, range24->startOffset()); 99 EXPECT_EQ(2u, range24->startOffset());
100 EXPECT_EQ(newText, range24->endContainer()); 100 EXPECT_EQ(newText, range24->endContainer());
101 EXPECT_EQ(2, range24->endOffset()); 101 EXPECT_EQ(2u, range24->endOffset());
102 } 102 }
103 103
104 TEST_F(RangeTest, SplitTextNodeRangeOutsideText) { 104 TEST_F(RangeTest, SplitTextNodeRangeOutsideText) {
105 document().body()->setInnerHTML( 105 document().body()->setInnerHTML(
106 "<span id=\"outer\">0<span id=\"inner-left\">1</span>SPLITME<span " 106 "<span id=\"outer\">0<span id=\"inner-left\">1</span>SPLITME<span "
107 "id=\"inner-right\">2</span>3</span>"); 107 "id=\"inner-right\">2</span>3</span>");
108 108
109 Element* outer = document().getElementById(AtomicString::fromUTF8("outer")); 109 Element* outer = document().getElementById(AtomicString::fromUTF8("outer"));
110 Element* innerLeft = 110 Element* innerLeft =
111 document().getElementById(AtomicString::fromUTF8("inner-left")); 111 document().getElementById(AtomicString::fromUTF8("inner-left"));
112 Element* innerRight = 112 Element* innerRight =
113 document().getElementById(AtomicString::fromUTF8("inner-right")); 113 document().getElementById(AtomicString::fromUTF8("inner-right"));
114 Text* oldText = toText(outer->childNodes()->item(2)); 114 Text* oldText = toText(outer->childNodes()->item(2));
115 115
116 Range* rangeOuterOutside = Range::create(document(), outer, 0, outer, 5); 116 Range* rangeOuterOutside = Range::create(document(), outer, 0, outer, 5);
117 Range* rangeOuterInside = Range::create(document(), outer, 1, outer, 4); 117 Range* rangeOuterInside = Range::create(document(), outer, 1, outer, 4);
118 Range* rangeOuterSurroundingText = 118 Range* rangeOuterSurroundingText =
119 Range::create(document(), outer, 2, outer, 3); 119 Range::create(document(), outer, 2, outer, 3);
120 Range* rangeInnerLeft = Range::create(document(), innerLeft, 0, innerLeft, 1); 120 Range* rangeInnerLeft = Range::create(document(), innerLeft, 0, innerLeft, 1);
121 Range* rangeInnerRight = 121 Range* rangeInnerRight =
122 Range::create(document(), innerRight, 0, innerRight, 1); 122 Range::create(document(), innerRight, 0, innerRight, 1);
123 Range* rangeFromTextToMiddleOfElement = 123 Range* rangeFromTextToMiddleOfElement =
124 Range::create(document(), oldText, 6, outer, 3); 124 Range::create(document(), oldText, 6, outer, 3);
125 125
126 oldText->splitText(3, ASSERT_NO_EXCEPTION); 126 oldText->splitText(3, ASSERT_NO_EXCEPTION);
127 Text* newText = toText(oldText->nextSibling()); 127 Text* newText = toText(oldText->nextSibling());
128 128
129 EXPECT_TRUE(rangeOuterOutside->boundaryPointsValid()); 129 EXPECT_TRUE(rangeOuterOutside->boundaryPointsValid());
130 EXPECT_EQ(outer, rangeOuterOutside->startContainer()); 130 EXPECT_EQ(outer, rangeOuterOutside->startContainer());
131 EXPECT_EQ(0, rangeOuterOutside->startOffset()); 131 EXPECT_EQ(0u, rangeOuterOutside->startOffset());
132 EXPECT_EQ(outer, rangeOuterOutside->endContainer()); 132 EXPECT_EQ(outer, rangeOuterOutside->endContainer());
133 EXPECT_EQ(6, 133 EXPECT_EQ(6u,
134 rangeOuterOutside 134 rangeOuterOutside
135 ->endOffset()); // Increased by 1 since a new node is inserted. 135 ->endOffset()); // Increased by 1 since a new node is inserted.
136 136
137 EXPECT_TRUE(rangeOuterInside->boundaryPointsValid()); 137 EXPECT_TRUE(rangeOuterInside->boundaryPointsValid());
138 EXPECT_EQ(outer, rangeOuterInside->startContainer()); 138 EXPECT_EQ(outer, rangeOuterInside->startContainer());
139 EXPECT_EQ(1, rangeOuterInside->startOffset()); 139 EXPECT_EQ(1u, rangeOuterInside->startOffset());
140 EXPECT_EQ(outer, rangeOuterInside->endContainer()); 140 EXPECT_EQ(outer, rangeOuterInside->endContainer());
141 EXPECT_EQ(5, rangeOuterInside->endOffset()); 141 EXPECT_EQ(5u, rangeOuterInside->endOffset());
142 142
143 EXPECT_TRUE(rangeOuterSurroundingText->boundaryPointsValid()); 143 EXPECT_TRUE(rangeOuterSurroundingText->boundaryPointsValid());
144 EXPECT_EQ(outer, rangeOuterSurroundingText->startContainer()); 144 EXPECT_EQ(outer, rangeOuterSurroundingText->startContainer());
145 EXPECT_EQ(2, rangeOuterSurroundingText->startOffset()); 145 EXPECT_EQ(2u, rangeOuterSurroundingText->startOffset());
146 EXPECT_EQ(outer, rangeOuterSurroundingText->endContainer()); 146 EXPECT_EQ(outer, rangeOuterSurroundingText->endContainer());
147 EXPECT_EQ(4, rangeOuterSurroundingText->endOffset()); 147 EXPECT_EQ(4u, rangeOuterSurroundingText->endOffset());
148 148
149 EXPECT_TRUE(rangeInnerLeft->boundaryPointsValid()); 149 EXPECT_TRUE(rangeInnerLeft->boundaryPointsValid());
150 EXPECT_EQ(innerLeft, rangeInnerLeft->startContainer()); 150 EXPECT_EQ(innerLeft, rangeInnerLeft->startContainer());
151 EXPECT_EQ(0, rangeInnerLeft->startOffset()); 151 EXPECT_EQ(0u, rangeInnerLeft->startOffset());
152 EXPECT_EQ(innerLeft, rangeInnerLeft->endContainer()); 152 EXPECT_EQ(innerLeft, rangeInnerLeft->endContainer());
153 EXPECT_EQ(1, rangeInnerLeft->endOffset()); 153 EXPECT_EQ(1u, rangeInnerLeft->endOffset());
154 154
155 EXPECT_TRUE(rangeInnerRight->boundaryPointsValid()); 155 EXPECT_TRUE(rangeInnerRight->boundaryPointsValid());
156 EXPECT_EQ(innerRight, rangeInnerRight->startContainer()); 156 EXPECT_EQ(innerRight, rangeInnerRight->startContainer());
157 EXPECT_EQ(0, rangeInnerRight->startOffset()); 157 EXPECT_EQ(0u, rangeInnerRight->startOffset());
158 EXPECT_EQ(innerRight, rangeInnerRight->endContainer()); 158 EXPECT_EQ(innerRight, rangeInnerRight->endContainer());
159 EXPECT_EQ(1, rangeInnerRight->endOffset()); 159 EXPECT_EQ(1u, rangeInnerRight->endOffset());
160 160
161 EXPECT_TRUE(rangeFromTextToMiddleOfElement->boundaryPointsValid()); 161 EXPECT_TRUE(rangeFromTextToMiddleOfElement->boundaryPointsValid());
162 EXPECT_EQ(newText, rangeFromTextToMiddleOfElement->startContainer()); 162 EXPECT_EQ(newText, rangeFromTextToMiddleOfElement->startContainer());
163 EXPECT_EQ(3, rangeFromTextToMiddleOfElement->startOffset()); 163 EXPECT_EQ(3u, rangeFromTextToMiddleOfElement->startOffset());
164 EXPECT_EQ(outer, rangeFromTextToMiddleOfElement->endContainer()); 164 EXPECT_EQ(outer, rangeFromTextToMiddleOfElement->endContainer());
165 EXPECT_EQ(4, rangeFromTextToMiddleOfElement->endOffset()); 165 EXPECT_EQ(4u, rangeFromTextToMiddleOfElement->endOffset());
166 } 166 }
167 167
168 TEST_F(RangeTest, updateOwnerDocumentIfNeeded) { 168 TEST_F(RangeTest, updateOwnerDocumentIfNeeded) {
169 Element* foo = document().createElement("foo"); 169 Element* foo = document().createElement("foo");
170 Element* bar = document().createElement("bar"); 170 Element* bar = document().createElement("bar");
171 foo->appendChild(bar); 171 foo->appendChild(bar);
172 172
173 Range* range = Range::create(document(), Position(bar, 0), Position(foo, 1)); 173 Range* range = Range::create(document(), Position(bar, 0), Position(foo, 1));
174 174
175 Document* anotherDocument = Document::create(); 175 Document* anotherDocument = Document::create();
176 anotherDocument->appendChild(foo); 176 anotherDocument->appendChild(foo);
177 177
178 EXPECT_EQ(bar, range->startContainer()); 178 EXPECT_EQ(bar, range->startContainer());
179 EXPECT_EQ(0, range->startOffset()); 179 EXPECT_EQ(0u, range->startOffset());
180 EXPECT_EQ(foo, range->endContainer()); 180 EXPECT_EQ(foo, range->endContainer());
181 EXPECT_EQ(1, range->endOffset()); 181 EXPECT_EQ(1u, range->endOffset());
182 } 182 }
183 183
184 // Regression test for crbug.com/639184 184 // Regression test for crbug.com/639184
185 TEST_F(RangeTest, NotMarkedValidByIrrelevantTextInsert) { 185 TEST_F(RangeTest, NotMarkedValidByIrrelevantTextInsert) {
186 document().body()->setInnerHTML( 186 document().body()->setInnerHTML(
187 "<div><span id=span1>foo</span>bar<span id=span2>baz</span></div>"); 187 "<div><span id=span1>foo</span>bar<span id=span2>baz</span></div>");
188 188
189 Element* div = document().querySelector("div"); 189 Element* div = document().querySelector("div");
190 Element* span1 = document().getElementById("span1"); 190 Element* span1 = document().getElementById("span1");
191 Element* span2 = document().getElementById("span2"); 191 Element* span2 = document().getElementById("span2");
192 Text* text = toText(div->childNodes()->item(1)); 192 Text* text = toText(div->childNodes()->item(1));
193 193
194 Range* range = Range::create(document(), span2, 0, div, 3); 194 Range* range = Range::create(document(), span2, 0, div, 3);
195 195
196 div->removeChild(span1); 196 div->removeChild(span1);
197 text->insertData(0, "bar", ASSERT_NO_EXCEPTION); 197 text->insertData(0, "bar", ASSERT_NO_EXCEPTION);
198 198
199 EXPECT_TRUE(range->boundaryPointsValid()); 199 EXPECT_TRUE(range->boundaryPointsValid());
200 EXPECT_EQ(span2, range->startContainer()); 200 EXPECT_EQ(span2, range->startContainer());
201 EXPECT_EQ(0, range->startOffset()); 201 EXPECT_EQ(0u, range->startOffset());
202 EXPECT_EQ(div, range->endContainer()); 202 EXPECT_EQ(div, range->endContainer());
203 EXPECT_EQ(2, range->endOffset()); 203 EXPECT_EQ(2u, range->endOffset());
204 } 204 }
205 205
206 // Regression test for crbug.com/639184 206 // Regression test for crbug.com/639184
207 TEST_F(RangeTest, NotMarkedValidByIrrelevantTextRemove) { 207 TEST_F(RangeTest, NotMarkedValidByIrrelevantTextRemove) {
208 document().body()->setInnerHTML( 208 document().body()->setInnerHTML(
209 "<div><span id=span1>foofoo</span>bar<span id=span2>baz</span></div>"); 209 "<div><span id=span1>foofoo</span>bar<span id=span2>baz</span></div>");
210 210
211 Element* div = document().querySelector("div"); 211 Element* div = document().querySelector("div");
212 Element* span1 = document().getElementById("span1"); 212 Element* span1 = document().getElementById("span1");
213 Element* span2 = document().getElementById("span2"); 213 Element* span2 = document().getElementById("span2");
214 Text* text = toText(div->childNodes()->item(1)); 214 Text* text = toText(div->childNodes()->item(1));
215 215
216 Range* range = Range::create(document(), span2, 0, div, 3); 216 Range* range = Range::create(document(), span2, 0, div, 3);
217 217
218 div->removeChild(span1); 218 div->removeChild(span1);
219 text->deleteData(0, 3, ASSERT_NO_EXCEPTION); 219 text->deleteData(0, 3, ASSERT_NO_EXCEPTION);
220 220
221 EXPECT_TRUE(range->boundaryPointsValid()); 221 EXPECT_TRUE(range->boundaryPointsValid());
222 EXPECT_EQ(span2, range->startContainer()); 222 EXPECT_EQ(span2, range->startContainer());
223 EXPECT_EQ(0, range->startOffset()); 223 EXPECT_EQ(0u, range->startOffset());
224 EXPECT_EQ(div, range->endContainer()); 224 EXPECT_EQ(div, range->endContainer());
225 EXPECT_EQ(2, range->endOffset()); 225 EXPECT_EQ(2u, range->endOffset());
226 } 226 }
227 227
228 } // namespace blink 228 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698