Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc

Issue 2943573002: Make NGInlineItemsBuilder construct whitespace-collapsed offset mapping (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698