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

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

Issue 1824143003: [All-In-One] Introduce BackspaceStateMachine (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/EditingUtilities.h" 5 #include "core/editing/EditingUtilities.h"
6 6
7 #include "core/dom/StaticNodeList.h" 7 #include "core/dom/StaticNodeList.h"
8 #include "core/editing/EditingTestBase.h" 8 #include "core/editing/EditingTestBase.h"
9 9
10 namespace blink { 10 namespace blink {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 << "Can't merge a element with no attributes and another element with an attribute."; 193 << "Can't merge a element with no attributes and another element with an attribute.";
194 194
195 // We can't use contenteditable attribute to make editability difference 195 // We can't use contenteditable attribute to make editability difference
196 // because the hasEquivalentAttributes check is done earier. 196 // because the hasEquivalentAttributes check is done earier.
197 EXPECT_FALSE(areIdenticalElements(*items->item(0), *items->item(1))) 197 EXPECT_FALSE(areIdenticalElements(*items->item(0), *items->item(1)))
198 << "Can't merge non-editable nodes."; 198 << "Can't merge non-editable nodes.";
199 199
200 EXPECT_TRUE(areIdenticalElements(*items->item(1), *items->item(3))); 200 EXPECT_TRUE(areIdenticalElements(*items->item(1), *items->item(3)));
201 } 201 }
202 202
203 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace)
204 {
205 // BMP characters. Only one code point should be deleted.
206 setBodyContent("<p id='target'>abc</p>");
207 Node* node = document().getElementById("target")->firstChild();
208 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
209 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
210 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
211 }
212
213 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_FirstLetter)
214 {
215
216 setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>ab c</p>");
217 Node* node = document().getElementById("target")->firstChild();
218 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
219 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
220 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
221
222 setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>(a )bc</p>");
223 node = document().getElementById("target")->firstChild();
224 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
225 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionM oveType::BackwardDeletion));
226 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
227 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
228 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
229 }
230
231 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_TextTransform)
232 {
233 // Uppercase of &#x00DF; will be transformed to SS.
234 setBodyContent("<style>p {text-transform:uppercase}</style><p id='target'>&# x00DF;abc</p>");
235 Node* node = document().getElementById("target")->firstChild();
236 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionM oveType::BackwardDeletion));
237 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
238 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
239 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
240 }
241
242 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_SurrogatePairs)
243 {
244 // Supplementary plane characters. Only one code point should be deleted.
245 // &#x1F441; is EYE.
246 setBodyContent("<p id='target'>&#x1F441;&#x1F441;&#x1F441;</p>");
247 Node* node = document().getElementById("target")->firstChild();
248 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 6), PositionM oveType::BackwardDeletion));
249 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 4), PositionM oveType::BackwardDeletion));
250 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
251
252 // BMP and Supplementary plane case.
253 setBodyContent("<p id='target'>&#x1F441;a&#x1F441;a</p>");
254 node = document().getElementById("target")->firstChild();
255 EXPECT_EQ(Position(node, 5), previousPositionOf(Position(node, 6), PositionM oveType::BackwardDeletion));
256 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
257 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
258 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
259
260 // Edge case: broken surrogate pairs.
261 setBodyContent("<p id='target'>&#xD83D;</p>"); // &#xD83D; is unpaired lead surrogate.
262 node = document().getElementById("target")->firstChild();
263 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
264
265 setBodyContent("<p id='target'>&#x1F441;&#xD83D;&#x1F441;</p>"); // &#xD83D; is unpaired lead surrogate.
266 node = document().getElementById("target")->firstChild();
267 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
268 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
269 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
270
271 setBodyContent("<p id='target'>a&#xD83D;a</p>"); // &#xD83D; is unpaired lea d surrogate.
272 node = document().getElementById("target")->firstChild();
273 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
274 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
275 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
276
277 setBodyContent("<p id='target'>&#xDC41;</p>"); // &#xDC41; is unpaired trail surrogate.
278 node = document().getElementById("target")->firstChild();
279 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
280
281 setBodyContent("<p id='target'>&#x1F441;&#xDC41;&#x1F441;</p>"); // &#xDC41; is unpaired trail surrogate.
282 node = document().getElementById("target")->firstChild();
283 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
284 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
285 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
286
287 setBodyContent("<p id='target'>a&#xDC41;a</p>"); // &#xDC41; is unpaired tra il surrogate.
288 node = document().getElementById("target")->firstChild();
289 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
290 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM oveType::BackwardDeletion));
291 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
292
293 // Edge case: specify middle of surrogate pairs.
294 setBodyContent("<p id='target'>&#x1F441;&#x1F441;&#x1F441</p>");
295 node = document().getElementById("target")->firstChild();
296 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
297 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
298 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
299 }
300
203 } // namespace blink 301 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698