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

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

Issue 2720593005: Make PositionIterator to skip contents of INPUT/SELECT/TEXTAREA (Closed)
Patch Set: 2017-03-02T19:03:48 Add FrameSelectionTest.SelectAllWithInputElement Created 3 years, 9 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/editing/PositionIterator.h" 5 #include "core/editing/PositionIterator.h"
6 6
7 #include "core/dom/shadow/FlatTreeTraversal.h" 7 #include "core/dom/shadow/FlatTreeTraversal.h"
8 #include "core/editing/EditingTestBase.h" 8 #include "core/editing/EditingTestBase.h"
9 9
10 namespace blink { 10 namespace blink {
11 11
12 class PositionIteratorTest : public EditingTestBase {}; 12 class PositionIteratorTest : public EditingTestBase {};
13 13
14 // For http://crbug.com/695317 14 // For http://crbug.com/695317
15 TEST_F(PositionIteratorTest, decrementWithInputElement) { 15 TEST_F(PositionIteratorTest, decrementWithInputElement) {
16 setBodyContent("123<input value='abc'>"); 16 setBodyContent("123<input value='abc'>");
17 Element* const input = document().querySelector("input"); 17 Element* const input = document().querySelector("input");
18 Node* const innerEditor = FlatTreeTraversal::firstChild(*input);
19 Node* const text = input->previousSibling(); 18 Node* const text = input->previousSibling();
20 19
21 // Decrement until start of "123" from INPUT on DOM tree 20 // Decrement until start of "123" from INPUT on DOM tree
22 PositionIterator domIterator(Position::lastPositionInNode(document().body())); 21 PositionIterator domIterator(Position::lastPositionInNode(document().body()));
23 EXPECT_EQ(Position::lastPositionInNode(document().body()), 22 EXPECT_EQ(Position::lastPositionInNode(document().body()),
24 domIterator.computePosition()); 23 domIterator.computePosition());
25 domIterator.decrement(); 24 domIterator.decrement();
26 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); 25 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition());
27 domIterator.decrement(); 26 domIterator.decrement();
28 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); 27 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition());
29 domIterator.decrement(); 28 domIterator.decrement();
30 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 29 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
31 domIterator.decrement(); 30 domIterator.decrement();
32 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); 31 EXPECT_EQ(Position(text, 3), domIterator.computePosition());
33 32
34 // Decrement until start of "123" from INPUT on flat tree 33 // Decrement until start of "123" from INPUT on flat tree
35 PositionIteratorInFlatTree flatIterator( 34 PositionIteratorInFlatTree flatIterator(
36 PositionInFlatTree::lastPositionInNode(document().body())); 35 PositionInFlatTree::lastPositionInNode(document().body()));
37 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), 36 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
38 flatIterator.computePosition()); 37 flatIterator.computePosition());
39 flatIterator.decrement(); 38 flatIterator.decrement();
40 EXPECT_EQ(PositionInFlatTree::afterNode(input), 39 EXPECT_EQ(PositionInFlatTree::afterNode(input),
41 flatIterator.computePosition()); 40 flatIterator.computePosition());
42 // TODO(yosin): We should not traverse inside INPUT
43 flatIterator.decrement(); 41 flatIterator.decrement();
44 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), 42 EXPECT_EQ(PositionInFlatTree::beforeNode(input),
45 flatIterator.computePosition()); 43 flatIterator.computePosition());
46 flatIterator.decrement(); 44 flatIterator.decrement();
47 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
48 flatIterator.computePosition());
49 flatIterator.decrement();
50 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
51 flatIterator.computePosition());
52 flatIterator.decrement();
53 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
54 flatIterator.computePosition());
55 flatIterator.decrement();
56 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
57 flatIterator.computePosition());
58 flatIterator.decrement();
59 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
60 flatIterator.decrement();
61 EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition());
62 flatIterator.decrement();
63 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 45 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
64 flatIterator.computePosition()); 46 flatIterator.computePosition());
65 flatIterator.decrement(); 47 flatIterator.decrement();
66 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); 48 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
67 } 49 }
68 50
69 TEST_F(PositionIteratorTest, decrementWithSelectElement) { 51 TEST_F(PositionIteratorTest, decrementWithSelectElement) {
70 setBodyContent("123<select><option>1</option><option>2</option></select>"); 52 setBodyContent("123<select><option>1</option><option>2</option></select>");
71 Element* const select = document().querySelector("select"); 53 Element* const select = document().querySelector("select");
72 Node* const option1 = select->firstChild();
73 Node* const option2 = select->lastChild();
74 Node* text = select->previousSibling(); 54 Node* text = select->previousSibling();
75 55
76 // Decrement until start of "123" from SELECT on DOM tree 56 // Decrement until start of "123" from SELECT on DOM tree
77 PositionIterator domIterator(Position::lastPositionInNode(document().body())); 57 PositionIterator domIterator(Position::lastPositionInNode(document().body()));
78 EXPECT_EQ(Position::lastPositionInNode(document().body()), 58 EXPECT_EQ(Position::lastPositionInNode(document().body()),
79 domIterator.computePosition()); 59 domIterator.computePosition());
80 domIterator.decrement(); 60 domIterator.decrement();
81 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); 61 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition());
82 // TODO(yosin): We should not traverse inside SELECT and OPTION
83 domIterator.decrement(); 62 domIterator.decrement();
84 EXPECT_EQ(Position::lastPositionInNode(option2), 63 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition())
85 domIterator.computePosition()); 64 << "This is redundant result, we should not have. see "
65 "http://crbug.com/697283";
86 domIterator.decrement(); 66 domIterator.decrement();
87 EXPECT_EQ(Position(option2->firstChild(), 1), domIterator.computePosition()); 67 EXPECT_EQ(Position::beforeNode(select), domIterator.computePosition());
88 domIterator.decrement();
89 EXPECT_EQ(Position(option2, 0), domIterator.computePosition());
90 domIterator.decrement();
91 EXPECT_EQ(Position(select, 1), domIterator.computePosition());
92 domIterator.decrement();
93 EXPECT_EQ(Position::lastPositionInNode(option1),
94 domIterator.computePosition());
95 domIterator.decrement();
96 EXPECT_EQ(Position(option1->firstChild(), 1), domIterator.computePosition());
97 domIterator.decrement();
98 EXPECT_EQ(Position(option1, 0), domIterator.computePosition());
99 domIterator.decrement();
100 EXPECT_EQ(Position(select, 0), domIterator.computePosition());
101 domIterator.decrement(); 68 domIterator.decrement();
102 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 69 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
103 domIterator.decrement(); 70 domIterator.decrement();
104 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); 71 EXPECT_EQ(Position(text, 3), domIterator.computePosition());
105 72
106 // Decrement until start of "123" from SELECT on flat tree 73 // Decrement until start of "123" from SELECT on flat tree
107 PositionIteratorInFlatTree flatIterator( 74 PositionIteratorInFlatTree flatIterator(
108 PositionInFlatTree::lastPositionInNode(document().body())); 75 PositionInFlatTree::lastPositionInNode(document().body()));
109 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), 76 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
110 flatIterator.computePosition()); 77 flatIterator.computePosition());
111 flatIterator.decrement(); 78 flatIterator.decrement();
112 EXPECT_EQ(PositionInFlatTree::afterNode(select), 79 EXPECT_EQ(PositionInFlatTree::afterNode(select),
113 flatIterator.computePosition()); 80 flatIterator.computePosition());
114 // TODO(yosin): We should not traverse inside SELECT and OPTION
115 // Traverse |option2|
116 flatIterator.decrement(); 81 flatIterator.decrement();
117 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2), 82 EXPECT_EQ(PositionInFlatTree::afterNode(select),
83 flatIterator.computePosition())
84 << "This is redundant result, we should not have. see "
85 "http://crbug.com/697283";
86 flatIterator.decrement();
87 EXPECT_EQ(PositionInFlatTree::beforeNode(select),
118 flatIterator.computePosition()); 88 flatIterator.computePosition());
119 flatIterator.decrement(); 89 flatIterator.decrement();
120 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 1),
121 flatIterator.computePosition());
122 flatIterator.decrement();
123 EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition());
124 flatIterator.decrement();
125 EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition());
126 // Traverse |option1|
127 flatIterator.decrement();
128 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1),
129 flatIterator.computePosition());
130 flatIterator.decrement();
131 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 1),
132 flatIterator.computePosition());
133 flatIterator.decrement();
134 EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition());
135 flatIterator.decrement();
136 EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition());
137 flatIterator.decrement();
138 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 90 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
139 flatIterator.computePosition()); 91 flatIterator.computePosition());
140 flatIterator.decrement(); 92 flatIterator.decrement();
141 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); 93 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
142 } 94 }
143 95
144 // For http://crbug.com/695317 96 // For http://crbug.com/695317
145 TEST_F(PositionIteratorTest, decrementWithTextAreaElement) { 97 TEST_F(PositionIteratorTest, decrementWithTextAreaElement) {
146 setBodyContent("123<textarea>456</textarea>"); 98 setBodyContent("123<textarea>456</textarea>");
147 Element* const textarea = document().querySelector("textarea"); 99 Element* const textarea = document().querySelector("textarea");
148 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea);
149 Node* const text = textarea->previousSibling(); 100 Node* const text = textarea->previousSibling();
150 101
151 // Decrement until end of "123" from after TEXTAREA on DOM tree 102 // Decrement until end of "123" from after TEXTAREA on DOM tree
152 PositionIterator domIterator(Position::lastPositionInNode(document().body())); 103 PositionIterator domIterator(Position::lastPositionInNode(document().body()));
153 EXPECT_EQ(Position::lastPositionInNode(document().body()), 104 EXPECT_EQ(Position::lastPositionInNode(document().body()),
154 domIterator.computePosition()); 105 domIterator.computePosition());
155 domIterator.decrement(); 106 domIterator.decrement();
156 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); 107 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition());
157 // TODO(yosin): We should not traverse inside TEXTAREA
158 domIterator.decrement(); 108 domIterator.decrement();
159 EXPECT_EQ(Position(textarea->firstChild(), 3), domIterator.computePosition()); 109 EXPECT_EQ(Position::beforeNode(textarea), domIterator.computePosition());
160 domIterator.decrement();
161 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition());
162 domIterator.decrement(); 110 domIterator.decrement();
163 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 111 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
164 domIterator.decrement(); 112 domIterator.decrement();
165 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); 113 EXPECT_EQ(Position(text, 3), domIterator.computePosition());
166 114
167 // Decrement until end of "123" from after TEXTAREA on flat tree 115 // Decrement until end of "123" from after TEXTAREA on flat tree
168 PositionIteratorInFlatTree flatIterator( 116 PositionIteratorInFlatTree flatIterator(
169 PositionInFlatTree::lastPositionInNode(document().body())); 117 PositionInFlatTree::lastPositionInNode(document().body()));
170 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), 118 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()),
171 flatIterator.computePosition()); 119 flatIterator.computePosition());
172 flatIterator.decrement(); 120 flatIterator.decrement();
173 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), 121 EXPECT_EQ(PositionInFlatTree::afterNode(textarea),
174 flatIterator.computePosition()); 122 flatIterator.computePosition());
175 // TODO(yosin): We should not traverse inside TEXTAREA
176 // Traverse |innerEditor|
177 flatIterator.decrement(); 123 flatIterator.decrement();
178 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), 124 EXPECT_EQ(PositionInFlatTree::beforeNode(textarea),
179 flatIterator.computePosition()); 125 flatIterator.computePosition());
180 flatIterator.decrement(); 126 flatIterator.decrement();
181 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
182 flatIterator.computePosition());
183 flatIterator.decrement();
184 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
185 flatIterator.computePosition());
186 flatIterator.decrement();
187 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
188 flatIterator.computePosition());
189 flatIterator.decrement();
190 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
191 flatIterator.computePosition());
192 flatIterator.decrement();
193 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
194 flatIterator.decrement();
195 EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition());
196 flatIterator.decrement();
197 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 127 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
198 flatIterator.computePosition()); 128 flatIterator.computePosition());
199 flatIterator.decrement(); 129 flatIterator.decrement();
200 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); 130 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition());
201 } 131 }
202 132
203 // For http://crbug.com/695317 133 // For http://crbug.com/695317
204 TEST_F(PositionIteratorTest, incrementWithInputElement) { 134 TEST_F(PositionIteratorTest, incrementWithInputElement) {
205 setBodyContent("<input value='abc'>123"); 135 setBodyContent("<input value='abc'>123");
206 Element* const input = document().querySelector("input"); 136 Element* const input = document().querySelector("input");
207 Node* const innerEditor = FlatTreeTraversal::firstChild(*input);
208 Node* const text = input->nextSibling(); 137 Node* const text = input->nextSibling();
209 138
210 // Increment until start of "123" from INPUT on DOM tree 139 // Increment until start of "123" from INPUT on DOM tree
211 PositionIterator domIterator( 140 PositionIterator domIterator(
212 Position::firstPositionInNode(document().body())); 141 Position::firstPositionInNode(document().body()));
213 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); 142 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
214 domIterator.increment(); 143 domIterator.increment();
215 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); 144 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition());
216 domIterator.increment(); 145 domIterator.increment();
217 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); 146 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition());
218 domIterator.increment(); 147 domIterator.increment();
219 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 148 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
220 domIterator.increment(); 149 domIterator.increment();
221 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); 150 EXPECT_EQ(Position(text, 0), domIterator.computePosition());
222 151
223 // Increment until start of "123" from INPUT on flat tree 152 // Increment until start of "123" from INPUT on flat tree
224 PositionIteratorInFlatTree flatIterator( 153 PositionIteratorInFlatTree flatIterator(
225 PositionInFlatTree::firstPositionInNode(document().body())); 154 PositionInFlatTree::firstPositionInNode(document().body()));
226 EXPECT_EQ(PositionInFlatTree(document().body(), 0), 155 EXPECT_EQ(PositionInFlatTree(document().body(), 0),
227 flatIterator.computePosition()); 156 flatIterator.computePosition());
228 // TODO(yosin): We should not traverse inside INPUT
229 flatIterator.increment(); 157 flatIterator.increment();
230 EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition()); 158 EXPECT_EQ(PositionInFlatTree::beforeNode(input),
231 flatIterator.increment();
232 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
233 flatIterator.increment();
234 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
235 flatIterator.computePosition());
236 flatIterator.increment();
237 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
238 flatIterator.computePosition());
239 flatIterator.increment();
240 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
241 flatIterator.computePosition());
242 flatIterator.increment();
243 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
244 flatIterator.computePosition());
245 flatIterator.increment();
246 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
247 flatIterator.computePosition()); 159 flatIterator.computePosition());
248 flatIterator.increment(); 160 flatIterator.increment();
249 EXPECT_EQ(PositionInFlatTree::afterNode(input), 161 EXPECT_EQ(PositionInFlatTree::afterNode(input),
250 flatIterator.computePosition()); 162 flatIterator.computePosition());
251 flatIterator.increment(); 163 flatIterator.increment();
252 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 164 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
253 flatIterator.computePosition()); 165 flatIterator.computePosition());
254 flatIterator.increment(); 166 flatIterator.increment();
255 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); 167 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
256 } 168 }
257 169
258 TEST_F(PositionIteratorTest, incrementWithSelectElement) { 170 TEST_F(PositionIteratorTest, incrementWithSelectElement) {
259 setBodyContent("<select><option>1</option><option>2</option></select>123"); 171 setBodyContent("<select><option>1</option><option>2</option></select>123");
260 Element* const select = document().querySelector("select"); 172 Element* const select = document().querySelector("select");
261 Node* const option1 = select->firstChild();
262 Node* const option2 = select->lastChild();
263 Node* const text = select->nextSibling(); 173 Node* const text = select->nextSibling();
264 174
265 // Increment until start of "123" from SELECT on DOM tree 175 // Increment until start of "123" from SELECT on DOM tree
266 PositionIterator domIterator( 176 PositionIterator domIterator(
267 Position::firstPositionInNode(document().body())); 177 Position::firstPositionInNode(document().body()));
268 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); 178 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
269 // TODO(yosin): We should not traverse inside SELECT
270 domIterator.increment(); 179 domIterator.increment();
271 EXPECT_EQ(Position(select, 0), domIterator.computePosition()); 180 EXPECT_EQ(Position::beforeNode(select), domIterator.computePosition());
272 domIterator.increment();
273 EXPECT_EQ(Position(option1, 0), domIterator.computePosition());
274 domIterator.increment();
275 EXPECT_EQ(Position(option1->firstChild(), 0), domIterator.computePosition());
276 domIterator.increment();
277 EXPECT_EQ(Position::lastPositionInNode(option1),
278 domIterator.computePosition());
279 domIterator.increment();
280 EXPECT_EQ(Position(select, 1), domIterator.computePosition());
281 domIterator.increment();
282 EXPECT_EQ(Position(option2, 0), domIterator.computePosition());
283 domIterator.increment();
284 EXPECT_EQ(Position(option2->firstChild(), 0), domIterator.computePosition());
285 domIterator.increment();
286 EXPECT_EQ(Position::lastPositionInNode(option2),
287 domIterator.computePosition());
288 domIterator.increment(); 181 domIterator.increment();
289 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); 182 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition());
290 domIterator.increment(); 183 domIterator.increment();
184 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition())
185 << "This is redundant result, we should not have. see "
186 "http://crbug.com/697283";
187 domIterator.increment();
291 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 188 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
292 domIterator.increment(); 189 domIterator.increment();
293 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); 190 EXPECT_EQ(Position(text, 0), domIterator.computePosition());
294 191
295 // Increment until start of "123" from SELECT on flat tree 192 // Increment until start of "123" from SELECT on flat tree
296 PositionIteratorInFlatTree flatIterator( 193 PositionIteratorInFlatTree flatIterator(
297 PositionInFlatTree::firstPositionInNode(document().body())); 194 PositionInFlatTree::firstPositionInNode(document().body()));
298 EXPECT_EQ(PositionInFlatTree(document().body(), 0), 195 EXPECT_EQ(PositionInFlatTree(document().body(), 0),
299 flatIterator.computePosition()); 196 flatIterator.computePosition());
300 // TODO(yosin): We should not traverse inside SELECT
301 flatIterator.increment(); 197 flatIterator.increment();
302 EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition()); 198 EXPECT_EQ(PositionInFlatTree::beforeNode(select),
303 flatIterator.increment();
304 // Traverse |option2|
305 EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition());
306 flatIterator.increment();
307 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 0),
308 flatIterator.computePosition());
309 flatIterator.increment();
310 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1),
311 flatIterator.computePosition());
312 flatIterator.increment();
313 EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition());
314 // Traverse |option2|
315 flatIterator.increment();
316 EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition());
317 flatIterator.increment();
318 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 0),
319 flatIterator.computePosition());
320 flatIterator.increment();
321 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2),
322 flatIterator.computePosition()); 199 flatIterator.computePosition());
323 flatIterator.increment(); 200 flatIterator.increment();
324 EXPECT_EQ(PositionInFlatTree::afterNode(select), 201 EXPECT_EQ(PositionInFlatTree::afterNode(select),
325 flatIterator.computePosition()); 202 flatIterator.computePosition());
326 flatIterator.increment(); 203 flatIterator.increment();
204 EXPECT_EQ(PositionInFlatTree::afterNode(select),
205 flatIterator.computePosition())
206 << "This is redundant result, we should not have. see "
207 "http://crbug.com/697283";
208 flatIterator.increment();
327 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 209 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
328 flatIterator.computePosition()); 210 flatIterator.computePosition());
329 flatIterator.increment(); 211 flatIterator.increment();
330 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); 212 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
331 } 213 }
332 214
333 // For http://crbug.com/695317 215 // For http://crbug.com/695317
334 TEST_F(PositionIteratorTest, incrementWithTextAreaElement) { 216 TEST_F(PositionIteratorTest, incrementWithTextAreaElement) {
335 setBodyContent("<textarea>123</textarea>456"); 217 setBodyContent("<textarea>123</textarea>456");
336 Element* const textarea = document().querySelector("textarea"); 218 Element* const textarea = document().querySelector("textarea");
337 Node* const text = textarea->nextSibling(); 219 Node* const text = textarea->nextSibling();
338 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea);
339 220
340 // Increment until start of "123" from TEXTAREA on DOM tree 221 // Increment until start of "123" from TEXTAREA on DOM tree
341 PositionIterator domIterator( 222 PositionIterator domIterator(
342 Position::firstPositionInNode(document().body())); 223 Position::firstPositionInNode(document().body()));
343 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); 224 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition());
344 domIterator.increment(); 225 domIterator.increment();
345 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition()); 226 EXPECT_EQ(Position::beforeNode(textarea), domIterator.computePosition());
346 domIterator.increment();
347 EXPECT_EQ(Position(textarea->firstChild(), 0), domIterator.computePosition());
348 domIterator.increment(); 227 domIterator.increment();
349 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); 228 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition());
350 domIterator.increment(); 229 domIterator.increment();
351 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); 230 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition());
352 domIterator.increment(); 231 domIterator.increment();
353 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); 232 EXPECT_EQ(Position(text, 0), domIterator.computePosition());
354 233
355 // Increment until start of "123" from TEXTAREA on flat tree 234 // Increment until start of "123" from TEXTAREA on flat tree
356 PositionIteratorInFlatTree flatIterator( 235 PositionIteratorInFlatTree flatIterator(
357 PositionInFlatTree::firstPositionInNode(document().body())); 236 PositionInFlatTree::firstPositionInNode(document().body()));
358 EXPECT_EQ(PositionInFlatTree(document().body(), 0), 237 EXPECT_EQ(PositionInFlatTree(document().body(), 0),
359 flatIterator.computePosition()); 238 flatIterator.computePosition());
360 // TODO(yosin): We should not traverse inside TEXTAREA 239 // TODO(yosin): We should not traverse inside TEXTAREA
361 flatIterator.increment(); 240 flatIterator.increment();
362 EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition()); 241 EXPECT_EQ(PositionInFlatTree::beforeNode(textarea),
363 // Traverse |innerEditor|
364 flatIterator.increment();
365 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition());
366 flatIterator.increment();
367 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0),
368 flatIterator.computePosition());
369 flatIterator.increment();
370 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1),
371 flatIterator.computePosition());
372 flatIterator.increment();
373 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2),
374 flatIterator.computePosition());
375 flatIterator.increment();
376 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3),
377 flatIterator.computePosition());
378 flatIterator.increment();
379 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor),
380 flatIterator.computePosition()); 242 flatIterator.computePosition());
381 flatIterator.increment(); 243 flatIterator.increment();
382 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), 244 EXPECT_EQ(PositionInFlatTree::afterNode(textarea),
383 flatIterator.computePosition()); 245 flatIterator.computePosition());
384 flatIterator.increment(); 246 flatIterator.increment();
385 EXPECT_EQ(PositionInFlatTree(document().body(), 1), 247 EXPECT_EQ(PositionInFlatTree(document().body(), 1),
386 flatIterator.computePosition()); 248 flatIterator.computePosition());
387 flatIterator.increment(); 249 flatIterator.increment();
388 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); 250 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition());
389 } 251 }
390 252
391 } // namespace blink 253 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698