OLD | NEW |
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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); | 340 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); |
341 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); | 341 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); |
342 setBodyContent("<p id='target'>a
b</p>"); // LF | 342 setBodyContent("<p id='target'>a
b</p>"); // LF |
343 node = document().getElementById("target")->firstChild(); | 343 node = document().getElementById("target")->firstChild(); |
344 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); | 344 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); |
345 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 345 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
346 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 346 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
347 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 347 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
348 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); | 348 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); |
349 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); | 349 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); |
350 setBodyContent( | 350 // U+00AD(SOFT HYPHEN) has Control property. |
351 "<p id='target'>a­b</p>"); // U+00AD(SOFT HYPHEN) has Control proper
ty. | 351 setBodyContent("<p id='target'>a­b</p>"); |
352 node = document().getElementById("target")->firstChild(); | 352 node = document().getElementById("target")->firstChild(); |
353 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); | 353 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); |
354 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 354 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
355 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 355 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
356 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 356 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
357 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); | 357 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); |
358 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); | 358 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); |
359 | 359 |
360 // GB6: Don't break Hangul sequence. | 360 // GB6: Don't break Hangul sequence. |
361 const std::string L = | 361 const std::string L = |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 node = document().getElementById("target")->firstChild(); | 448 node = document().getElementById("target")->firstChild(); |
449 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); | 449 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); |
450 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); | 450 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); |
451 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 451 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
452 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 452 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
453 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); | 453 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); |
454 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); | 454 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); |
455 | 455 |
456 // Break other Hangul syllable combination. See test of GB999. | 456 // Break other Hangul syllable combination. See test of GB999. |
457 | 457 |
458 // GB8a: Don't break between regional indicator if there are even numbered reg
ional indicator symbols before. | 458 // GB8a: Don't break between regional indicator if there are even numbered |
| 459 // regional indicator symbols before. |
459 // U+1F1FA is REGIONAL INDICATOR SYMBOL LETTER U. | 460 // U+1F1FA is REGIONAL INDICATOR SYMBOL LETTER U. |
460 // U+1F1F8 is REGIONAL INDICATOR SYMBOL LETTER S. | 461 // U+1F1F8 is REGIONAL INDICATOR SYMBOL LETTER S. |
461 const std::string flag = "🇺🇸"; // US flag. | 462 const std::string flag = "🇺🇸"; // US flag. |
462 setBodyContent("<p id='target'>" + flag + flag + flag + flag + | 463 // ^(RI RI)* RI x RI |
463 "a</p>"); // ^(RI RI)* RI x RI | 464 setBodyContent("<p id='target'>" + flag + flag + flag + flag + "a</p>"); |
464 node = document().getElementById("target")->firstChild(); | 465 node = document().getElementById("target")->firstChild(); |
465 EXPECT_EQ(16, previousGraphemeBoundaryOf(node, 17)); | 466 EXPECT_EQ(16, previousGraphemeBoundaryOf(node, 17)); |
466 EXPECT_EQ(12, previousGraphemeBoundaryOf(node, 16)); | 467 EXPECT_EQ(12, previousGraphemeBoundaryOf(node, 16)); |
467 EXPECT_EQ(8, previousGraphemeBoundaryOf(node, 12)); | 468 EXPECT_EQ(8, previousGraphemeBoundaryOf(node, 12)); |
468 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 8)); | 469 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 8)); |
469 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4)); | 470 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 4)); |
470 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0)); | 471 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 0)); |
471 EXPECT_EQ(8, nextGraphemeBoundaryOf(node, 4)); | 472 EXPECT_EQ(8, nextGraphemeBoundaryOf(node, 4)); |
472 EXPECT_EQ(12, nextGraphemeBoundaryOf(node, 8)); | 473 EXPECT_EQ(12, nextGraphemeBoundaryOf(node, 8)); |
473 EXPECT_EQ(16, nextGraphemeBoundaryOf(node, 12)); | 474 EXPECT_EQ(16, nextGraphemeBoundaryOf(node, 12)); |
474 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 16)); | 475 EXPECT_EQ(17, nextGraphemeBoundaryOf(node, 16)); |
475 | 476 |
476 // GB8c: Don't break between regional indicator if there are even numbered reg
ional indicator symbols before. | 477 // GB8c: Don't break between regional indicator if there are even numbered |
477 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + | 478 // regional indicator symbols before. |
478 "b</p>"); // [^RI] (RI RI)* RI x RI | 479 // [^RI] (RI RI)* RI x RI |
| 480 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "b</p>"); |
479 node = document().getElementById("target")->firstChild(); | 481 node = document().getElementById("target")->firstChild(); |
480 EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 18)); | 482 EXPECT_EQ(17, previousGraphemeBoundaryOf(node, 18)); |
481 EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17)); | 483 EXPECT_EQ(13, previousGraphemeBoundaryOf(node, 17)); |
482 EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13)); | 484 EXPECT_EQ(9, previousGraphemeBoundaryOf(node, 13)); |
483 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9)); | 485 EXPECT_EQ(5, previousGraphemeBoundaryOf(node, 9)); |
484 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5)); | 486 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 5)); |
485 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 487 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
486 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 488 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
487 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1)); | 489 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 1)); |
488 EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5)); | 490 EXPECT_EQ(9, nextGraphemeBoundaryOf(node, 5)); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 // The break should happens after Thai character. | 543 // The break should happens after Thai character. |
542 setBodyContent("<p id='target'>aเb</p>"); | 544 setBodyContent("<p id='target'>aเb</p>"); |
543 node = document().getElementById("target")->firstChild(); | 545 node = document().getElementById("target")->firstChild(); |
544 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); | 546 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 3)); |
545 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 547 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
546 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 548 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
547 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 549 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
548 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); | 550 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 1)); |
549 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); | 551 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 2)); |
550 | 552 |
551 // Blink customization: Don't break before Japanese half-width katakana voiced
marks. | 553 // Blink customization: Don't break before Japanese half-width katakana voiced |
| 554 // marks. |
552 setBodyContent("<p id='target'>aガb</p>"); | 555 setBodyContent("<p id='target'>aガb</p>"); |
553 node = document().getElementById("target")->firstChild(); | 556 node = document().getElementById("target")->firstChild(); |
554 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); | 557 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); |
555 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); | 558 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); |
556 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 559 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
557 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 560 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
558 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); | 561 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); |
559 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); | 562 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); |
560 | 563 |
561 // Additional rule for IndicSyllabicCategory=Virama: Do not break after that. | 564 // Additional rule for IndicSyllabicCategory=Virama: Do not break after that. |
562 // See http://www.unicode.org/Public/9.0.0/ucd/IndicSyllabicCategory-9.0.0d2.t
xt | 565 // See |
| 566 // http://www.unicode.org/Public/9.0.0/ucd/IndicSyllabicCategory-9.0.0d2.txt |
563 // U+0905 is DEVANAGARI LETTER A. This has Extend property. | 567 // U+0905 is DEVANAGARI LETTER A. This has Extend property. |
564 // U+094D is DEVANAGARI SIGN VIRAMA. This has Virama property. | 568 // U+094D is DEVANAGARI SIGN VIRAMA. This has Virama property. |
565 // U+0915 is DEVANAGARI LETTER KA. | 569 // U+0915 is DEVANAGARI LETTER KA. |
566 setBodyContent("<p id='target'>aअ्कb</p>"); | 570 setBodyContent("<p id='target'>aअ्कb</p>"); |
567 node = document().getElementById("target")->firstChild(); | 571 node = document().getElementById("target")->firstChild(); |
568 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); | 572 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); |
569 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 4)); | 573 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 4)); |
570 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 574 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
571 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 575 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
572 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 1)); | 576 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 1)); |
573 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); | 577 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); |
574 // U+0E01 is THAI CHARACTER KO KAI | 578 // U+0E01 is THAI CHARACTER KO KAI |
575 // U+0E3A is THAI CHARACTER PHINTHU | 579 // U+0E3A is THAI CHARACTER PHINTHU |
576 // Should break after U+0E3A since U+0E3A has Virama property but not listed i
n | 580 // Should break after U+0E3A since U+0E3A has Virama property but not listed |
577 // IndicSyllabicCategory=Virama. | 581 // in IndicSyllabicCategory=Virama. |
578 setBodyContent("<p id='target'>aกฺกb</p>"); | 582 setBodyContent("<p id='target'>aกฺกb</p>"); |
579 node = document().getElementById("target")->firstChild(); | 583 node = document().getElementById("target")->firstChild(); |
580 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); | 584 EXPECT_EQ(4, previousGraphemeBoundaryOf(node, 5)); |
581 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); | 585 EXPECT_EQ(3, previousGraphemeBoundaryOf(node, 4)); |
582 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); | 586 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); |
583 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); | 587 EXPECT_EQ(0, previousGraphemeBoundaryOf(node, 1)); |
584 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 588 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
585 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); | 589 EXPECT_EQ(3, nextGraphemeBoundaryOf(node, 1)); |
586 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); | 590 EXPECT_EQ(4, nextGraphemeBoundaryOf(node, 3)); |
587 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); | 591 EXPECT_EQ(5, nextGraphemeBoundaryOf(node, 4)); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 694 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
691 setBodyContent("<p id='target'>" + T + LV + "</p>"); | 695 setBodyContent("<p id='target'>" + T + LV + "</p>"); |
692 node = document().getElementById("target")->firstChild(); | 696 node = document().getElementById("target")->firstChild(); |
693 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 697 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
694 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 698 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
695 setBodyContent("<p id='target'>" + T + LVT + "</p>"); | 699 setBodyContent("<p id='target'>" + T + LVT + "</p>"); |
696 node = document().getElementById("target")->firstChild(); | 700 node = document().getElementById("target")->firstChild(); |
697 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 701 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
698 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 702 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
699 | 703 |
700 // For GB10, if base emoji character is not E_Base or EBG, break happens befor
e E_Modifier. | 704 // For GB10, if base emoji character is not E_Base or EBG, break happens |
| 705 // before E_Modifier. |
701 setBodyContent("<p id='target'>a🏻</p>"); | 706 setBodyContent("<p id='target'>a🏻</p>"); |
702 node = document().getElementById("target")->firstChild(); | 707 node = document().getElementById("target")->firstChild(); |
703 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); | 708 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 3)); |
704 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 709 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
705 // U+1F5FA(WORLD MAP) doesn't have either E_Base or EBG property. | 710 // U+1F5FA(WORLD MAP) doesn't have either E_Base or EBG property. |
706 setBodyContent("<p id='target'>🗺🏻</p>"); | 711 setBodyContent("<p id='target'>🗺🏻</p>"); |
707 node = document().getElementById("target")->firstChild(); | 712 node = document().getElementById("target")->firstChild(); |
708 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 4)); | 713 EXPECT_EQ(2, previousGraphemeBoundaryOf(node, 4)); |
709 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0)); | 714 EXPECT_EQ(2, nextGraphemeBoundaryOf(node, 0)); |
710 | 715 |
711 // For GB11, if trailing character is not Glue_After_Zwj or EBG, break happens
after ZWJ. | 716 // For GB11, if trailing character is not Glue_After_Zwj or EBG, break happens |
| 717 // after ZWJ. |
712 // U+1F5FA(WORLD MAP) doesn't have either Glue_After_Zwj or EBG. | 718 // U+1F5FA(WORLD MAP) doesn't have either Glue_After_Zwj or EBG. |
713 setBodyContent("<p id='target'>‍a</p>"); | 719 setBodyContent("<p id='target'>‍a</p>"); |
714 node = document().getElementById("target")->firstChild(); | 720 node = document().getElementById("target")->firstChild(); |
715 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); | 721 EXPECT_EQ(1, previousGraphemeBoundaryOf(node, 2)); |
716 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); | 722 EXPECT_EQ(1, nextGraphemeBoundaryOf(node, 0)); |
717 } | 723 } |
718 | 724 |
719 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace) { | 725 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace) { |
720 // BMP characters. Only one code point should be deleted. | 726 // BMP characters. Only one code point should be deleted. |
721 setBodyContent("<p id='target'>abc</p>"); | 727 setBodyContent("<p id='target'>abc</p>"); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 PositionMoveType::BackwardDeletion)); | 823 PositionMoveType::BackwardDeletion)); |
818 | 824 |
819 // Edge case: broken surrogate pairs. | 825 // Edge case: broken surrogate pairs. |
820 setBodyContent( | 826 setBodyContent( |
821 "<p id='target'>�</p>"); // � is unpaired lead surrogate. | 827 "<p id='target'>�</p>"); // � is unpaired lead surrogate. |
822 node = document().getElementById("target")->firstChild(); | 828 node = document().getElementById("target")->firstChild(); |
823 EXPECT_EQ(Position(node, 0), | 829 EXPECT_EQ(Position(node, 0), |
824 previousPositionOf(Position(node, 1), | 830 previousPositionOf(Position(node, 1), |
825 PositionMoveType::BackwardDeletion)); | 831 PositionMoveType::BackwardDeletion)); |
826 | 832 |
827 setBodyContent( | 833 // � is unpaired lead surrogate. |
828 "<p id='target'>👁�👁</p>"); // � is unpaired
lead surrogate. | 834 setBodyContent("<p id='target'>👁�👁</p>"); |
829 node = document().getElementById("target")->firstChild(); | 835 node = document().getElementById("target")->firstChild(); |
830 EXPECT_EQ(Position(node, 3), | 836 EXPECT_EQ(Position(node, 3), |
831 previousPositionOf(Position(node, 5), | 837 previousPositionOf(Position(node, 5), |
832 PositionMoveType::BackwardDeletion)); | 838 PositionMoveType::BackwardDeletion)); |
833 EXPECT_EQ(Position(node, 2), | 839 EXPECT_EQ(Position(node, 2), |
834 previousPositionOf(Position(node, 3), | 840 previousPositionOf(Position(node, 3), |
835 PositionMoveType::BackwardDeletion)); | 841 PositionMoveType::BackwardDeletion)); |
836 EXPECT_EQ(Position(node, 0), | 842 EXPECT_EQ(Position(node, 0), |
837 previousPositionOf(Position(node, 2), | 843 previousPositionOf(Position(node, 2), |
838 PositionMoveType::BackwardDeletion)); | 844 PositionMoveType::BackwardDeletion)); |
(...skipping 11 matching lines...) Expand all Loading... |
850 previousPositionOf(Position(node, 1), | 856 previousPositionOf(Position(node, 1), |
851 PositionMoveType::BackwardDeletion)); | 857 PositionMoveType::BackwardDeletion)); |
852 | 858 |
853 setBodyContent( | 859 setBodyContent( |
854 "<p id='target'>�</p>"); // � is unpaired trail surrogate. | 860 "<p id='target'>�</p>"); // � is unpaired trail surrogate. |
855 node = document().getElementById("target")->firstChild(); | 861 node = document().getElementById("target")->firstChild(); |
856 EXPECT_EQ(Position(node, 0), | 862 EXPECT_EQ(Position(node, 0), |
857 previousPositionOf(Position(node, 1), | 863 previousPositionOf(Position(node, 1), |
858 PositionMoveType::BackwardDeletion)); | 864 PositionMoveType::BackwardDeletion)); |
859 | 865 |
860 setBodyContent( | 866 // � is unpaired trail surrogate. |
861 "<p id='target'>👁�👁</p>"); // � is unpaired
trail surrogate. | 867 setBodyContent("<p id='target'>👁�👁</p>"); |
862 node = document().getElementById("target")->firstChild(); | 868 node = document().getElementById("target")->firstChild(); |
863 EXPECT_EQ(Position(node, 3), | 869 EXPECT_EQ(Position(node, 3), |
864 previousPositionOf(Position(node, 5), | 870 previousPositionOf(Position(node, 5), |
865 PositionMoveType::BackwardDeletion)); | 871 PositionMoveType::BackwardDeletion)); |
866 EXPECT_EQ(Position(node, 2), | 872 EXPECT_EQ(Position(node, 2), |
867 previousPositionOf(Position(node, 3), | 873 previousPositionOf(Position(node, 3), |
868 PositionMoveType::BackwardDeletion)); | 874 PositionMoveType::BackwardDeletion)); |
869 EXPECT_EQ(Position(node, 0), | 875 EXPECT_EQ(Position(node, 0), |
870 previousPositionOf(Position(node, 2), | 876 previousPositionOf(Position(node, 2), |
871 PositionMoveType::BackwardDeletion)); | 877 PositionMoveType::BackwardDeletion)); |
872 | 878 |
873 setBodyContent( | 879 // � is unpaired trail surrogate. |
874 "<p id='target'>a�a</p>"); // � is unpaired trail surrogate
. | 880 setBodyContent("<p id='target'>a�a</p>"); |
875 node = document().getElementById("target")->firstChild(); | 881 node = document().getElementById("target")->firstChild(); |
876 EXPECT_EQ(Position(node, 2), | 882 EXPECT_EQ(Position(node, 2), |
877 previousPositionOf(Position(node, 3), | 883 previousPositionOf(Position(node, 3), |
878 PositionMoveType::BackwardDeletion)); | 884 PositionMoveType::BackwardDeletion)); |
879 EXPECT_EQ(Position(node, 1), | 885 EXPECT_EQ(Position(node, 1), |
880 previousPositionOf(Position(node, 2), | 886 previousPositionOf(Position(node, 2), |
881 PositionMoveType::BackwardDeletion)); | 887 PositionMoveType::BackwardDeletion)); |
882 EXPECT_EQ(Position(node, 0), | 888 EXPECT_EQ(Position(node, 0), |
883 previousPositionOf(Position(node, 1), | 889 previousPositionOf(Position(node, 1), |
884 PositionMoveType::BackwardDeletion)); | 890 PositionMoveType::BackwardDeletion)); |
885 | 891 |
886 // Edge case: specify middle of surrogate pairs. | 892 // Edge case: specify middle of surrogate pairs. |
887 setBodyContent("<p id='target'>👁👁👁</p>"); | 893 setBodyContent("<p id='target'>👁👁👁</p>"); |
888 node = document().getElementById("target")->firstChild(); | 894 node = document().getElementById("target")->firstChild(); |
889 EXPECT_EQ(Position(node, 4), | 895 EXPECT_EQ(Position(node, 4), |
890 previousPositionOf(Position(node, 5), | 896 previousPositionOf(Position(node, 5), |
891 PositionMoveType::BackwardDeletion)); | 897 PositionMoveType::BackwardDeletion)); |
892 EXPECT_EQ(Position(node, 2), | 898 EXPECT_EQ(Position(node, 2), |
893 previousPositionOf(Position(node, 3), | 899 previousPositionOf(Position(node, 3), |
894 PositionMoveType::BackwardDeletion)); | 900 PositionMoveType::BackwardDeletion)); |
895 EXPECT_EQ(Position(node, 0), | 901 EXPECT_EQ(Position(node, 0), |
896 previousPositionOf(Position(node, 1), | 902 previousPositionOf(Position(node, 1), |
897 PositionMoveType::BackwardDeletion)); | 903 PositionMoveType::BackwardDeletion)); |
898 } | 904 } |
899 | 905 |
900 } // namespace blink | 906 } // namespace blink |
OLD | NEW |