| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/layout/ng/ng_layout_inline_items_builder.h" | 5 #include "core/layout/ng/ng_layout_inline_items_builder.h" |
| 6 #include "core/layout/LayoutInline.h" | 6 #include "core/layout/LayoutInline.h" |
| 7 #include "core/layout/ng/ng_inline_node.h" | 7 #include "core/layout/ng/ng_inline_node.h" |
| 8 #include "core/style/ComputedStyle.h" | 8 #include "core/style/ComputedStyle.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 RefPtr<ComputedStyle> style_; | 50 RefPtr<ComputedStyle> style_; |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 #define TestWhitespaceValue(expected, input, whitespace) \ | 53 #define TestWhitespaceValue(expected, input, whitespace) \ |
| 54 SetWhiteSpace(whitespace); \ | 54 SetWhiteSpace(whitespace); \ |
| 55 EXPECT_EQ(expected, TestAppend(input)) << "white-space: " #whitespace; | 55 EXPECT_EQ(expected, TestAppend(input)) << "white-space: " #whitespace; |
| 56 | 56 |
| 57 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseSpaces) { | 57 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseSpaces) { |
| 58 String input("text text text text"); | 58 String input("text text text text"); |
| 59 String collapsed("text text text text"); | 59 String collapsed("text text text text"); |
| 60 TestWhitespaceValue(collapsed, input, EWhiteSpace::Normal); | 60 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
| 61 TestWhitespaceValue(collapsed, input, EWhiteSpace::Nowrap); | 61 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
| 62 TestWhitespaceValue(collapsed, input, EWhiteSpace::WebkitNowrap); | 62 TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
| 63 TestWhitespaceValue(collapsed, input, EWhiteSpace::PreLine); | 63 TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
| 64 TestWhitespaceValue(input, input, EWhiteSpace::Pre); | 64 TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
| 65 TestWhitespaceValue(input, input, EWhiteSpace::PreWrap); | 65 TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
| 66 } | 66 } |
| 67 | 67 |
| 68 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseTabs) { | 68 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseTabs) { |
| 69 String input("text\ttext\t text \t text"); | 69 String input("text\ttext\t text \t text"); |
| 70 String collapsed("text text text text"); | 70 String collapsed("text text text text"); |
| 71 TestWhitespaceValue(collapsed, input, EWhiteSpace::Normal); | 71 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
| 72 TestWhitespaceValue(collapsed, input, EWhiteSpace::Nowrap); | 72 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
| 73 TestWhitespaceValue(collapsed, input, EWhiteSpace::WebkitNowrap); | 73 TestWhitespaceValue(collapsed, input, EWhiteSpace::kWebkitNowrap); |
| 74 TestWhitespaceValue(collapsed, input, EWhiteSpace::PreLine); | 74 TestWhitespaceValue(collapsed, input, EWhiteSpace::kPreLine); |
| 75 TestWhitespaceValue(input, input, EWhiteSpace::Pre); | 75 TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
| 76 TestWhitespaceValue(input, input, EWhiteSpace::PreWrap); | 76 TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
| 77 } | 77 } |
| 78 | 78 |
| 79 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseNewLines) { | 79 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseNewLines) { |
| 80 String input("text\ntext \n text"); | 80 String input("text\ntext \n text"); |
| 81 String collapsed("text text text"); | 81 String collapsed("text text text"); |
| 82 TestWhitespaceValue(collapsed, input, EWhiteSpace::Normal); | 82 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNormal); |
| 83 TestWhitespaceValue(collapsed, input, EWhiteSpace::Nowrap); | 83 TestWhitespaceValue(collapsed, input, EWhiteSpace::kNowrap); |
| 84 TestWhitespaceValue("text\ntext\ntext", input, EWhiteSpace::PreLine); | 84 TestWhitespaceValue("text\ntext\ntext", input, EWhiteSpace::kPreLine); |
| 85 TestWhitespaceValue(input, input, EWhiteSpace::Pre); | 85 TestWhitespaceValue(input, input, EWhiteSpace::kPre); |
| 86 TestWhitespaceValue(input, input, EWhiteSpace::PreWrap); | 86 TestWhitespaceValue(input, input, EWhiteSpace::kPreWrap); |
| 87 } | 87 } |
| 88 | 88 |
| 89 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseAcrossElements) { | 89 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseAcrossElements) { |
| 90 EXPECT_EQ("text text", TestAppend("text ", " text")) | 90 EXPECT_EQ("text text", TestAppend("text ", " text")) |
| 91 << "Spaces are collapsed even when across elements."; | 91 << "Spaces are collapsed even when across elements."; |
| 92 } | 92 } |
| 93 | 93 |
| 94 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseLeadingSpaces) { | 94 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseLeadingSpaces) { |
| 95 EXPECT_EQ("text", TestAppend(" text")) << "Leading spaces are removed."; | 95 EXPECT_EQ("text", TestAppend(" text")) << "Leading spaces are removed."; |
| 96 } | 96 } |
| 97 | 97 |
| 98 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseBeforeAndAfterNewline) { | 98 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseBeforeAndAfterNewline) { |
| 99 SetWhiteSpace(EWhiteSpace::PreLine); | 99 SetWhiteSpace(EWhiteSpace::kPreLine); |
| 100 EXPECT_EQ("text\ntext", TestAppend("text \n text")) | 100 EXPECT_EQ("text\ntext", TestAppend("text \n text")) |
| 101 << "Spaces before and after newline are removed."; | 101 << "Spaces before and after newline are removed."; |
| 102 } | 102 } |
| 103 | 103 |
| 104 TEST_F(NGLayoutInlineItemsBuilderTest, | 104 TEST_F(NGLayoutInlineItemsBuilderTest, |
| 105 CollapsibleSpaceAfterNonCollapsibleSpaceAcrossElements) { | 105 CollapsibleSpaceAfterNonCollapsibleSpaceAcrossElements) { |
| 106 NGLayoutInlineItemsBuilder builder(&items_); | 106 NGLayoutInlineItemsBuilder builder(&items_); |
| 107 RefPtr<ComputedStyle> pre_wrap(CreateWhitespaceStyle(EWhiteSpace::PreWrap)); | 107 RefPtr<ComputedStyle> pre_wrap(CreateWhitespaceStyle(EWhiteSpace::kPreWrap)); |
| 108 builder.Append("text ", pre_wrap.get()); | 108 builder.Append("text ", pre_wrap.get()); |
| 109 builder.Append(" text", style_.get()); | 109 builder.Append(" text", style_.get()); |
| 110 EXPECT_EQ("text text", builder.ToString()) | 110 EXPECT_EQ("text text", builder.ToString()) |
| 111 << "The whitespace in constructions like '<span style=\"white-space: " | 111 << "The whitespace in constructions like '<span style=\"white-space: " |
| 112 "pre-wrap\">text <span><span> text</span>' does not collapse."; | 112 "pre-wrap\">text <span><span> text</span>' does not collapse."; |
| 113 } | 113 } |
| 114 | 114 |
| 115 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseZeroWidthSpaces) { | 115 TEST_F(NGLayoutInlineItemsBuilderTest, CollapseZeroWidthSpaces) { |
| 116 EXPECT_EQ("text text", TestAppend("text\ntext")) | 116 EXPECT_EQ("text text", TestAppend("text\ntext")) |
| 117 << "Newline is converted to a space."; | 117 << "Newline is converted to a space."; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 builder.ExitBlock(); | 180 builder.ExitBlock(); |
| 181 | 181 |
| 182 EXPECT_EQ("", builder.ToString()); | 182 EXPECT_EQ("", builder.ToString()); |
| 183 } | 183 } |
| 184 | 184 |
| 185 TEST_F(NGLayoutInlineItemsBuilderTest, BidiBlockOverride) { | 185 TEST_F(NGLayoutInlineItemsBuilderTest, BidiBlockOverride) { |
| 186 Vector<NGLayoutInlineItem> items; | 186 Vector<NGLayoutInlineItem> items; |
| 187 NGLayoutInlineItemsBuilder builder(&items); | 187 NGLayoutInlineItemsBuilder builder(&items); |
| 188 RefPtr<ComputedStyle> block_style(ComputedStyle::create()); | 188 RefPtr<ComputedStyle> block_style(ComputedStyle::create()); |
| 189 block_style->setUnicodeBidi(Override); | 189 block_style->setUnicodeBidi(Override); |
| 190 block_style->setDirection(TextDirection::Rtl); | 190 block_style->setDirection(TextDirection::kRtl); |
| 191 builder.EnterBlock(block_style.get()); | 191 builder.EnterBlock(block_style.get()); |
| 192 builder.Append("Hello", style_.get()); | 192 builder.Append("Hello", style_.get()); |
| 193 builder.ExitBlock(); | 193 builder.ExitBlock(); |
| 194 | 194 |
| 195 // Expected control characters as defined in: | 195 // Expected control characters as defined in: |
| 196 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table | 196 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table |
| 197 EXPECT_EQ(String(u"\u202E" | 197 EXPECT_EQ(String(u"\u202E" |
| 198 u"Hello" | 198 u"Hello" |
| 199 u"\u202C"), | 199 u"\u202C"), |
| 200 builder.ToString()); | 200 builder.ToString()); |
| 201 } | 201 } |
| 202 | 202 |
| 203 static std::unique_ptr<LayoutInline> createLayoutInline( | 203 static std::unique_ptr<LayoutInline> createLayoutInline( |
| 204 void (*initialize_style)(ComputedStyle*)) { | 204 void (*initialize_style)(ComputedStyle*)) { |
| 205 RefPtr<ComputedStyle> style(ComputedStyle::create()); | 205 RefPtr<ComputedStyle> style(ComputedStyle::create()); |
| 206 initialize_style(style.get()); | 206 initialize_style(style.get()); |
| 207 std::unique_ptr<LayoutInline> node = WTF::makeUnique<LayoutInline>(nullptr); | 207 std::unique_ptr<LayoutInline> node = WTF::makeUnique<LayoutInline>(nullptr); |
| 208 node->setStyleInternal(std::move(style)); | 208 node->setStyleInternal(std::move(style)); |
| 209 return node; | 209 return node; |
| 210 } | 210 } |
| 211 | 211 |
| 212 TEST_F(NGLayoutInlineItemsBuilderTest, BidiIsolate) { | 212 TEST_F(NGLayoutInlineItemsBuilderTest, BidiIsolate) { |
| 213 Vector<NGLayoutInlineItem> items; | 213 Vector<NGLayoutInlineItem> items; |
| 214 NGLayoutInlineItemsBuilder builder(&items); | 214 NGLayoutInlineItemsBuilder builder(&items); |
| 215 builder.Append("Hello ", style_.get()); | 215 builder.Append("Hello ", style_.get()); |
| 216 std::unique_ptr<LayoutInline> isolateRTL( | 216 std::unique_ptr<LayoutInline> isolateRTL( |
| 217 createLayoutInline([](ComputedStyle* style) { | 217 createLayoutInline([](ComputedStyle* style) { |
| 218 style->setUnicodeBidi(Isolate); | 218 style->setUnicodeBidi(Isolate); |
| 219 style->setDirection(TextDirection::Rtl); | 219 style->setDirection(TextDirection::kRtl); |
| 220 })); | 220 })); |
| 221 builder.EnterInline(isolateRTL.get()); | 221 builder.EnterInline(isolateRTL.get()); |
| 222 builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.get()); | 222 builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.get()); |
| 223 builder.ExitInline(isolateRTL.get()); | 223 builder.ExitInline(isolateRTL.get()); |
| 224 builder.Append(" World", style_.get()); | 224 builder.Append(" World", style_.get()); |
| 225 | 225 |
| 226 // Expected control characters as defined in: | 226 // Expected control characters as defined in: |
| 227 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table | 227 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table |
| 228 EXPECT_EQ(String(u"Hello " | 228 EXPECT_EQ(String(u"Hello " |
| 229 u"\u2067" | 229 u"\u2067" |
| 230 u"\u05E2\u05D1\u05E8\u05D9\u05EA" | 230 u"\u05E2\u05D1\u05E8\u05D9\u05EA" |
| 231 u"\u2069" | 231 u"\u2069" |
| 232 u" World"), | 232 u" World"), |
| 233 builder.ToString()); | 233 builder.ToString()); |
| 234 } | 234 } |
| 235 | 235 |
| 236 TEST_F(NGLayoutInlineItemsBuilderTest, BidiIsolateOverride) { | 236 TEST_F(NGLayoutInlineItemsBuilderTest, BidiIsolateOverride) { |
| 237 Vector<NGLayoutInlineItem> items; | 237 Vector<NGLayoutInlineItem> items; |
| 238 NGLayoutInlineItemsBuilder builder(&items); | 238 NGLayoutInlineItemsBuilder builder(&items); |
| 239 builder.Append("Hello ", style_.get()); | 239 builder.Append("Hello ", style_.get()); |
| 240 std::unique_ptr<LayoutInline> isolateOverrideRTL( | 240 std::unique_ptr<LayoutInline> isolateOverrideRTL( |
| 241 createLayoutInline([](ComputedStyle* style) { | 241 createLayoutInline([](ComputedStyle* style) { |
| 242 style->setUnicodeBidi(IsolateOverride); | 242 style->setUnicodeBidi(IsolateOverride); |
| 243 style->setDirection(TextDirection::Rtl); | 243 style->setDirection(TextDirection::kRtl); |
| 244 })); | 244 })); |
| 245 builder.EnterInline(isolateOverrideRTL.get()); | 245 builder.EnterInline(isolateOverrideRTL.get()); |
| 246 builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.get()); | 246 builder.Append(u"\u05E2\u05D1\u05E8\u05D9\u05EA", style_.get()); |
| 247 builder.ExitInline(isolateOverrideRTL.get()); | 247 builder.ExitInline(isolateOverrideRTL.get()); |
| 248 builder.Append(" World", style_.get()); | 248 builder.Append(" World", style_.get()); |
| 249 | 249 |
| 250 // Expected control characters as defined in: | 250 // Expected control characters as defined in: |
| 251 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table | 251 // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-
table |
| 252 EXPECT_EQ(String(u"Hello " | 252 EXPECT_EQ(String(u"Hello " |
| 253 u"\u2068\u202E" | 253 u"\u2068\u202E" |
| 254 u"\u05E2\u05D1\u05E8\u05D9\u05EA" | 254 u"\u05E2\u05D1\u05E8\u05D9\u05EA" |
| 255 u"\u202C\u2069" | 255 u"\u202C\u2069" |
| 256 u" World"), | 256 u" World"), |
| 257 builder.ToString()); | 257 builder.ToString()); |
| 258 } | 258 } |
| 259 | 259 |
| 260 } // namespace | 260 } // namespace |
| 261 | 261 |
| 262 } // namespace blink | 262 } // namespace blink |
| OLD | NEW |