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