Index: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc |
index 4e2bf337d2204074f826676ea8677d6e1e853d5a..9ca6be40dee5d66a6a996a565203d08476667dd9 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc |
@@ -26,16 +26,25 @@ namespace { |
using testing::ElementsAre; |
using testing::Pointee; |
-NGConstraintSpace* ConstructConstraintSpace(NGWritingMode writing_mode, |
- TextDirection direction, |
- NGLogicalSize size, |
- bool shrink_to_fit = false) { |
+NGConstraintSpace* ConstructConstraintSpace( |
+ NGWritingMode writing_mode, |
+ TextDirection direction, |
+ NGLogicalSize size, |
+ bool shrink_to_fit = false, |
+ LayoutUnit fragmentainer_space_available = LayoutUnit()) { |
+ NGFragmentationType block_fragmentation = |
+ fragmentainer_space_available != LayoutUnit() |
+ ? NGFragmentationType::kFragmentColumn |
+ : NGFragmentationType::kFragmentNone; |
+ |
return NGConstraintSpaceBuilder(writing_mode) |
.SetAvailableSize(size) |
.SetPercentageResolutionSize(size) |
.SetTextDirection(direction) |
.SetWritingMode(writing_mode) |
.SetIsShrinkToFit(shrink_to_fit) |
+ .SetFragmentainerSpaceAvailable(fragmentainer_space_available) |
+ .SetFragmentationType(block_fragmentation) |
.ToConstraintSpace(); |
} |
@@ -60,14 +69,13 @@ class NGBlockLayoutAlgorithmTest |
RefPtr<NGPhysicalBoxFragment> RunBlockLayoutAlgorithm( |
NGConstraintSpace* space, |
- NGBlockNode* first_child) { |
- NGBlockNode parent(style_.get()); |
- parent.SetFirstChild(first_child); |
+ NGBlockNode* first_child, |
+ NGBreakToken* break_token = nullptr) { |
+ NGBlockNode* parent = new NGBlockNode(style_.get()); |
+ parent->SetFirstChild(first_child); |
RefPtr<NGPhysicalFragment> fragment = |
- NGBlockLayoutAlgorithm(/* layout_object */ nullptr, style_.get(), |
- first_child, space) |
- .Layout(); |
+ NGBlockLayoutAlgorithm(parent, space).Layout(); |
return toNGPhysicalBoxFragment(fragment.get()); |
} |
@@ -86,11 +94,13 @@ class NGBlockLayoutAlgorithmTest |
MinAndMaxContentSizes RunComputeMinAndMax(NGBlockNode* first_child) { |
// The constraint space is not used for min/max computation, but we need |
// it to create the algorithm. |
+ NGBlockNode* node = new NGBlockNode(style_.get()); |
+ node->SetFirstChild(first_child); |
+ |
NGConstraintSpace* space = |
ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, |
NGLogicalSize(LayoutUnit(), LayoutUnit())); |
- NGBlockLayoutAlgorithm algorithm(/* layout_object */ nullptr, style_.get(), |
- first_child, space); |
+ NGBlockLayoutAlgorithm algorithm(node, space); |
EXPECT_TRUE(algorithm.ComputeMinAndMaxContentSizes().has_value()); |
return *algorithm.ComputeMinAndMaxContentSizes(); |
} |
@@ -1293,7 +1303,7 @@ class FragmentChildIterator { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyMulticol) { |
+/*TEST_F(NGBlockLayoutAlgorithmTest, EmptyMulticol) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(2); |
@@ -1317,7 +1327,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyMulticol) { |
// There should be nothing inside the multicol container. |
EXPECT_FALSE(FragmentChildIterator(fragment).NextChild()); |
-} |
+}*/ |
// Test case's HTML representation: |
// <div id="parent" style="columns:2; column-fill:auto; column-gap:10px; |
@@ -1326,7 +1336,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyMulticol) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyBlock) { |
+/*TEST_F(NGBlockLayoutAlgorithmTest, EmptyBlock) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(2); |
@@ -1364,8 +1374,306 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyBlock) { |
EXPECT_EQ(LayoutUnit(), fragment->Height()); |
EXPECT_EQ(0UL, fragment->Children().size()); |
EXPECT_FALSE(iterator.NextChild()); |
+}*/ |
+ |
+// Tests that a block child won't fragment if it doesn't reach the fragmentation |
+// line. |
+TEST_F(NGBlockLayoutAlgorithmTest, NoFragmentation) { |
+ setBodyInnerHTML(R"HTML( |
+ <!DOCTYPE html> |
+ <style> |
+ #container { |
+ width: 150px; |
+ height: 200px; |
+ } |
+ </style> |
+ <div id='container'></div> |
+ )HTML"); |
+ |
+ LayoutUnit kFragmentainerSpaceAvailable(200); |
+ |
+ NGBlockNode* node = new NGBlockNode(toLayoutBlockFlow( |
+ document().getElementById("container")->layoutObject())); |
+ auto* space = ConstructConstraintSpace( |
+ kHorizontalTopBottom, TextDirection::kLtr, |
+ NGLogicalSize(LayoutUnit(1000), NGSizeIndefinite), false, |
+ kFragmentainerSpaceAvailable); |
+ |
+ // We should only have one 150x200 fragment with no fragmentation. |
+ RefPtr<const NGPhysicalFragment> fragment = |
+ NGBlockLayoutAlgorithm(node, space).Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_TRUE(fragment->BreakToken()->IsFinished()); |
+} |
+ |
+TEST_F(NGBlockLayoutAlgorithmTest, SimpleFragmentation) { |
+ setBodyInnerHTML(R"HTML( |
+ <!DOCTYPE html> |
+ <style> |
+ #container { |
+ width: 150px; |
+ height: 300px; |
+ } |
+ </style> |
+ <div id='container'></div> |
+ )HTML"); |
+ |
+ LayoutUnit kFragmentainerSpaceAvailable(200); |
+ |
+ NGBlockNode* node = new NGBlockNode(toLayoutBlockFlow( |
+ document().getElementById("container")->layoutObject())); |
+ auto* space = ConstructConstraintSpace( |
+ kHorizontalTopBottom, TextDirection::kLtr, |
+ NGLogicalSize(LayoutUnit(1000), NGSizeIndefinite), false, |
+ kFragmentainerSpaceAvailable); |
+ |
+ // The first fragment should have ... |
+ RefPtr<const NGPhysicalFragment> fragment = |
+ NGBlockLayoutAlgorithm(node, space).Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_FALSE(fragment->BreakToken()->IsFinished()); |
+ |
+ fragment = NGBlockLayoutAlgorithm(node, space, |
+ toNGBlockBreakToken(fragment->BreakToken())) |
+ .Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(100), fragment->Height()); |
+ ASSERT_TRUE(fragment->BreakToken()->IsFinished()); |
+} |
+ |
+TEST_F(NGBlockLayoutAlgorithmTest, InnerChildrenFragmentation) { |
+ setBodyInnerHTML(R"HTML( |
+ <!DOCTYPE html> |
+ <style> |
+ #container { |
+ width: 150px; |
+ padding-top: 20px; |
+ } |
+ #child1 { |
+ height: 200px; |
+ margin-bottom: 20px; |
+ } |
+ #child2 { |
+ height: 100px; |
+ margin-top: 20px; |
+ } |
+ </style> |
+ <div id='container'> |
+ <div id='child1'></div> |
+ <div id='child2'></div> |
+ </div> |
+ )HTML"); |
+ |
+ LayoutUnit kFragmentainerSpaceAvailable(200); |
+ |
+ NGBlockNode* node = new NGBlockNode(toLayoutBlockFlow( |
+ document().getElementById("container")->layoutObject())); |
+ auto* space = ConstructConstraintSpace( |
+ kHorizontalTopBottom, TextDirection::kLtr, |
+ NGLogicalSize(LayoutUnit(1000), NGSizeIndefinite), false, |
+ kFragmentainerSpaceAvailable); |
+ |
+ // The first fragment should have ... |
+ RefPtr<const NGPhysicalFragment> fragment = |
+ NGBlockLayoutAlgorithm(node, space).Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_FALSE(fragment->BreakToken()->IsFinished()); |
+ |
+ FragmentChildIterator iterator(toNGPhysicalBoxFragment(fragment.get())); |
+ const NGPhysicalBoxFragment* child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(180), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(20), child->TopOffset()); |
+ |
+ EXPECT_FALSE(iterator.NextChild()); |
+ |
+ fragment = NGBlockLayoutAlgorithm(node, space, |
+ toNGBlockBreakToken(fragment->BreakToken())) |
+ .Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(140), fragment->Height()); |
+ ASSERT_TRUE(fragment->BreakToken()->IsFinished()); |
+ |
+ iterator.SetParent(toNGPhysicalBoxFragment(fragment.get())); |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(20), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(100), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(40), child->TopOffset()); |
+ |
+ EXPECT_FALSE(iterator.NextChild()); |
} |
+TEST_F(NGBlockLayoutAlgorithmTest, ParallelFlowFragmentation) { |
+ setBodyInnerHTML(R"HTML( |
+ <!DOCTYPE html> |
+ <style> |
+ #container { |
+ width: 150px; |
+ } |
+ #float_left { |
+ float: left; |
+ width: 20px; |
+ height: 300px; |
+ } |
+ #float_right { |
+ float: right; |
+ width: 50px; |
+ height: 500px; |
+ } |
+ #in_flow { |
+ height: 550px; |
+ } |
+ </style> |
+ <div id='container'> |
+ <div id='float_left'></div> |
+ <div id='float_right'></div> |
+ <div id='in_flow'></div> |
+ </div> |
+ )HTML"); |
+ |
+ LayoutUnit kFragmentainerSpaceAvailable(200); |
+ |
+ NGBlockNode* node = new NGBlockNode(toLayoutBlockFlow( |
+ document().getElementById("container")->layoutObject())); |
+ auto* space = ConstructConstraintSpace( |
+ kHorizontalTopBottom, TextDirection::kLtr, |
+ NGLogicalSize(LayoutUnit(1000), NGSizeIndefinite), false, |
+ kFragmentainerSpaceAvailable); |
+ |
+ // The first fragment should have ... |
+ RefPtr<const NGPhysicalFragment> fragment = |
+ NGBlockLayoutAlgorithm(node, space).Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_FALSE(fragment->BreakToken()->IsFinished()); |
+ |
+ FragmentChildIterator iterator(toNGPhysicalBoxFragment(fragment.get())); |
+ |
+ // #float_left child. |
+ const NGPhysicalBoxFragment* child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(20), child->Width()); |
+ EXPECT_EQ(LayoutUnit(200), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ // #float_right child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(50), child->Width()); |
+ EXPECT_EQ(LayoutUnit(200), child->Height()); |
+ EXPECT_EQ(LayoutUnit(100), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ // #in_flow child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(200), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ EXPECT_FALSE(iterator.NextChild()); |
+ |
+ fragment = NGBlockLayoutAlgorithm(node, space, |
+ toNGBlockBreakToken(fragment->BreakToken())) |
+ .Layout(); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_FALSE(fragment->BreakToken()->IsFinished()); |
+ |
+ iterator.SetParent(toNGPhysicalBoxFragment(fragment.get())); |
+ |
+ // #float_left child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(20), child->Width()); |
+ EXPECT_EQ(LayoutUnit(100), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ EXPECT_TRUE(child->BreakToken()->IsFinished()); |
+ |
+ // #float_right child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(50), child->Width()); |
+ EXPECT_EQ(LayoutUnit(200), child->Height()); |
+ EXPECT_EQ(LayoutUnit(100), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ // #in_flow child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(200), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ EXPECT_FALSE(iterator.NextChild()); |
+ |
+ fragment = NGBlockLayoutAlgorithm(node, space, |
+ toNGBlockBreakToken(fragment->BreakToken())) |
+ .Layout(); |
+ |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(150), fragment->Height()); |
+ ASSERT_FALSE(fragment->BreakToken()->IsFinished()); |
+ |
+ iterator.SetParent(toNGPhysicalBoxFragment(fragment.get())); |
+ |
+ // #float_right child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(50), child->Width()); |
+ EXPECT_EQ(LayoutUnit(100), child->Height()); |
+ EXPECT_EQ(LayoutUnit(100), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ // #in_flow child. |
+ child = iterator.NextChild(); |
+ EXPECT_EQ(LayoutUnit(150), child->Width()); |
+ EXPECT_EQ(LayoutUnit(150), child->Height()); |
+ EXPECT_EQ(LayoutUnit(0), child->LeftOffset()); |
+ EXPECT_EQ(LayoutUnit(0), child->TopOffset()); |
+ |
+ EXPECT_FALSE(iterator.NextChild()); |
+} |
+ |
+// Tests that a block child will fragment if it reaches it's fragmentation line. |
+/*TEST_F(NGBlockLayoutAlgorithmTest, NoFragmentation) { |
+ setBodyInnerHTML( |
+ "<!DOCTYPE html>" |
+ "<style>" |
+ " #container {" |
+ " height: 200px;" |
+ " width: 150px;" |
+ " }" |
+ "</style>" |
+ "<div id='container'>" |
+ "</div>"); |
+ |
+ LayoutUnit kFragmentainerSpaceAvailable(200); |
+ |
+ NGBlockNode* node = new NGBlockNode( |
+ toLayoutBlockFlow(document().getElementById("container")->layoutObject())); |
+ auto* space = ConstructConstraintSpace( |
+ kHorizontalTopBottom, TextDirection::kLtr, |
+ NGLogicalSize(LayoutUnit(1000), NGSizeIndefinite), false, |
+kFragmentainerSpaceAvailable); |
+ |
+ RefPtr<const NGPhysicalBoxFragment> fragment = RunBlockLayoutAlgorithm(space, |
+node); |
+ |
+ // We should only have one 150x200 fragment with no fragmentation. |
+ EXPECT_EQ(LayoutUnit(150), fragment->Width()); |
+ EXPECT_EQ(LayoutUnit(200), fragment->Height()); |
+ ASSERT_TRUE(fragment->BreakToken()->IsFinished()); |
+}*/ |
+ |
// Test case's HTML representation: |
// <div id="parent" style="columns:2; column-fill:auto; column-gap:10px; |
// width:310px; height:100px;"> |
@@ -1373,7 +1681,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_EmptyBlock) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInOneColumn) { |
+TEST_F(NGBlockLayoutAlgorithmTest, BlockInOneColumn) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(2); |
@@ -1423,7 +1731,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInOneColumn) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInTwoColumns) { |
+TEST_F(NGBlockLayoutAlgorithmTest, BlockInTwoColumns) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(2); |
@@ -1482,7 +1790,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInTwoColumns) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInThreeColumns) { |
+TEST_F(NGBlockLayoutAlgorithmTest, BlockInThreeColumns) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |
@@ -1550,8 +1858,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_BlockInThreeColumns) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, |
- DISABLED_ActualColumnCountGreaterThanSpecified) { |
+TEST_F(NGBlockLayoutAlgorithmTest, ActualColumnCountGreaterThanSpecified) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(2); |
@@ -1620,7 +1927,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_TwoBlocksInTwoColumns) { |
+TEST_F(NGBlockLayoutAlgorithmTest, TwoBlocksInTwoColumns) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |
@@ -1698,7 +2005,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_TwoBlocksInTwoColumns) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_OverflowedBlock) { |
+TEST_F(NGBlockLayoutAlgorithmTest, OverflowedBlock) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |
@@ -1809,7 +2116,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_OverflowedBlock) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_FloatInOneColumn) { |
+TEST_F(NGBlockLayoutAlgorithmTest, FloatInOneColumn) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |
@@ -1861,7 +2168,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_FloatInOneColumn) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_TwoFloatsInOneColumn) { |
+TEST_F(NGBlockLayoutAlgorithmTest, TwoFloatsInOneColumn) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |
@@ -1929,7 +2236,7 @@ TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_TwoFloatsInOneColumn) { |
// </div> |
// TODO(glebl): reenable multicol after new margin collapsing/floats algorithm |
// is checked in. |
-TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_TwoFloatsInTwoColumns) { |
+TEST_F(NGBlockLayoutAlgorithmTest, TwoFloatsInTwoColumns) { |
// parent |
RefPtr<ComputedStyle> parent_style = ComputedStyle::create(); |
parent_style->setColumnCount(3); |