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 5bd4a543daf576bd9e4d76678672b616c373468c..8d99660d1a20c87d043d18293eebfc9b680bb43c 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 |
@@ -6,6 +6,7 @@ |
#include "core/layout/LayoutInline.h" |
#include "core/layout/ng/inline/ng_inline_node.h" |
+#include "core/layout/ng/inline/ng_offset_mapping_builder.h" |
#include "core/style/ComputedStyle.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -19,6 +20,28 @@ static PassRefPtr<ComputedStyle> CreateWhitespaceStyle(EWhiteSpace whitespace) { |
return style; |
} |
+static String GetCollapsed(const NGOffsetMappingBuilder& builder) { |
+ Vector<unsigned> mapping = builder.DumpOffsetMappingForTesting(); |
+ |
+ Vector<unsigned> collapsed_indexes; |
+ for (unsigned i = 0; i + 1 < mapping.size(); ++i) { |
+ if (mapping[i] == mapping[i + 1]) |
+ collapsed_indexes.push_back(i); |
+ } |
+ |
+ StringBuilder result; |
+ result.Append('{'); |
+ bool first = true; |
+ for (unsigned index : collapsed_indexes) { |
+ if (!first) |
+ result.Append(", "); |
+ result.AppendNumber(index); |
+ first = false; |
+ } |
+ result.Append('}'); |
+ return result.ToString(); |
+} |
+ |
class NGInlineItemsBuilderTest : public ::testing::Test { |
protected: |
void SetUp() override { style_ = ComputedStyle::Create(); } |
@@ -29,10 +52,11 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
const String& TestAppend(const String inputs[], int size) { |
items_.clear(); |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items_); |
for (int i = 0; i < size; i++) |
builder.Append(inputs[i], style_.Get()); |
text_ = builder.ToString(); |
+ collapsed_ = GetCollapsed(builder.GetOffsetMappingBuilder()); |
ValidateItems(); |
return text_; |
} |
@@ -67,161 +91,225 @@ class NGInlineItemsBuilderTest : public ::testing::Test { |
Vector<NGInlineItem> items_; |
String text_; |
+ String collapsed_; |
RefPtr<ComputedStyle> style_; |
}; |
-#define TestWhitespaceValue(expected, input, whitespace) \ |
- SetWhiteSpace(whitespace); \ |
- EXPECT_EQ(expected, TestAppend(input)) << "white-space: " #whitespace; |
+#define TestWhitespaceValue(expected_text, expected_collapsed, input, \ |
+ whitespace) \ |
+ SetWhiteSpace(whitespace); \ |
+ EXPECT_EQ(expected_text, TestAppend(input)) << "white-space: " #whitespace; \ |
+ EXPECT_EQ(expected_collapsed, collapsed_); |
TEST_F(NGInlineItemsBuilderTest, CollapseSpaces) { |
String input("text text text text"); |
String collapsed("text text text text"); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ String collapsed_indexes("{10, 16, 17}"); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNormal); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNowrap); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kWebkitNowrap); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kPreLine); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPre); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPreWrap); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTabs) { |
- String input("text\ttext\t text \t text"); |
+ String input("text text text text"); |
String collapsed("text text text text"); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ String collapsed_indexes("{10, 16, 17}"); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNormal); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNowrap); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kWebkitNowrap); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kPreLine); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPre); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPreWrap); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewLines) { |
String input("text\ntext \n text\n\ntext"); |
String collapsed("text text text text"); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
- TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
- TestWhitespaceValue("text\ntext\ntext\n\ntext", input, EWhiteSpace::kPreLine); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
- TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
+ String collapsed_indexes("{10, 11, 17}"); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNormal); |
+ TestWhitespaceValue(collapsed, collapsed_indexes, input, |
+ EWhiteSpace::kNowrap); |
+ TestWhitespaceValue("text\ntext\ntext\n\ntext", "{9, 11}", input, |
+ EWhiteSpace::kPreLine); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPre); |
+ TestWhitespaceValue(input, "{}", input, EWhiteSpace::kPreWrap); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlinesAsSpaces) { |
EXPECT_EQ("text text", TestAppend("text\ntext")); |
+ EXPECT_EQ("{}", collapsed_); |
EXPECT_EQ("text text", TestAppend("text\n\ntext")); |
+ EXPECT_EQ("{5}", collapsed_); |
EXPECT_EQ("text text", TestAppend("text \n\n text")); |
+ EXPECT_EQ("{5, 6, 7}", collapsed_); |
EXPECT_EQ("text text", TestAppend("text \n \n text")); |
+ EXPECT_EQ("{5, 6, 7, 8}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", " text")) |
<< "Spaces are collapsed even when across elements."; |
+ EXPECT_EQ("{5}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingSpaces) { |
EXPECT_EQ("text", TestAppend(" text")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend(" ", "text")); |
+ EXPECT_EQ("{0}", collapsed_); |
EXPECT_EQ("text", TestAppend(" ", " text")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingSpaces) { |
EXPECT_EQ("text", TestAppend("text ")); |
+ EXPECT_EQ("{4, 5}", collapsed_); |
EXPECT_EQ("text", TestAppend("text", " ")); |
+ EXPECT_EQ("{4}", collapsed_); |
EXPECT_EQ("text", TestAppend("text ", " ")); |
+ EXPECT_EQ("{4, 5}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAllSpaces) { |
EXPECT_EQ("", TestAppend(" ")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("", TestAppend(" ", " ")); |
+ EXPECT_EQ("{0, 1, 2, 3}", collapsed_); |
EXPECT_EQ("", TestAppend(" ", "\n")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
EXPECT_EQ("", TestAppend("\n", " ")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseLeadingNewlines) { |
EXPECT_EQ("text", TestAppend("\ntext")); |
+ EXPECT_EQ("{0}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n\ntext")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n", "text")); |
+ EXPECT_EQ("{0}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n\n", "text")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend(" \n", "text")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n", " text")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n\n", " text")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
EXPECT_EQ("text", TestAppend(" \n", " text")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n", "\ntext")); |
+ EXPECT_EQ("{0, 1}", collapsed_); |
EXPECT_EQ("text", TestAppend("\n\n", "\ntext")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
EXPECT_EQ("text", TestAppend(" \n", "\ntext")); |
+ EXPECT_EQ("{0, 1, 2}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseTrailingNewlines) { |
EXPECT_EQ("text", TestAppend("text\n")); |
+ EXPECT_EQ("{4}", collapsed_); |
EXPECT_EQ("text", TestAppend("text", "\n")); |
+ EXPECT_EQ("{4}", collapsed_); |
EXPECT_EQ("text", TestAppend("text\n", "\n")); |
+ EXPECT_EQ("{4, 5}", collapsed_); |
EXPECT_EQ("text", TestAppend("text\n", " ")); |
+ EXPECT_EQ("{4, 5}", collapsed_); |
EXPECT_EQ("text", TestAppend("text ", "\n")); |
+ EXPECT_EQ("{4, 5}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeNewlineAcrossElements) { |
EXPECT_EQ("text text", TestAppend("text ", "\ntext")); |
+ EXPECT_EQ("{5}", collapsed_); |
EXPECT_EQ("text text", TestAppend("text", " ", "\ntext")); |
+ EXPECT_EQ("{5}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseBeforeAndAfterNewline) { |
SetWhiteSpace(EWhiteSpace::kPreLine); |
EXPECT_EQ("text\ntext", TestAppend("text \n text")) |
<< "Spaces before and after newline are removed."; |
+ EXPECT_EQ("{4, 5, 7, 8}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, |
CollapsibleSpaceAfterNonCollapsibleSpaceAcrossElements) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items_); |
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."; |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseZeroWidthSpaces) { |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B\ntext")) |
<< "Newline is removed if the character before is ZWS."; |
+ EXPECT_EQ("{5}", collapsed_); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n\u200Btext")) |
<< "Newline is removed if the character after is ZWS."; |
+ EXPECT_EQ("{4}", collapsed_); |
EXPECT_EQ(String(u"text\u200B\u200Btext"), |
TestAppend(u"text\u200B\n\u200Btext")) |
<< "Newline is removed if the character before/after is ZWS."; |
+ EXPECT_EQ("{5}", collapsed_); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\n", u"\u200Btext")) |
<< "Newline is removed if the character after across elements is ZWS."; |
+ EXPECT_EQ("{4}", collapsed_); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B", u"\ntext")) |
<< "Newline is removed if the character before is ZWS even across " |
"elements."; |
+ EXPECT_EQ("{5}", collapsed_); |
EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text \n", u"\u200Btext")) |
<< "Collapsible space before newline does not affect the result."; |
+ EXPECT_EQ("{4, 5}", collapsed_); |
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."; |
+ EXPECT_EQ("{5, 6}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) { |
EXPECT_EQ(String(u"\u4E00\u4E00"), TestAppend(u"\u4E00\n\u4E00")) |
<< "Newline is removed when both sides are Wide."; |
+ EXPECT_EQ("{1}", collapsed_); |
EXPECT_EQ(String(u"\u4E00 A"), TestAppend(u"\u4E00\nA")) |
<< "Newline is not removed when after is Narrow."; |
+ EXPECT_EQ("{}", collapsed_); |
EXPECT_EQ(String(u"A \u4E00"), TestAppend(u"A\n\u4E00")) |
<< "Newline is not removed when before is Narrow."; |
+ EXPECT_EQ("{}", collapsed_); |
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."; |
+ EXPECT_EQ("{1}", collapsed_); |
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."; |
+ EXPECT_EQ("{1}", collapsed_); |
} |
TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items_); |
builder.Append("Hello ", style_.Get()); |
builder.AppendOpaque(NGInlineItem::kBidiControl, |
kFirstStrongIsolateCharacter); |
@@ -230,18 +318,20 @@ TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) { |
kFirstStrongIsolateCharacter); |
builder.Append(" World", style_.Get()); |
EXPECT_EQ(String(u"Hello \u2068\u2068World"), builder.ToString()); |
+ EXPECT_EQ("{7, 9}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items_); |
builder.Append("Hello ", style_.Get()); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
builder.Append(" World", style_.Get()); |
EXPECT_EQ(String(u"Hello \uFFFC World"), builder.ToString()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { |
- NGInlineItemsBuilder builder(&items_); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items_); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
builder.Append("\n", style_.Get()); |
builder.Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter); |
@@ -250,16 +340,19 @@ TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { |
EXPECT_EQ(nullptr, items_[0].Style()); |
EXPECT_EQ(style_.Get(), items_[1].Style()); |
EXPECT_EQ(nullptr, items_[2].Style()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, AppendEmptyString) { |
EXPECT_EQ("", TestAppend("")); |
+ EXPECT_EQ("{}", collapsed_); |
EXPECT_EQ(0u, items_.size()); |
} |
TEST_F(NGInlineItemsBuilderTest, NewLines) { |
SetWhiteSpace(EWhiteSpace::kPre); |
EXPECT_EQ("apple\norange\ngrape\n", TestAppend("apple\norange\ngrape\n")); |
+ EXPECT_EQ("{}", collapsed_); |
EXPECT_EQ(6u, items_.size()); |
EXPECT_EQ(NGInlineItem::kText, items_[0].Type()); |
EXPECT_EQ(NGInlineItem::kControl, items_[1].Type()); |
@@ -271,17 +364,18 @@ TEST_F(NGInlineItemsBuilderTest, NewLines) { |
TEST_F(NGInlineItemsBuilderTest, Empty) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items); |
RefPtr<ComputedStyle> block_style(ComputedStyle::Create()); |
builder.EnterBlock(block_style.Get()); |
builder.ExitBlock(); |
EXPECT_EQ("", builder.ToString()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items); |
RefPtr<ComputedStyle> block_style(ComputedStyle::Create()); |
block_style->SetUnicodeBidi(UnicodeBidi::kBidiOverride); |
block_style->SetDirection(TextDirection::kRtl); |
@@ -295,6 +389,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { |
u"Hello" |
u"\u202C"), |
builder.ToString()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
static std::unique_ptr<LayoutInline> CreateLayoutInline( |
@@ -308,7 +403,7 @@ static std::unique_ptr<LayoutInline> CreateLayoutInline( |
TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items); |
builder.Append("Hello ", style_.Get()); |
std::unique_ptr<LayoutInline> isolate_rtl( |
CreateLayoutInline([](ComputedStyle* style) { |
@@ -328,11 +423,12 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { |
u"\u2069" |
u" World"), |
builder.ToString()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { |
Vector<NGInlineItem> items; |
- NGInlineItemsBuilder builder(&items); |
+ NGInlineItemsBuilderForOffsetMapping builder(&items); |
builder.Append("Hello ", style_.Get()); |
std::unique_ptr<LayoutInline> isolate_override_rtl( |
CreateLayoutInline([](ComputedStyle* style) { |
@@ -352,6 +448,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { |
u"\u202C\u2069" |
u" World"), |
builder.ToString()); |
+ EXPECT_EQ("{}", GetCollapsed(builder.GetOffsetMappingBuilder())); |
} |
} // namespace |