| 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 |