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