| Index: third_party/WebKit/Source/core/editing/EditingUtilitiesTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/EditingUtilitiesTest.cpp b/third_party/WebKit/Source/core/editing/EditingUtilitiesTest.cpp
|
| index 4a04eeb8161b5e569953f66a124d3e1721fdbe16..4d447d197ed5a4a6336ebb730e22758067607561 100644
|
| --- a/third_party/WebKit/Source/core/editing/EditingUtilitiesTest.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/EditingUtilitiesTest.cpp
|
| @@ -642,4 +642,102 @@ TEST_F(EditingUtilitiesTest, uncheckedPreviousNextOffset)
|
| EXPECT_EQ(1, uncheckedNextOffset(node, 0));
|
| }
|
|
|
| +TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace)
|
| +{
|
| + // BMP characters. Only one code point should be deleted.
|
| + setBodyContent("<p id='target'>abc</p>");
|
| + Node* node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +}
|
| +
|
| +TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_FirstLetter)
|
| +{
|
| +
|
| + setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>abc</p>");
|
| + Node* node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>(a)bc</p>");
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +}
|
| +
|
| +TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_TextTransform)
|
| +{
|
| + // Uppercase of ß will be transformed to SS.
|
| + setBodyContent("<style>p {text-transform:uppercase}</style><p id='target'>ßabc</p>");
|
| + Node* node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +}
|
| +
|
| +TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_SurrogatePairs)
|
| +{
|
| + // Supplementary plane characters. Only one code point should be deleted.
|
| + // 👁 is EYE.
|
| + setBodyContent("<p id='target'>👁👁👁</p>");
|
| + Node* node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 6), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 4), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| +
|
| + // BMP and Supplementary plane case.
|
| + setBodyContent("<p id='target'>👁a👁a</p>");
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 5), previousPositionOf(Position(node, 6), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| +
|
| + // Edge case: broken surrogate pairs.
|
| + setBodyContent("<p id='target'>�</p>"); // � is unpaired lead surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<p id='target'>👁�👁</p>"); // � is unpaired lead surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<p id='target'>a�a</p>"); // � is unpaired lead surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<p id='target'>�</p>"); // � is unpaired trail surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<p id='target'>👁�👁</p>"); // � is unpaired trail surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| +
|
| + setBodyContent("<p id='target'>a�a</p>"); // � is unpaired trail surrogate.
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +
|
| + // Edge case: specify middle of surrogate pairs.
|
| + setBodyContent("<p id='target'>👁👁👁</p>");
|
| + node = document().getElementById("target")->firstChild();
|
| + EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionMoveType::BackwardDeletion));
|
| + EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionMoveType::BackwardDeletion));
|
| +}
|
| +
|
| } // namespace blink
|
|
|