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
3 // found in the LICENSE file.
4
5 #include "third_party/blink/renderer/core/layout/ng/ng_block_node.h"
6
7 #include "third_party/blink/renderer/core/layout/min_max_sizes.h"
8 #include "third_party/blink/renderer/core/layout/ng/ng_layout_test.h"
9
10 namespace blink {
11 namespace {
12
13 using NGBlockNodeForTest = NGLayoutTest;
14
TEST_F(NGBlockNodeForTest,IsFloatingForOutOfFlowFloating)15 TEST_F(NGBlockNodeForTest, IsFloatingForOutOfFlowFloating) {
16 SetBodyInnerHTML(R"HTML(
17 <!DOCTYPE html>
18 <style>
19 #container {
20 float: left;
21 position: absolute;
22 }
23 </style>
24 <div id=container></div>
25 )HTML");
26 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
27 EXPECT_FALSE(container.IsFloating());
28 }
29
TEST_F(NGBlockNodeForTest,ChildInlineAndBlock)30 TEST_F(NGBlockNodeForTest, ChildInlineAndBlock) {
31 SetBodyInnerHTML(R"HTML(
32 <!DOCTYPE html>
33 <div id=container>Hello!<div></div></div>
34 )HTML");
35 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
36 NGLayoutInputNode child1 = container.FirstChild();
37 EXPECT_TRUE(child1 && child1.IsBlock());
38 NGLayoutInputNode child2 = child1.NextSibling();
39 EXPECT_TRUE(child2 && child2.IsBlock());
40 NGLayoutInputNode child3 = child2.NextSibling();
41 EXPECT_EQ(child3, nullptr);
42 }
43
TEST_F(NGBlockNodeForTest,ChildBlockAndInline)44 TEST_F(NGBlockNodeForTest, ChildBlockAndInline) {
45 SetBodyInnerHTML(R"HTML(
46 <!DOCTYPE html>
47 <div id=container><div></div>Hello!</div>
48 )HTML");
49 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
50 NGLayoutInputNode child1 = container.FirstChild();
51 EXPECT_TRUE(child1 && child1.IsBlock());
52 NGLayoutInputNode child2 = child1.NextSibling();
53 EXPECT_TRUE(child2 && child2.IsBlock());
54 NGLayoutInputNode child3 = child2.NextSibling();
55 EXPECT_EQ(child3, nullptr);
56 }
57
TEST_F(NGBlockNodeForTest,ChildFloatBeforeBlock)58 TEST_F(NGBlockNodeForTest, ChildFloatBeforeBlock) {
59 SetBodyInnerHTML(R"HTML(
60 <!DOCTYPE html>
61 <style>
62 float { float: left; }
63 </style>
64 <div id=container><float></float><div></div></div>
65 )HTML");
66 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
67 NGLayoutInputNode child1 = container.FirstChild();
68 EXPECT_TRUE(child1 && child1.IsBlock());
69 NGLayoutInputNode child2 = child1.NextSibling();
70 EXPECT_TRUE(child2 && child2.IsBlock());
71 NGLayoutInputNode child3 = child2.NextSibling();
72 EXPECT_EQ(child3, nullptr);
73 }
74
TEST_F(NGBlockNodeForTest,ChildFloatBeforeInline)75 TEST_F(NGBlockNodeForTest, ChildFloatBeforeInline) {
76 SetBodyInnerHTML(R"HTML(
77 <!DOCTYPE html>
78 <style>
79 float { float: left; }
80 </style>
81 <div id=container><float></float>Hello!</div>
82 )HTML");
83 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
84 NGLayoutInputNode child1 = container.FirstChild();
85 EXPECT_TRUE(child1 && child1.IsInline());
86 NGLayoutInputNode child2 = child1.NextSibling();
87 EXPECT_EQ(child2, nullptr);
88 }
89
TEST_F(NGBlockNodeForTest,ChildFloatAfterInline)90 TEST_F(NGBlockNodeForTest, ChildFloatAfterInline) {
91 SetBodyInnerHTML(R"HTML(
92 <!DOCTYPE html>
93 <style>
94 float { float: left; }
95 </style>
96 <div id=container>Hello<float></float></div>
97 )HTML");
98 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
99 NGLayoutInputNode child1 = container.FirstChild();
100 EXPECT_TRUE(child1 && child1.IsInline());
101 NGLayoutInputNode child2 = child1.NextSibling();
102 EXPECT_EQ(child2, nullptr);
103 }
104
TEST_F(NGBlockNodeForTest,ChildFloatOnly)105 TEST_F(NGBlockNodeForTest, ChildFloatOnly) {
106 SetBodyInnerHTML(R"HTML(
107 <!DOCTYPE html>
108 <style>
109 float { float: left; }
110 </style>
111 <div id=container><float></float></div>
112 )HTML");
113 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
114 NGLayoutInputNode child1 = container.FirstChild();
115 EXPECT_TRUE(child1 && child1.IsBlock());
116 NGLayoutInputNode child2 = child1.NextSibling();
117 EXPECT_EQ(child2, nullptr);
118 }
119
TEST_F(NGBlockNodeForTest,ChildFloatWithSpaces)120 TEST_F(NGBlockNodeForTest, ChildFloatWithSpaces) {
121 SetBodyInnerHTML(R"HTML(
122 <!DOCTYPE html>
123 <style>
124 float { float: left; }
125 </style>
126 <div id=container>
127 <float></float>
128 </div>
129 )HTML");
130 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
131 NGLayoutInputNode child1 = container.FirstChild();
132 EXPECT_TRUE(child1 && child1.IsBlock());
133 NGLayoutInputNode child2 = child1.NextSibling();
134 EXPECT_EQ(child2, nullptr);
135 }
136
TEST_F(NGBlockNodeForTest,ChildOofBeforeInline)137 TEST_F(NGBlockNodeForTest, ChildOofBeforeInline) {
138 SetBodyInnerHTML(R"HTML(
139 <!DOCTYPE html>
140 <style>
141 oof { position: absolute; }
142 </style>
143 <div id=container><oof></oof>Hello!</div>
144 )HTML");
145 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
146 NGLayoutInputNode child1 = container.FirstChild();
147 EXPECT_TRUE(child1 && child1.IsInline());
148 NGLayoutInputNode child2 = child1.NextSibling();
149 EXPECT_EQ(child2, nullptr);
150 }
151
TEST_F(NGBlockNodeForTest,ChildOofAfterInline)152 TEST_F(NGBlockNodeForTest, ChildOofAfterInline) {
153 SetBodyInnerHTML(R"HTML(
154 <!DOCTYPE html>
155 <style>
156 oof { position: absolute; }
157 </style>
158 <div id=container>Hello!<oof></oof></div>
159 )HTML");
160 NGBlockNode container(ToLayoutBox(GetLayoutObjectByElementId("container")));
161 NGLayoutInputNode child1 = container.FirstChild();
162 EXPECT_TRUE(child1 && child1.IsInline());
163 NGLayoutInputNode child2 = child1.NextSibling();
164 EXPECT_EQ(child2, nullptr);
165 }
166
TEST_F(NGBlockNodeForTest,MinAndMaxContent)167 TEST_F(NGBlockNodeForTest, MinAndMaxContent) {
168 SetBodyInnerHTML(R"HTML(
169 <div id="box" >
170 <div id="first_child" style="width:30px">
171 </div>
172 </div>
173 )HTML");
174 const int kWidth = 30;
175
176 NGBlockNode box(ToLayoutBox(GetLayoutObjectByElementId("box")));
177 MinMaxSizes sizes = box.ComputeMinMaxSizes(
178 WritingMode::kHorizontalTb,
179 MinMaxSizesInput(/* percentage_resolution_block_size */ LayoutUnit()));
180 EXPECT_EQ(LayoutUnit(kWidth), sizes.min_size);
181 EXPECT_EQ(LayoutUnit(kWidth), sizes.max_size);
182 }
183 } // namespace
184 } // namespace blink
185