| 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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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
b</p>"); | 261 setBodyContent("<p id='target'>a
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
b</p>"); // CR | 271 setBodyContent("<p id='target'>a
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 Loading... |
| 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 = "🇺🇸"; // US flag. | 392 const std::string flag = "🇺🇸"; // 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 + "🇸b<
/p>"); // RI ÷ RI | 423 setBodyContent("<p id='target'>a" + flag + flag + flag + flag + "🇸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'>àb</p>"); // x Extend | 442 setBodyContent("<p id='target'>à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‍b</p>"); // x ZWJ | 449 setBodyContent("<p id='target'>a‍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ःb</p>"); // x SpacingMark | 458 setBodyContent("<p id='target'>aः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؀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เ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ガb</p>"); | 480 setBodyContent("<p id='target'>aガ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अ्कb</p>"); | 494 setBodyContent("<p id='target'>aअ्क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அ்கb</p>"); | 505 // IndicSyllabicCategory=Virama. |
| 506 setBodyContent("<p id='target'>aกฺก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🎅🏻b</p>"); // E_Base x E_Mod
ifier | 520 setBodyContent("<p id='target'>a🎅🏻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👦🏻b</p>"); // EBG x E_Modifi
er | 529 setBodyContent("<p id='target'>a👦🏻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‍❤b</p>"); // ZWJ x Glue_After
_Zwj | 540 setBodyContent("<p id='target'>a‍❤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‍👦b</p>"); // ZWJ x EBG | 546 setBodyContent("<p id='target'>a‍👦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 Loading... |
| 734 | 724 |
| 735 // Edge case: specify middle of surrogate pairs. | 725 // Edge case: specify middle of surrogate pairs. |
| 736 setBodyContent("<p id='target'>👁👁👁</p>"); | 726 setBodyContent("<p id='target'>👁👁👁</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 |
| OLD | NEW |