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

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: Wed Jun 28 11:44:29 PDT 2017 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 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

Powered by Google App Engine
This is Rietveld 408576698