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..0c5b9fdf1ef95df82b4ae4bdc2fa90a3dce76249 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 |
@@ -13,6 +13,8 @@ namespace blink { |
namespace { |
+using AppendResult = NGInlineItemsBuilder::AppendResult; |
+ |
static PassRefPtr<ComputedStyle> CreateWhitespaceStyle(EWhiteSpace whitespace) { |
RefPtr<ComputedStyle> style(ComputedStyle::Create()); |
style->SetWhiteSpace(whitespace); |
@@ -29,9 +31,12 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
const String& TestAppend(const String inputs[], int size) { |
items_.clear(); |
+ append_results_.clear(); |
NGInlineItemsBuilder builder(&items_); |
for (int i = 0; i < size; i++) |
- builder.Append(inputs[i], style_.Get()); |
+ append_results_.push_back(builder.Append(inputs[i], style_.Get())); |
+ if (builder.Finalize()) |
+ append_results_.push_back(AppendResult(true, {})); |
text_ = builder.ToString(); |
ValidateItems(); |
return text_; |
@@ -65,7 +70,20 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
EXPECT_EQ(current_offset, text_.length()); |
} |
+ void ValidateAppendResults(const Vector<AppendResult>& expected) { |
+ ASSERT_EQ(expected.size(), append_results_.size()); |
+ for (unsigned i = 0; i < expected.size(); ++i) { |
+ EXPECT_EQ(expected[i].first, append_results_[i].first) << i; |
+ ASSERT_EQ(expected[i].second.size(), append_results_[i].second.size()) |
+ << i; |
+ for (unsigned j = 0; j < expected[i].second.size(); ++j) |
+ EXPECT_EQ(expected[i].second[j], append_results_[i].second[j]) |
+ << i << " " << j; |
+ } |
+ } |
+ |
Vector<NGInlineItem> items_; |
+ Vector<AppendResult> append_results_; |
String text_; |
RefPtr<ComputedStyle> style_; |
}; |
@@ -77,172 +95,270 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
TEST_F(NGInlineItemsBuilderTest, CollapseSpaces) { |
String input("text text text text"); |
String collapsed("text text text text"); |
+ Vector<AppendResult> collapsed_result = { |
+ AppendResult(false, {10u, 16u, 17u})}; |
+ Vector<AppendResult> uncollapsed_result = {AppendResult(false, {})}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateAppendResults(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateAppendResults(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTabs) { |
String input("text\ttext\t text \t text"); |
String collapsed("text text text text"); |
+ Vector<AppendResult> collapsed_result = { |
+ AppendResult(false, {10u, 16u, 17u})}; |
+ Vector<AppendResult> uncollapsed_result = {AppendResult(false, {})}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateAppendResults(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateAppendResults(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewLines) { |
String input("text\ntext \n text\n\ntext"); |
String collapsed("text text text text"); |
+ Vector<AppendResult> collapsed_result = { |
+ AppendResult(false, {10u, 11u, 17u})}; |
+ Vector<AppendResult> uncollapsed_result = {AppendResult(false, {})}; |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
+ ValidateAppendResults(collapsed_result); |
TestWhitespaceValue("text\ntext\ntext\n\ntext", input, EWhiteSpace::kPreLine); |
+ ValidateAppendResults({AppendResult(false, {9u, 11u})}); |
TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
+ ValidateAppendResults(uncollapsed_result); |
TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ ValidateAppendResults(uncollapsed_result); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlinesAsSpaces) { |
EXPECT_EQ("text text", TestAppend("text\ntext")); |
+ ValidateAppendResults({AppendResult(false, {})}); |
EXPECT_EQ("text text", TestAppend("text\n\ntext")); |
+ ValidateAppendResults({AppendResult(false, {5u})}); |
EXPECT_EQ("text text", TestAppend("text \n\n text")); |
+ ValidateAppendResults({AppendResult(false, {5u, 6u, 7u})}); |
EXPECT_EQ("text text", TestAppend("text \n \n text")); |
+ ValidateAppendResults({AppendResult(false, {5u, 6u, 7u, 8u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", " text")) |
<< "Spaces are collapsed even when across elements."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingSpaces) { |
EXPECT_EQ("text", TestAppend(" text")); |
+ ValidateAppendResults({AppendResult(false, {0u, 1u})}); |
EXPECT_EQ("text", TestAppend(" ", "text")); |
+ ValidateAppendResults({AppendResult(false, {0u}), AppendResult(false, {})}); |
EXPECT_EQ("text", TestAppend(" ", " text")); |
+ ValidateAppendResults({AppendResult(false, {0u}), AppendResult(false, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingSpaces) { |
EXPECT_EQ("text", TestAppend("text ")); |
+ ValidateAppendResults({AppendResult(false, {5u}), AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text", " ")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {}), |
+ AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text ", " ")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u}), |
+ AppendResult(true, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAllSpaces) { |
EXPECT_EQ("", TestAppend(" ")); |
+ ValidateAppendResults({AppendResult(false, {0u, 1u})}); |
EXPECT_EQ("", TestAppend(" ", " ")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u, 1u})}); |
EXPECT_EQ("", TestAppend(" ", "\n")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u})}); |
EXPECT_EQ("", TestAppend("\n", " ")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u}), AppendResult(false, {0u, 1u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingNewlines) { |
EXPECT_EQ("text", TestAppend("\ntext")); |
+ ValidateAppendResults({AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend("\n\ntext")); |
+ ValidateAppendResults({AppendResult(false, {0u, 1u})}); |
EXPECT_EQ("text", TestAppend("\n", "text")); |
+ ValidateAppendResults({AppendResult(false, {0u}), AppendResult(false, {})}); |
EXPECT_EQ("text", TestAppend("\n\n", "text")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {})}); |
EXPECT_EQ("text", TestAppend(" \n", "text")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {})}); |
EXPECT_EQ("text", TestAppend("\n", " text")); |
+ ValidateAppendResults({AppendResult(false, {0u}), AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend("\n\n", " text")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend(" \n", " text")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend("\n", "\ntext")); |
+ ValidateAppendResults({AppendResult(false, {0u}), AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend("\n\n", "\ntext")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u})}); |
EXPECT_EQ("text", TestAppend(" \n", "\ntext")); |
+ ValidateAppendResults( |
+ {AppendResult(false, {0u, 1u}), AppendResult(false, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingNewlines) { |
EXPECT_EQ("text", TestAppend("text\n")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text", "\n")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {}), |
+ AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text\n", "\n")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u}), |
+ AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text\n", " ")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u}), |
+ AppendResult(true, {})}); |
EXPECT_EQ("text", TestAppend("text ", "\n")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u}), |
+ AppendResult(true, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeNewlineAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", "\ntext")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u})}); |
EXPECT_EQ("text text", TestAppend("text", " ", "\ntext")); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {}), |
+ AppendResult(false, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeAndAfterNewline) { |
SetWhiteSpace(EWhiteSpace::kPreLine); |
EXPECT_EQ("text\ntext", TestAppend("text \n text")) |
<< "Spaces before and after newline are removed."; |
+ ValidateAppendResults({AppendResult(false, {4u, 5u, 7u, 8u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, |
CollapsibleSpaceAfterNonCollapsibleSpaceAcrossElements) { |
NGInlineItemsBuilder builder(&items_); |
RefPtr<ComputedStyle> pre_wrap(CreateWhitespaceStyle(EWhiteSpace::kPreWrap)); |
- builder.Append("text ", pre_wrap.Get()); |
- builder.Append(" text", style_.Get()); |
+ append_results_.push_back(builder.Append("text ", pre_wrap.Get())); |
+ append_results_.push_back(builder.Append(" text", style_.Get())); |
+ if (builder.Finalize()) |
+ append_results_.push_back(AppendResult(true, {})); |
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."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseZeroWidthSpaces) { |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B\ntext")) |
<< "Newline is removed if the character before is ZWS."; |
+ ValidateAppendResults({AppendResult(false, {5u})}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n\u200Btext")) |
<< "Newline is removed if the character after is ZWS."; |
+ ValidateAppendResults({AppendResult(false, {4u})}); |
EXPECT_EQ(String(u"text\u200B\u200Btext"), |
TestAppend(u"text\u200B\n\u200Btext")) |
<< "Newline is removed if the character before/after is ZWS."; |
+ ValidateAppendResults({AppendResult(false, {5u})}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n", u"\u200Btext")) |
<< "Newline is removed if the character after across elements is ZWS."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(true, {})}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B", u"\ntext")) |
<< "Newline is removed if the character before is ZWS even across " |
"elements."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u})}); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text \n", u"\u200Btext")) |
<< "Collapsible space before newline does not affect the result."; |
+ ValidateAppendResults({AppendResult(false, {5u}), AppendResult(true, {})}); |
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."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(true, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) { |
EXPECT_EQ(String(u"\u4E00\u4E00"), TestAppend(u"\u4E00\n\u4E00")) |
<< "Newline is removed when both sides are Wide."; |
+ ValidateAppendResults({AppendResult(false, {1u})}); |
EXPECT_EQ(String(u"\u4E00 A"), TestAppend(u"\u4E00\nA")) |
<< "Newline is not removed when after is Narrow."; |
+ ValidateAppendResults({AppendResult(false, {})}); |
EXPECT_EQ(String(u"A \u4E00"), TestAppend(u"A\n\u4E00")) |
<< "Newline is not removed when before is Narrow."; |
+ ValidateAppendResults({AppendResult(false, {})}); |
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."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(true, {})}); |
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."; |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {0u})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) { |
NGInlineItemsBuilder builder(&items_); |
- builder.Append("Hello ", style_.Get()); |
+ append_results_.push_back(builder.Append("Hello ", style_.Get())); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
- builder.Append(" World", style_.Get()); |
+ append_results_.push_back(builder.Append(" World", style_.Get())); |
+ if (builder.Finalize()) |
+ append_results_.push_back(AppendResult(true, {})); |
EXPECT_EQ(String(u"Hello \uFFFC World"), builder.ToString()); |
+ ValidateAppendResults({AppendResult(false, {}), AppendResult(false, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { |
NGInlineItemsBuilder builder(&items_); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
- builder.Append("\n", style_.Get()); |
+ append_results_.push_back(builder.Append("\n", style_.Get())); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
+ if (builder.Finalize()) |
+ append_results_.push_back(AppendResult(true, {})); |
EXPECT_EQ(String(u"\uFFFC \uFFFC"), builder.ToString()); |
EXPECT_EQ(3u, items_.size()); |
EXPECT_EQ(nullptr, items_[0].Style()); |
EXPECT_EQ(style_.Get(), items_[1].Style()); |
EXPECT_EQ(nullptr, items_[2].Style()); |
+ ValidateAppendResults({AppendResult(false, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, AppendEmptyString) { |
EXPECT_EQ("", TestAppend("")); |
EXPECT_EQ(0u, items_.size()); |
+ ValidateAppendResults({AppendResult(false, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, NewLines) { |
@@ -255,6 +371,7 @@ 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()); |
+ ValidateAppendResults({AppendResult(false, {})}); |
} |
TEST_F(NGInlineItemsBuilderTest, Empty) { |
@@ -263,8 +380,11 @@ TEST_F(NGInlineItemsBuilderTest, Empty) { |
RefPtr<ComputedStyle> block_style(ComputedStyle::Create()); |
builder.EnterBlock(block_style.Get()); |
builder.ExitBlock(); |
+ if (builder.Finalize()) |
+ append_results_.push_back(AppendResult(true, {})); |
EXPECT_EQ("", builder.ToString()); |
+ ValidateAppendResults({}); |
} |
TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
@@ -276,6 +396,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
builder.EnterBlock(block_style.Get()); |
builder.Append("Hello", style_.Get()); |
builder.ExitBlock(); |
+ builder.Finalize(); |
// Expected control characters as defined in: |
// https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-table |
@@ -307,6 +428,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { |
builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.Get()); |
builder.ExitInline(isolate_rtl.get()); |
builder.Append(" World", style_.Get()); |
+ builder.Finalize(); |
// Expected control characters as defined in: |
// https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-table |
@@ -331,6 +453,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { |
builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.Get()); |
builder.ExitInline(isolate_override_rtl.get()); |
builder.Append(" World", style_.Get()); |
+ builder.Finalize(); |
// Expected control characters as defined in: |
// https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-table |