| 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
|
|
|