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

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

Issue 1853033002: Use our own grapheme boundary handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: left TODO Created 4 years, 8 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
« no previous file with comments | « third_party/WebKit/Source/core/editing/EditingUtilities.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 149
150 TEST_F(EditingUtilitiesTest, NextNodeIndex) 150 TEST_F(EditingUtilitiesTest, NextNodeIndex)
151 { 151 {
152 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</ b>33</p>"; 152 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</ b>33</p>";
153 const char* shadowContent = "<content select=#two></content><content select= #one></content>"; 153 const char* shadowContent = "<content select=#two></content><content select= #one></content>";
154 setBodyContent(bodyContent); 154 setBodyContent(bodyContent);
155 setShadowContent(shadowContent, "host"); 155 setShadowContent(shadowContent, "host");
156 Node* host = document().getElementById("host"); 156 Node* host = document().getElementById("host");
157 Node* two = document().getElementById("two"); 157 Node* two = document().getElementById("two");
158 158
159 EXPECT_EQ(Position(host, 3), nextPositionOf(Position(two, 2), PositionMoveTy pe::CodeUnit)); 159 EXPECT_EQ(Position(host, 3), nextPositionOf(Position(two, 2), PositionMoveTy pe::CodePoint));
160 EXPECT_EQ(PositionInFlatTree(host, 1), nextPositionOf(PositionInFlatTree(two , 2), PositionMoveType::CodeUnit)); 160 EXPECT_EQ(PositionInFlatTree(host, 1), nextPositionOf(PositionInFlatTree(two , 2), PositionMoveType::CodePoint));
161 } 161 }
162 162
163 TEST_F(EditingUtilitiesTest, NextVisuallyDistinctCandidate) 163 TEST_F(EditingUtilitiesTest, NextVisuallyDistinctCandidate)
164 { 164 {
165 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</ b><b id='three'>33</b></p>"; 165 const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</ b><b id='three'>33</b></p>";
166 const char* shadowContent = "<content select=#two></content><content select= #one></content><content select=#three></content>"; 166 const char* shadowContent = "<content select=#two></content><content select= #one></content><content select=#three></content>";
167 setBodyContent(bodyContent); 167 setBodyContent(bodyContent);
168 setShadowContent(shadowContent, "host"); 168 setShadowContent(shadowContent, "host");
169 updateLayoutAndStyleForPainting(); 169 updateLayoutAndStyleForPainting();
170 Node* one = document().getElementById("one"); 170 Node* one = document().getElementById("one");
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 254
255 // GB2: Break at the end of text. 255 // GB2: Break at the end of text.
256 setBodyContent("<p id='target'>a</p>"); 256 setBodyContent("<p id='target'>a</p>");
257 node = document().getElementById("target")->firstChild(); 257 node = document().getElementById("target")->firstChild();
258 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 258 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
259 259
260 // GB3: Do not break between CR and LF. 260 // GB3: Do not break between CR and LF.
261 setBodyContent("<p id='target'>a&#x0D;&#x0A;b</p>"); 261 setBodyContent("<p id='target'>a&#x0D;&#x0A;b</p>");
262 node = document().getElementById("target")->firstChild(); 262 node = document().getElementById("target")->firstChild();
263 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); 263 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4));
264 // TODO(nona) : Enable following expectation. 264 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3));
265 // EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3));
266 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 265 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
267 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 266 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
268 // TODO(nona) : Enable following expectation. 267 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1));
269 // EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1));
270 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); 268 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3));
271 269
272 // GB4,GB5: Break before and after CR/LF/Control. 270 // GB4,GB5: Break before and after CR/LF/Control.
273 setBodyContent("<p id='target'>a&#x0D;b</p>"); // CR 271 setBodyContent("<p id='target'>a&#x0D;b</p>"); // CR
274 node = document().getElementById("target")->firstChild(); 272 node = document().getElementById("target")->firstChild();
275 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); 273 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3));
276 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); 274 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2));
277 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 275 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
278 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 276 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
279 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); 277 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1));
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 // Break other Hangul syllable combination. See test of GB999. 387 // Break other Hangul syllable combination. See test of GB999.
390 388
391 // GB8a: Don't break between regional indicator if there are even numbered r egional indicator symbols before. 389 // GB8a: Don't break between regional indicator if there are even numbered r egional indicator symbols before.
392 // U+1F1FA is REGIONAL INDICATOR SYMBOL LETTER U. 390 // U+1F1FA is REGIONAL INDICATOR SYMBOL LETTER U.
393 // U+1F1F8 is REGIONAL INDICATOR SYMBOL LETTER S. 391 // U+1F1F8 is REGIONAL INDICATOR SYMBOL LETTER S.
394 const std::string flag = "&#x1F1FA;&#x1F1F8;"; // US flag. 392 const std::string flag = "&#x1F1FA;&#x1F1F8;"; // US flag.
395 setBodyContent("<p id='target'>" + flag + flag + flag + flag + "a</p>"); // ^(RI RI)* RI x RI 393 setBodyContent("<p id='target'>" + flag + flag + flag + flag + "a</p>"); // ^(RI RI)* RI x RI
396 node = document().getElementById("target")->firstChild(); 394 node = document().getElementById("target")->firstChild();
397 EXPECT_EQ(16, previousGraphemeBoundaryOf(node, 17)); 395 EXPECT_EQ(16, previousGraphemeBoundaryOf(node, 17));
398 EXPECT_EQ(12, previousGraphemeBoundaryOf(node, 16)); 396 EXPECT_EQ(12, previousGraphemeBoundaryOf(node, 16));
399 // TODO(nona): Enable following expectations. 397 EXPECT_EQ(8, previousGraphemeBoundaryOf(node, 12));
400 // EXPECT_EQ(8, previousGraphemeBoundaryOf(node, 12)); 398 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 8));
401 // EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 8)); 399 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4));
402 // EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4)); 400 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0));
403 // EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0)); 401 EXPECT_EQ(8, nextGraphemeBoundaryOf(node, 4));
404 // EXPECT_EQ(8, nextGraphemeBoundaryOf(node, 4));
405 EXPECT_EQ(12, nextGraphemeBoundaryOf(node, 8)); 402 EXPECT_EQ(12, nextGraphemeBoundaryOf(node, 8));
406 EXPECT_EQ(16, nextGraphemeBoundaryOf(node, 12)); 403 EXPECT_EQ(16, nextGraphemeBoundaryOf(node, 12));
407 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 16)); 404 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 16));
408 405
409 // GB8c: Don't break between regional indicator if there are even numbered r egional indicator symbols before. 406 // GB8c: Don't break between regional indicator if there are even numbered r egional indicator symbols before.
410 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "b</p>"); // [^RI] (RI RI)* RI x RI 407 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "b</p>"); // [^RI] (RI RI)* RI x RI
411 node = document().getElementById("target")->firstChild(); 408 node = document().getElementById("target")->firstChild();
412 EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 18)); 409 EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 18));
413 EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17)); 410 EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17));
414 // TODO(nona): Enable following expectations. 411 EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13));
415 // EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13)); 412 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9));
416 // EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9));
417 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5)); 413 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
418 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 414 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
419 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 415 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
420 // TODO(nona): Enable following expectations. 416 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
421 // EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1)); 417 EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5));
422 // EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5));
423 EXPECT_EQ(13, nextGraphemeBoundaryOf(node, 9)); 418 EXPECT_EQ(13, nextGraphemeBoundaryOf(node, 9));
424 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 13)); 419 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 13));
425 EXPECT_EQ(18, nextGraphemeBoundaryOf(node, 17)); 420 EXPECT_EQ(18, nextGraphemeBoundaryOf(node, 17));
426 421
427 // GB8c: Break if there is an odd number of regional indicator symbols befor e. 422 // GB8c: Break if there is an odd number of regional indicator symbols befor e.
428 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "&#x1F1F8;b< /p>"); // RI ÷ RI 423 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "&#x1F1F8;b< /p>"); // RI ÷ RI
429 node = document().getElementById("target")->firstChild(); 424 node = document().getElementById("target")->firstChild();
430 EXPECT_EQ(19, previousGraphemeBoundaryOf(node, 20)); 425 EXPECT_EQ(19, previousGraphemeBoundaryOf(node, 20));
431 // TODO(nona): Enable following expectations. 426 EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 19));
432 // EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 19)); 427 EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17));
433 // EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17)); 428 EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13));
434 // EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13)); 429 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9));
435 // EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9));
436 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5)); 430 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
437 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 431 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
438 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 432 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
439 // TODO(nona): Enable following expectations. 433 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
440 // EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1)); 434 EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5));
441 // EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5)); 435 EXPECT_EQ(13, nextGraphemeBoundaryOf(node, 9));
442 // EXPECT_EQ(13, nextGraphemeBoundaryOf(node, 9));
443 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 13)); 436 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 13));
444 EXPECT_EQ(19, nextGraphemeBoundaryOf(node, 17)); 437 EXPECT_EQ(19, nextGraphemeBoundaryOf(node, 17));
445 EXPECT_EQ(20, nextGraphemeBoundaryOf(node, 19)); 438 EXPECT_EQ(20, nextGraphemeBoundaryOf(node, 19));
446 439
447 // GB9: Do not break before extending characters or ZWJ. 440 // GB9: Do not break before extending characters or ZWJ.
448 // U+0300(COMBINING GRAVE ACCENT) has Extend property. 441 // U+0300(COMBINING GRAVE ACCENT) has Extend property.
449 setBodyContent("<p id='target'>a&#x0300;b</p>"); // x Extend 442 setBodyContent("<p id='target'>a&#x0300;b</p>"); // x Extend
450 node = document().getElementById("target")->firstChild(); 443 node = document().getElementById("target")->firstChild();
451 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); 444 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3));
452 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2)); 445 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2));
453 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0)); 446 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0));
454 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); 447 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2));
455 // U+200D is ZERO WIDTH JOINER. 448 // U+200D is ZERO WIDTH JOINER.
456 setBodyContent("<p id='target'>a&#x200D;b</p>"); // x ZWJ 449 setBodyContent("<p id='target'>a&#x200D;b</p>"); // x ZWJ
457 node = document().getElementById("target")->firstChild(); 450 node = document().getElementById("target")->firstChild();
458 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); 451 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3));
459 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2)); 452 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2));
460 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0)); 453 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0));
461 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); 454 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2));
462 455
463 // GB9a: Do not break before SpacingMarks. 456 // GB9a: Do not break before SpacingMarks.
464 // U+0903(DEVANAGARI SIGN VISARGA) has SpacingMark property. 457 // U+0903(DEVANAGARI SIGN VISARGA) has SpacingMark property.
465 setBodyContent("<p id='target'>a&#x0903;b</p>"); // x SpacingMark 458 setBodyContent("<p id='target'>a&#x0903;b</p>"); // x SpacingMark
466 node = document().getElementById("target")->firstChild(); 459 node = document().getElementById("target")->firstChild();
467 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); 460 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3));
468 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2)); 461 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 2));
469 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0)); 462 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0));
470 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); 463 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2));
471 464
472 // GB9b: Do not break after Prepend but Blink breaks after Prepend char to a ddress Bug 24342. 465 // GB9b: Do not break after Prepend.
473 // U+0600(ARABIC NUMBER SIGN) has Prepend property. 466 // TODO(nona): Introduce Prepend test case once ICU grabs Unicode 9.0.
474 setBodyContent("<p id='target'>a&#x0600;b</p>"); // Prepend x 467
468 // For https://bugs.webkit.org/show_bug.cgi?id=24342
469 // The break should happens after Thai character.
470 setBodyContent("<p id='target'>a&#x0E40;b</p>");
475 node = document().getElementById("target")->firstChild(); 471 node = document().getElementById("target")->firstChild();
476 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); 472 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3));
477 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); 473 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2));
478 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 474 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
479 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 475 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
480 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); 476 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1));
481 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); 477 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2));
482 478
483 // Blink customization: Don't break before Japanese half-width katakana voic ed marks. 479 // Blink customization: Don't break before Japanese half-width katakana voic ed marks.
484 setBodyContent("<p id='target'>a&#xFF76;&#xFF9E;b</p>"); 480 setBodyContent("<p id='target'>a&#xFF76;&#xFF9E;b</p>");
485 node = document().getElementById("target")->firstChild(); 481 node = document().getElementById("target")->firstChild();
486 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); 482 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4));
487 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); 483 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3));
488 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 484 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
489 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 485 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
490 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); 486 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1));
491 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); 487 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3));
492 488
493 // Additional rule for Virama: Do not break after Virama except for Tamil. 489 // Additional rule for IndicSyllabicCategory=Virama: Do not break after that .
494 // See http://www.unicode.org/Public/9.0.0/ucd/IndicSyllabicCategory-9.0.0d2 .txt 490 // See http://www.unicode.org/Public/9.0.0/ucd/IndicSyllabicCategory-9.0.0d2 .txt
495 // U+0905 is DEVANAGARI LETTER A. This has Extend property. 491 // U+0905 is DEVANAGARI LETTER A. This has Extend property.
496 // U+094D is DEVANAGARI SIGN VIRAMA. This has Virama property. 492 // U+094D is DEVANAGARI SIGN VIRAMA. This has Virama property.
497 // U+0915 is DEVANAGARI LETTER KA. 493 // U+0915 is DEVANAGARI LETTER KA.
498 setBodyContent("<p id='target'>a&#x0905;&#x094D;&#x0915;b</p>"); 494 setBodyContent("<p id='target'>a&#x0905;&#x094D;&#x0915;b</p>");
499 node = document().getElementById("target")->firstChild(); 495 node = document().getElementById("target")->firstChild();
500 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); 496 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5));
501 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 4)); 497 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 4));
502 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 498 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
503 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 499 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
504 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 1)); 500 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 1));
505 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); 501 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4));
506 // U+0B85 is TAMIL LETTER A. This has Extend property. 502 // U+0E01 is THAI CHARACTER KO KAI
507 // U+0BCD is TAMIL SIGN VIRAMA. This has Virama property. 503 // U+0E3A is THAI CHARACTER PHINTHU
508 // U+0B95 is TAMIL LETTER KA. 504 // Should break after U+0E3A since U+0E3A has Virama property but not listed in
509 setBodyContent("<p id='target'>a&#x0B85;&#x0BCD;&#x0B95;b</p>"); 505 // IndicSyllabicCategory=Virama.
506 setBodyContent("<p id='target'>a&#x0E01;&#x0E3A;&#x0E01;b</p>");
510 node = document().getElementById("target")->firstChild(); 507 node = document().getElementById("target")->firstChild();
511 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); 508 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5));
512 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); 509 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4));
513 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); 510 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3));
514 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 511 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
515 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 512 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
516 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); 513 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1));
517 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); 514 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3));
518 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); 515 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4));
519 // TODO(nona): Consider to add Sinhala, Balinese, etc.
520 516
521 // GB10: Do not break within emoji modifier. 517 // GB10: Do not break within emoji modifier.
522 // U+1F385(FATHER CHRISTMAS) has E_Base property. 518 // U+1F385(FATHER CHRISTMAS) has E_Base property.
523 // U+1F3FB(EMOJI MODIFIER FITZPATRICK TYPE-1-2) has E_Modifier property. 519 // U+1F3FB(EMOJI MODIFIER FITZPATRICK TYPE-1-2) has E_Modifier property.
524 setBodyContent("<p id='target'>a&#x1F385;&#x1F3FB;b</p>"); // E_Base x E_Mod ifier 520 setBodyContent("<p id='target'>a&#x1F385;&#x1F3FB;b</p>"); // E_Base x E_Mod ifier
525 node = document().getElementById("target")->firstChild(); 521 node = document().getElementById("target")->firstChild();
526 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 6)); 522 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 6));
527 // TODO(nona): Enable following expectation. 523 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
528 // EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
529 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 524 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
530 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 525 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
531 // TODO(nona): Enable following expectation. 526 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
532 // EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
533 EXPECT_EQ(6, nextGraphemeBoundaryOf(node, 5)); 527 EXPECT_EQ(6, nextGraphemeBoundaryOf(node, 5));
534 // U+1F466(BOY) has EBG property. 528 // U+1F466(BOY) has EBG property.
535 setBodyContent("<p id='target'>a&#x1F466;&#x1F3FB;b</p>"); // EBG x E_Modifi er 529 setBodyContent("<p id='target'>a&#x1F466;&#x1F3FB;b</p>"); // EBG x E_Modifi er
536 node = document().getElementById("target")->firstChild(); 530 node = document().getElementById("target")->firstChild();
537 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 6)); 531 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 6));
538 // TODO(nona): Enable following expectation. 532 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
539 // EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5));
540 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); 533 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1));
541 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 534 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
542 // TODO(nona): Enable following expectation. 535 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
543 // EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1));
544 EXPECT_EQ(6, nextGraphemeBoundaryOf(node, 5)); 536 EXPECT_EQ(6, nextGraphemeBoundaryOf(node, 5));
545 537
546 // GB11: Do not break within ZWJ emoji sequence. 538 // GB11: Do not break within ZWJ emoji sequence.
547 // U+2764(HEAVY BLACK HEART) has Glue_After_Zwj property. 539 // U+2764(HEAVY BLACK HEART) has Glue_After_Zwj property.
548 setBodyContent("<p id='target'>a&#x200D;&#x2764;b</p>"); // ZWJ x Glue_After _Zwj 540 setBodyContent("<p id='target'>a&#x200D;&#x2764;b</p>"); // ZWJ x Glue_After _Zwj
549 node = document().getElementById("target")->firstChild(); 541 node = document().getElementById("target")->firstChild();
550 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); 542 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4));
551 // TODO(nona): Enable following expectation. 543 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 3));
552 // EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 3)); 544 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 0));
553 // EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 0));
554 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); 545 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3));
555 setBodyContent("<p id='target'>a&#x200D;&#x1F466;b</p>"); // ZWJ x EBG 546 setBodyContent("<p id='target'>a&#x200D;&#x1F466;b</p>"); // ZWJ x EBG
556 node = document().getElementById("target")->firstChild(); 547 node = document().getElementById("target")->firstChild();
557 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); 548 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5));
558 // TODO(nona): Enable following expectation. 549 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4));
559 // EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4)); 550 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0));
560 // EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0));
561 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); 551 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4));
562 552
563 // GB999: Otherwise break everywhere. 553 // GB999: Otherwise break everywhere.
564 // Breaks between Hangul syllable except for GB6, GB7, GB8. 554 // Breaks between Hangul syllable except for GB6, GB7, GB8.
565 setBodyContent("<p id='target'>" + L + T + "</p>"); 555 setBodyContent("<p id='target'>" + L + T + "</p>");
566 node = document().getElementById("target")->firstChild(); 556 node = document().getElementById("target")->firstChild();
567 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); 557 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2));
568 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); 558 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0));
569 setBodyContent("<p id='target'>" + V + L + "</p>"); 559 setBodyContent("<p id='target'>" + V + L + "</p>");
570 node = document().getElementById("target")->firstChild(); 560 node = document().getElementById("target")->firstChild();
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 724
735 // Edge case: specify middle of surrogate pairs. 725 // Edge case: specify middle of surrogate pairs.
736 setBodyContent("<p id='target'>&#x1F441;&#x1F441;&#x1F441</p>"); 726 setBodyContent("<p id='target'>&#x1F441;&#x1F441;&#x1F441</p>");
737 node = document().getElementById("target")->firstChild(); 727 node = document().getElementById("target")->firstChild();
738 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion)); 728 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM oveType::BackwardDeletion));
739 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion)); 729 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM oveType::BackwardDeletion));
740 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion)); 730 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM oveType::BackwardDeletion));
741 } 731 }
742 732
743 } // namespace blink 733 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/EditingUtilities.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698