Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc |
index dac3a1292c250aea7eaedbb1cb1efebf5e7e4b75..fe0b6d6283b0057bf82616f490b2cf233fdf7f2e 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc |
@@ -29,7 +29,8 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
const String& TestAppend(const String inputs[], int size) { |
items_.clear(); |
- NGInlineItemsBuilder builder(&items_); |
+ removed_indexes_.clear(); |
+ NGInlineItemsBuilder builder(&items_, &removed_indexes_); |
for (int i = 0; i < size; i++) |
builder.Append(inputs[i], style_.Get()); |
text_ = builder.ToString(); |
@@ -65,7 +66,17 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
EXPECT_EQ(current_offset, text_.length()); |
} |
+ void ValidateRemovedIndexes(const Vector<Vector<unsigned>>& expected) { |
+ ASSERT_EQ(expected.size(), removed_indexes_.size()); |
+ for (unsigned i = 0; i < expected.size(); ++i) { |
+ ASSERT_EQ(expected[i].size(), removed_indexes_[i].size()) << i; |
+ for (unsigned j = 0; j < expected[i].size(); ++j) |
+ EXPECT_EQ(expected[i][j], removed_indexes_[i][j]) << i << " " << j; |
+ } |
+ } |
+ |
Vector<NGInlineItem> items_; |
+ Vector<Vector<unsigned>> removed_indexes_; |
String text_; |
RefPtr<ComputedStyle> style_; |
}; |
@@ -77,159 +88,230 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
TEST_F(NGInlineItemsBuilderTest, CollapseSpaces) { |
String input("text text text text"); |
String collapsed("text text text text"); |
+ Vector<Vector<unsigned>> collapsed_result = {{10, 16, 17}}; |
+ Vector<Vector<unsigned>> uncollapsed_result = {{}}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateRemovedIndexes(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateRemovedIndexes(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTabs) { |
String input("text\ttext\t text \t text"); |
String collapsed("text text text text"); |
+ Vector<Vector<unsigned>> collapsed_result = {{10, 16, 17}}; |
+ Vector<Vector<unsigned>> uncollapsed_result = {{}}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateRemovedIndexes(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateRemovedIndexes(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewLines) { |
String input("text\ntext \n text\n\ntext"); |
String collapsed("text text text text"); |
+ Vector<Vector<unsigned>> collapsed_result = {{10, 11, 17}}; |
+ Vector<Vector<unsigned>> uncollapsed_result = {{}}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateRemovedIndexes(collapsed_result); |
TestWhitespaceValue("text\ntext\ntext\n\ntext", input, EWhiteSpace::kPreLine); |
+ ValidateRemovedIndexes({{9, 11}}); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateRemovedIndexes(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateRemovedIndexes(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlinesAsSpaces) { |
EXPECT_EQ("text text", TestAppend("text\ntext")); |
+ ValidateRemovedIndexes({{}}); |
EXPECT_EQ("text text", TestAppend("text\n\ntext")); |
+ ValidateRemovedIndexes({{5}}); |
EXPECT_EQ("text text", TestAppend("text \n\n text")); |
+ ValidateRemovedIndexes({{5, 6, 7}}); |
EXPECT_EQ("text text", TestAppend("text \n \n text")); |
+ ValidateRemovedIndexes({{5, 6, 7, 8}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", " text")) |
<< "Spaces are collapsed even when across elements."; |
+ ValidateRemovedIndexes({{}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingSpaces) { |
EXPECT_EQ("text", TestAppend(" text")); |
+ ValidateRemovedIndexes({{0, 1}}); |
EXPECT_EQ("text", TestAppend(" ", "text")); |
+ ValidateRemovedIndexes({{0}, {}}); |
EXPECT_EQ("text", TestAppend(" ", " text")); |
+ ValidateRemovedIndexes({{0}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingSpaces) { |
EXPECT_EQ("text", TestAppend("text ")); |
+ ValidateRemovedIndexes({{4, 5}}); |
EXPECT_EQ("text", TestAppend("text", " ")); |
+ ValidateRemovedIndexes({{}, {0}}); |
EXPECT_EQ("text", TestAppend("text ", " ")); |
+ ValidateRemovedIndexes({{4}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAllSpaces) { |
EXPECT_EQ("", TestAppend(" ")); |
+ ValidateRemovedIndexes({{0, 1}}); |
EXPECT_EQ("", TestAppend(" ", " ")); |
+ ValidateRemovedIndexes({{0, 1}, {0, 1}}); |
EXPECT_EQ("", TestAppend(" ", "\n")); |
+ ValidateRemovedIndexes({{0, 1}, {0}}); |
EXPECT_EQ("", TestAppend("\n", " ")); |
+ ValidateRemovedIndexes({{0}, {0, 1}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingNewlines) { |
EXPECT_EQ("text", TestAppend("\ntext")); |
+ ValidateRemovedIndexes({{0}}); |
EXPECT_EQ("text", TestAppend("\n\ntext")); |
+ ValidateRemovedIndexes({{0, 1}}); |
EXPECT_EQ("text", TestAppend("\n", "text")); |
+ ValidateRemovedIndexes({{0}, {}}); |
EXPECT_EQ("text", TestAppend("\n\n", "text")); |
+ ValidateRemovedIndexes({{0, 1}, {}}); |
EXPECT_EQ("text", TestAppend(" \n", "text")); |
+ ValidateRemovedIndexes({{0, 1}, {}}); |
EXPECT_EQ("text", TestAppend("\n", " text")); |
+ ValidateRemovedIndexes({{0}, {0}}); |
EXPECT_EQ("text", TestAppend("\n\n", " text")); |
+ ValidateRemovedIndexes({{0, 1}, {0}}); |
EXPECT_EQ("text", TestAppend(" \n", " text")); |
+ ValidateRemovedIndexes({{0, 1}, {0}}); |
EXPECT_EQ("text", TestAppend("\n", "\ntext")); |
+ ValidateRemovedIndexes({{0}, {0}}); |
EXPECT_EQ("text", TestAppend("\n\n", "\ntext")); |
+ ValidateRemovedIndexes({{0, 1}, {0}}); |
EXPECT_EQ("text", TestAppend(" \n", "\ntext")); |
+ ValidateRemovedIndexes({{0, 1}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingNewlines) { |
EXPECT_EQ("text", TestAppend("text\n")); |
+ ValidateRemovedIndexes({{4}}); |
EXPECT_EQ("text", TestAppend("text", "\n")); |
+ ValidateRemovedIndexes({{}, {0}}); |
EXPECT_EQ("text", TestAppend("text\n", "\n")); |
+ ValidateRemovedIndexes({{4}, {0}}); |
EXPECT_EQ("text", TestAppend("text\n", " ")); |
+ ValidateRemovedIndexes({{4}, {0}}); |
EXPECT_EQ("text", TestAppend("text ", "\n")); |
+ ValidateRemovedIndexes({{4}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeNewlineAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", "\ntext")); |
+ ValidateRemovedIndexes({{}, {0}}); |
EXPECT_EQ("text text", TestAppend("text", " ", "\ntext")); |
+ ValidateRemovedIndexes({{}, {}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeAndAfterNewline) { |
SetWhiteSpace(EWhiteSpace::kPreLine); |
EXPECT_EQ("text\ntext", TestAppend("text \n text")) |
<< "Spaces before and after newline are removed."; |
+ ValidateRemovedIndexes({{4, 5, 7, 8}}); |
} |
TEST_F(NGInlineItemsBuilderTest, |
CollapsibleSpaceAfterNonCollapsibleSpaceAcrossElements) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilder builder(&items_, &removed_indexes_); |
RefPtr<ComputedStyle> pre_wrap(CreateWhitespaceStyle(EWhiteSpace::kPreWrap)); |
builder.Append("text ", pre_wrap.Get()); |
builder.Append(" text", style_.Get()); |
EXPECT_EQ("text text", builder.ToString()) |
<< "The whitespace in constructions like '<span style=\"white-space: " |
"pre-wrap\">text <span><span> text</span>' does not collapse."; |
+ ValidateRemovedIndexes({{}, {}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseZeroWidthSpaces) { |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B\ntext")) |
<< "Newline is removed if the character before is ZWS."; |
+ ValidateRemovedIndexes({{5}}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n\u200Btext")) |
<< "Newline is removed if the character after is ZWS."; |
+ ValidateRemovedIndexes({{4}}); |
EXPECT_EQ(String(u"text\u200B\u200Btext"), |
TestAppend(u"text\u200B\n\u200Btext")) |
<< "Newline is removed if the character before/after is ZWS."; |
+ ValidateRemovedIndexes({{5}}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n", u"\u200Btext")) |
<< "Newline is removed if the character after across elements is ZWS."; |
+ ValidateRemovedIndexes({{4}, {}}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B", u"\ntext")) |
<< "Newline is removed if the character before is ZWS even across " |
"elements."; |
+ ValidateRemovedIndexes({{}, {0}}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text \n", u"\u200Btext")) |
<< "Collapsible space before newline does not affect the result."; |
+ ValidateRemovedIndexes({{4, 5}, {}}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B\n", u" text")) |
<< "Collapsible space after newline is removed even when the " |
"newline was removed."; |
+ ValidateRemovedIndexes({{5}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) { |
EXPECT_EQ(String(u"\u4E00\u4E00"), TestAppend(u"\u4E00\n\u4E00")) |
<< "Newline is removed when both sides are Wide."; |
+ ValidateRemovedIndexes({{1}}); |
EXPECT_EQ(String(u"\u4E00 A"), TestAppend(u"\u4E00\nA")) |
<< "Newline is not removed when after is Narrow."; |
+ ValidateRemovedIndexes({{}}); |
EXPECT_EQ(String(u"A \u4E00"), TestAppend(u"A\n\u4E00")) |
<< "Newline is not removed when before is Narrow."; |
+ ValidateRemovedIndexes({{}}); |
EXPECT_EQ(String(u"\u4E00\u4E00"), TestAppend(u"\u4E00\n", u"\u4E00")) |
<< "Newline at the end of elements is removed when both sides are Wide."; |
+ ValidateRemovedIndexes({{1}, {}}); |
EXPECT_EQ(String(u"\u4E00\u4E00"), TestAppend(u"\u4E00", u"\n\u4E00")) |
<< "Newline at the beginning of elements is removed " |
"when both sides are Wide."; |
+ ValidateRemovedIndexes({{}, {0}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilder builder(&items_, &removed_indexes_); |
builder.Append("Hello ", style_.Get()); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
builder.Append(" World", style_.Get()); |
EXPECT_EQ(String(u"Hello \uFFFC World"), builder.ToString()); |
+ ValidateRemovedIndexes({{}, {}}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilder builder(&items_, &removed_indexes_); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
builder.Append("\n", style_.Get()); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
@@ -238,11 +320,13 @@ TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { |
EXPECT_EQ(nullptr, items_[0].Style()); |
EXPECT_EQ(style_.Get(), items_[1].Style()); |
EXPECT_EQ(nullptr, items_[2].Style()); |
+ ValidateRemovedIndexes({{}}); |
} |
TEST_F(NGInlineItemsBuilderTest, AppendEmptyString) { |
EXPECT_EQ("", TestAppend("")); |
EXPECT_EQ(0u, items_.size()); |
+ ValidateRemovedIndexes({{}}); |
} |
TEST_F(NGInlineItemsBuilderTest, NewLines) { |
@@ -255,21 +339,23 @@ TEST_F(NGInlineItemsBuilderTest, NewLines) { |
EXPECT_EQ(NGInlineItem::kControl, items_[3].Type()); |
EXPECT_EQ(NGInlineItem::kText, items_[4].Type()); |
EXPECT_EQ(NGInlineItem::kControl, items_[5].Type()); |
+ ValidateRemovedIndexes({{}}); |
} |
TEST_F(NGInlineItemsBuilderTest, Empty) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilder builder(&items, &removed_indexes_); |
RefPtr<ComputedStyle> block_style(ComputedStyle::Create()); |
builder.EnterBlock(block_style.Get()); |
builder.ExitBlock(); |
EXPECT_EQ("", builder.ToString()); |
+ ValidateRemovedIndexes({}); |
} |
TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilder builder(&items, &removed_indexes_); |
RefPtr<ComputedStyle> block_style(ComputedStyle::Create()); |
block_style->SetUnicodeBidi(UnicodeBidi::kBidiOverride); |
block_style->SetDirection(TextDirection::kRtl); |
@@ -283,6 +369,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
u"Hello" |
u"\u202C"), |
builder.ToString()); |
+ ValidateRemovedIndexes({{}}); |
} |
static std::unique_ptr<LayoutInline> CreateLayoutInline( |
@@ -296,7 +383,7 @@ static std::unique_ptr<LayoutInline> CreateLayoutInline( |
TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilder builder(&items, &removed_indexes_); |
builder.Append("Hello ", style_.Get()); |
std::unique_ptr<LayoutInline> isolate_rtl( |
CreateLayoutInline([](ComputedStyle* style) { |
@@ -316,11 +403,12 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { |
u"\u2069" |
u" World"), |
builder.ToString()); |
+ ValidateRemovedIndexes({{}, {}, {}}); |
} |
TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilder builder(&items, &removed_indexes_); |
builder.Append("Hello ", style_.Get()); |
std::unique_ptr<LayoutInline> isolate_override_rtl( |
CreateLayoutInline([](ComputedStyle* style) { |
@@ -340,6 +428,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { |
u"\u202C\u2069" |
u" World"), |
builder.ToString()); |
+ ValidateRemovedIndexes({{}, {}, {}}); |
} |
} // namespace |