| 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 6014802c24e55065543eea66769f4baccb3e6833..d1c93cbd268b649d2071ee1488b7772c7ce6325f 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
|
| @@ -40,8 +40,8 @@ TEST_F(NGBlockLayoutAlgorithmTest, FixedSize) {
|
| NGLogicalSize(LayoutUnit(100), NGSizeIndefinite));
|
| NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, nullptr);
|
|
|
| - EXPECT_EQ(frag->Width(), LayoutUnit(30));
|
| - EXPECT_EQ(frag->Height(), LayoutUnit(40));
|
| + EXPECT_EQ(LayoutUnit(30), frag->Width());
|
| + EXPECT_EQ(LayoutUnit(40), frag->Height());
|
| }
|
|
|
| // Verifies that two children are laid out with the correct size and position.
|
| @@ -70,18 +70,18 @@ TEST_F(NGBlockLayoutAlgorithmTest, LayoutBlockChildren) {
|
| NGLogicalSize(LayoutUnit(100), NGSizeIndefinite));
|
| NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, first_child);
|
|
|
| - EXPECT_EQ(frag->Width(), LayoutUnit(kWidth));
|
| - EXPECT_EQ(frag->Height(), LayoutUnit(kHeight1 + kHeight2 + kMarginTop));
|
| - EXPECT_EQ(frag->Type(), NGPhysicalFragmentBase::FragmentBox);
|
| + EXPECT_EQ(LayoutUnit(kWidth), frag->Width());
|
| + EXPECT_EQ(LayoutUnit(kHeight1 + kHeight2 + kMarginTop), frag->Height());
|
| + EXPECT_EQ(NGPhysicalFragmentBase::FragmentBox, frag->Type());
|
| ASSERT_EQ(frag->Children().size(), 2UL);
|
|
|
| const NGPhysicalFragmentBase* child = frag->Children()[0];
|
| - EXPECT_EQ(child->Height(), kHeight1);
|
| - EXPECT_EQ(child->TopOffset(), 0);
|
| + EXPECT_EQ(kHeight1, child->Height());
|
| + EXPECT_EQ(0, child->TopOffset());
|
|
|
| child = frag->Children()[1];
|
| - EXPECT_EQ(child->Height(), kHeight2);
|
| - EXPECT_EQ(child->TopOffset(), kHeight1 + kMarginTop);
|
| + EXPECT_EQ(kHeight2, child->Height());
|
| + EXPECT_EQ(kHeight1 + kMarginTop, child->TopOffset());
|
| }
|
|
|
| // Verifies that a child is laid out correctly if it's writing mode is different
|
| @@ -134,7 +134,8 @@ TEST_F(NGBlockLayoutAlgorithmTest, LayoutBlockChildrenWithWritingMode) {
|
| // </div>
|
| //
|
| // Expected:
|
| -// Margins are collapsed resulting a single margin 20px = max(20px, 10px)
|
| +// - Margins are collapsed resulting a single margin 20px = max(20px, 10px)
|
| +// - The top offset of DIV2 == 20px
|
| TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase1) {
|
| const int kHeight = 50;
|
| const int kDiv1MarginTop = 20;
|
| @@ -158,11 +159,12 @@ TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase1) {
|
| NGLogicalSize(LayoutUnit(100), NGSizeIndefinite));
|
| NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, div1);
|
|
|
| - EXPECT_EQ(frag->MarginStrut(), NGMarginStrut({LayoutUnit(kDiv1MarginTop)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(kDiv1MarginTop)}), frag->MarginStrut());
|
| ASSERT_EQ(frag->Children().size(), 1UL);
|
| const NGPhysicalFragmentBase* div2_fragment = frag->Children()[0];
|
| - EXPECT_EQ(div2_fragment->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(kDiv2MarginTop)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(kDiv2MarginTop)}),
|
| + div2_fragment->MarginStrut());
|
| + EXPECT_EQ(kDiv1MarginTop, div2_fragment->TopOffset());
|
| }
|
|
|
| // Verifies the collapsing margins case for the next pair:
|
| @@ -171,21 +173,24 @@ TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase1) {
|
| // Test case's HTML representation:
|
| // <div style="margin-bottom: 20px; height: 50px;"> <!-- DIV1 -->
|
| // <div style="margin-bottom: -15px"></div> <!-- DIV2 -->
|
| +// <div></div> <!-- DIV3 -->
|
| // </div>
|
| -// <div style="margin-top: 10px; height: 50px;"> <!-- DIV3 -->
|
| -// <div style="margin-top: -30px"></div> <!-- DIV4 -->
|
| +// <div></div> <!-- DIV4 -->
|
| +// <div style="margin-top: 10px; height: 50px;"> <!-- DIV5 -->
|
| +// <div></div> <!-- DIV6 -->
|
| +// <div style="margin-top: -30px"></div> <!-- DIV7 -->
|
| // </div>
|
| //
|
| // Expected:
|
| // Margins are collapsed resulting an overlap
|
| // -10px = max(20px, 10px) - max(abs(-15px), abs(-30px))
|
| -// between DIV2 and DIV3.
|
| +// between DIV2 and DIV3. Zero-height blocks are ignored.
|
| TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase2) {
|
| const int kHeight = 50;
|
| const int kDiv1MarginBottom = 20;
|
| const int kDiv2MarginBottom = -15;
|
| - const int kDiv3MarginTop = 10;
|
| - const int kDiv4MarginTop = -30;
|
| + const int kDiv5MarginTop = 10;
|
| + const int kDiv7MarginTop = -30;
|
| const int kExpectedCollapsedMargin = -10;
|
|
|
| // DIV1
|
| @@ -199,35 +204,45 @@ TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase2) {
|
| div2_style->setMarginBottom(Length(kDiv2MarginBottom, Fixed));
|
| NGBox* div2 = new NGBox(div2_style.get());
|
|
|
| - // DIV3
|
| - RefPtr<ComputedStyle> div3_style = ComputedStyle::create();
|
| - div3_style->setHeight(Length(kHeight, Fixed));
|
| - div3_style->setMarginTop(Length(kDiv3MarginTop, Fixed));
|
| - NGBox* div3 = new NGBox(div3_style.get());
|
| + // Empty DIVs: DIV3, DIV4, DIV6
|
| + NGBox* div3 = new NGBox(ComputedStyle::create().get());
|
| + NGBox* div4 = new NGBox(ComputedStyle::create().get());
|
| + NGBox* div6 = new NGBox(ComputedStyle::create().get());
|
| +
|
| + // DIV5
|
| + RefPtr<ComputedStyle> div5_style = ComputedStyle::create();
|
| + div5_style->setHeight(Length(kHeight, Fixed));
|
| + div5_style->setMarginTop(Length(kDiv5MarginTop, Fixed));
|
| + NGBox* div5 = new NGBox(div5_style.get());
|
|
|
| - // DIV4
|
| - RefPtr<ComputedStyle> div4_style = ComputedStyle::create();
|
| - div4_style->setMarginTop(Length(kDiv4MarginTop, Fixed));
|
| - NGBox* div4 = new NGBox(div4_style.get());
|
| + // DIV7
|
| + RefPtr<ComputedStyle> div7_style = ComputedStyle::create();
|
| + div7_style->setMarginTop(Length(kDiv7MarginTop, Fixed));
|
| + NGBox* div7 = new NGBox(div7_style.get());
|
|
|
| div1->SetFirstChild(div2);
|
| - div3->SetFirstChild(div4);
|
| - div1->SetNextSibling(div3);
|
| + div2->SetNextSibling(div3);
|
| + div1->SetNextSibling(div4);
|
| + div4->SetNextSibling(div5);
|
| + div5->SetFirstChild(div6);
|
| + div6->SetNextSibling(div7);
|
|
|
| auto* space =
|
| new NGConstraintSpace(HorizontalTopBottom, LeftToRight,
|
| NGLogicalSize(LayoutUnit(100), NGSizeIndefinite));
|
| NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, div1);
|
|
|
| - ASSERT_EQ(frag->Children().size(), 2UL);
|
| + ASSERT_EQ(frag->Children().size(), 3UL);
|
|
|
| + // DIV1
|
| const NGPhysicalFragmentBase* child = frag->Children()[0];
|
| - EXPECT_EQ(child->Height(), kHeight);
|
| - EXPECT_EQ(child->TopOffset(), 0);
|
| + EXPECT_EQ(kHeight, child->Height());
|
| + EXPECT_EQ(0, child->TopOffset());
|
|
|
| - child = frag->Children()[1];
|
| - EXPECT_EQ(child->Height(), kHeight);
|
| - EXPECT_EQ(child->TopOffset(), kHeight + kExpectedCollapsedMargin);
|
| + // DIV5
|
| + child = frag->Children()[2];
|
| + EXPECT_EQ(kHeight, child->Height());
|
| + EXPECT_EQ(kHeight + kExpectedCollapsedMargin, child->TopOffset());
|
| }
|
|
|
| // Verifies the collapsing margins case for the next pair:
|
| @@ -267,14 +282,14 @@ TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase3) {
|
| NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, div1);
|
|
|
| // Verify that margins are collapsed.
|
| - EXPECT_EQ(frag->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(0), LayoutUnit(kDiv2MarginBottom)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(0), LayoutUnit(kDiv2MarginBottom)}),
|
| + frag->MarginStrut());
|
|
|
| // Verify that margins are NOT collapsed.
|
| div1_style->setHeight(Length(kHeight, Fixed));
|
| frag = RunBlockLayoutAlgorithm(space, div1);
|
| - EXPECT_EQ(frag->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(0), LayoutUnit(kDiv1MarginBottom)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(0), LayoutUnit(kDiv1MarginBottom)}),
|
| + frag->MarginStrut());
|
| }
|
|
|
| // Verifies that 2 adjoining margins are not collapsed if there is padding or
|
| @@ -317,18 +332,64 @@ TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase4) {
|
|
|
| // Verify that margins do NOT collapse.
|
| frag = RunBlockLayoutAlgorithm(space, div1);
|
| - EXPECT_EQ(frag->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(kDiv1Margin), LayoutUnit(kDiv1Margin)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(kDiv1Margin), LayoutUnit(kDiv1Margin)}),
|
| + frag->MarginStrut());
|
| ASSERT_EQ(frag->Children().size(), 1UL);
|
| - EXPECT_EQ(frag->Children()[0]->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(kDiv2Margin), LayoutUnit(kDiv2Margin)}));
|
| +
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(kDiv2Margin), LayoutUnit(kDiv2Margin)}),
|
| + frag->Children()[0]->MarginStrut());
|
|
|
| // Reset padding and verify that margins DO collapse.
|
| div1_style->setPaddingTop(Length(0, Fixed));
|
| div1_style->setPaddingBottom(Length(0, Fixed));
|
| frag = RunBlockLayoutAlgorithm(space, div1);
|
| - EXPECT_EQ(frag->MarginStrut(),
|
| - NGMarginStrut({LayoutUnit(kDiv2Margin), LayoutUnit(kDiv2Margin)}));
|
| + EXPECT_EQ(NGMarginStrut({LayoutUnit(kDiv2Margin), LayoutUnit(kDiv2Margin)}),
|
| + frag->MarginStrut());
|
| +}
|
| +
|
| +// Verifies that margins of 2 adjoining blocks with different writing modes
|
| +// get collapsed.
|
| +//
|
| +// Test case's HTML representation:
|
| +// <div style="writing-mode: vertical-lr;">
|
| +// <div style="margin-right: 60px; width: 60px;">vertical</div>
|
| +// <div style="margin-left: 100px; writing-mode: horizontal-tb;">
|
| +// horizontal
|
| +// </div>
|
| +// </div>
|
| +TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase5) {
|
| + const int kVerticalDivMarginRight = 60;
|
| + const int kVerticalDivWidth = 60;
|
| + const int kHorizontalDivMarginLeft = 100;
|
| +
|
| + style_->setWidth(Length(500, Fixed));
|
| + style_->setHeight(Length(500, Fixed));
|
| + style_->setWritingMode(LeftToRightWritingMode);
|
| +
|
| + // Vertical DIV
|
| + RefPtr<ComputedStyle> vertical_style = ComputedStyle::create();
|
| + vertical_style->setMarginRight(Length(kVerticalDivMarginRight, Fixed));
|
| + vertical_style->setWidth(Length(kVerticalDivWidth, Fixed));
|
| + NGBox* vertical_div = new NGBox(vertical_style.get());
|
| +
|
| + // Horizontal DIV
|
| + RefPtr<ComputedStyle> horizontal_style = ComputedStyle::create();
|
| + horizontal_style->setMarginLeft(Length(kHorizontalDivMarginLeft, Fixed));
|
| + horizontal_style->setWritingMode(TopToBottomWritingMode);
|
| + NGBox* horizontal_div = new NGBox(horizontal_style.get());
|
| +
|
| + vertical_div->SetNextSibling(horizontal_div);
|
| +
|
| + auto* space =
|
| + new NGConstraintSpace(VerticalLeftRight, LeftToRight,
|
| + NGLogicalSize(LayoutUnit(500), LayoutUnit(500)));
|
| + NGPhysicalFragment* frag = RunBlockLayoutAlgorithm(space, vertical_div);
|
| +
|
| + ASSERT_EQ(frag->Children().size(), 2UL);
|
| + const NGPhysicalFragmentBase* child = frag->Children()[1];
|
| + // Horizontal div
|
| + EXPECT_EQ(0, child->TopOffset());
|
| + EXPECT_EQ(kVerticalDivWidth + kHorizontalDivMarginLeft, child->LeftOffset());
|
| }
|
|
|
| // Verifies that a box's size includes its borders and padding, and that
|
|
|