Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc

Issue 2651793013: Fix incorrectly calculated size/position information for writing-modes (Closed)
Patch Set: git rebase-update Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_block_layout_algorithm.h" 5 #include "core/layout/ng/ng_block_layout_algorithm.h"
6 6
7 #include "core/dom/NodeComputedStyle.h" 7 #include "core/dom/NodeComputedStyle.h"
8 #include "core/dom/TagCollection.h" 8 #include "core/dom/TagCollection.h"
9 #include "core/layout/ng/layout_ng_block_flow.h" 9 #include "core/layout/ng/layout_ng_block_flow.h"
10 #include "core/layout/ng/ng_block_node.h" 10 #include "core/layout/ng/ng_block_node.h"
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 // child's height 50 537 // child's height 50
538 EXPECT_EQ(NGPhysicalSize(LayoutUnit(800), LayoutUnit(450)), fragment->Size()); 538 EXPECT_EQ(NGPhysicalSize(LayoutUnit(800), LayoutUnit(450)), fragment->Size());
539 // 200 = (body's margin 8, container's margin 30, child's margin 200) 539 // 200 = (body's margin 8, container's margin 30, child's margin 200)
540 EXPECT_EQ(LayoutUnit(200), body_fragment->TopOffset()); 540 EXPECT_EQ(LayoutUnit(200), body_fragment->TopOffset());
541 // 0 = collapsed margins 541 // 0 = collapsed margins
542 EXPECT_EQ(LayoutUnit(0), child_fragment->TopOffset()); 542 EXPECT_EQ(LayoutUnit(0), child_fragment->TopOffset());
543 } 543 }
544 544
545 // Verifies that margins of 2 adjoining blocks with different writing modes 545 // Verifies that margins of 2 adjoining blocks with different writing modes
546 // get collapsed. 546 // get collapsed.
547 // 547 TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase5) {
548 // Test case's HTML representation: 548 setBodyInnerHTML(
549 // <div style="writing-mode: vertical-lr;"> 549 "<style>"
550 // <div style="margin-right: 60px; width: 60px;">vertical</div> 550 // TODO(glebl): Remove the fixed height
551 // <div style="margin-left: 100px; writing-mode: horizontal-tb;"> 551 // Fix this once min/max algorithm handles orthogonal children.
552 // horizontal 552 " body {"
553 // </div> 553 " height: 500px;"
554 // </div> 554 " }"
555 // TODO(glebl): fix writing modes support after new margin collapsing/floats 555 " #container {"
556 // algorithm is checked in. 556 " margin-top: 10px;"
557 TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_CollapsingMarginsCase5) { 557 // TODO(glebl): Remove the fixed height
558 const int kVerticalDivMarginRight = 60; 558 // Fix this once min/max algorithm handles orthogonal children.
559 const int kVerticalDivWidth = 50; 559 " width: 500px;"
560 const int kHorizontalDivMarginLeft = 100; 560 " writing-mode: vertical-lr;"
561 " }"
562 " #vertical {"
563 " margin-right: 90px;"
564 " background-color: red;"
565 " height: 70px;"
566 " width: 30px;"
567 " }"
568 " #horizontal {"
569 " background-color: blue;"
570 " margin-left: 100px;"
571 " writing-mode: horizontal-tb;"
572 " height: 60px;"
573 " width: 30px;"
574 " }"
575 "</style>"
576 "<div id='container'>"
577 " <div id='vertical'></div>"
578 " <div id='horizontal'></div>"
579 "</div>");
580 RefPtr<NGPhysicalBoxFragment> fragment;
581 std::tie(fragment, std::ignore) = RunBlockLayoutAlgorithmForElement(
582 document().getElementsByTagName("html")->item(0));
561 583
562 style_->setWidth(Length(500, Fixed)); 584 // body
563 style_->setHeight(Length(500, Fixed)); 585 auto* body_fragment = toNGPhysicalBoxFragment(fragment->Children()[0].get());
564 style_->setWritingMode(WritingMode::kVerticalLr); 586 // 10 = std::max(body's margin 8, container's margin top)
587 int body_top_offset = 10;
588 EXPECT_THAT(body_fragment->TopOffset(), LayoutUnit(body_top_offset));
589 int body_left_offset = 8;
590 EXPECT_THAT(body_fragment->LeftOffset(), LayoutUnit(body_left_offset));
591 // height = 70. std::max(vertical height's 70, horizontal's height's 60)
592 // TODO(glebl): Should be 70! Fix this once min/max algorithm handles
593 // orthogonal children.
594 int body_fragment_block_size = 500;
595 ASSERT_EQ(
596 NGPhysicalSize(LayoutUnit(784), LayoutUnit(body_fragment_block_size)),
597 body_fragment->Size());
598 ASSERT_EQ(1UL, body_fragment->Children().size());
565 599
566 // Vertical DIV 600 // container
567 RefPtr<ComputedStyle> vertical_style = ComputedStyle::create(); 601 auto* container_fragment =
568 vertical_style->setMarginRight(Length(kVerticalDivMarginRight, Fixed)); 602 toNGPhysicalBoxFragment(body_fragment->Children()[0].get());
569 vertical_style->setWidth(Length(kVerticalDivWidth, Fixed)); 603 // Container's margins are collapsed with body's fragment.
570 NGBlockNode* vertical_div = new NGBlockNode(vertical_style.get()); 604 EXPECT_THAT(container_fragment->TopOffset(), LayoutUnit());
605 EXPECT_THAT(container_fragment->LeftOffset(), LayoutUnit());
606 ASSERT_EQ(2UL, container_fragment->Children().size());
571 607
572 // Horizontal DIV 608 // vertical
573 RefPtr<ComputedStyle> horizontal_style = ComputedStyle::create(); 609 auto* vertical_fragment =
574 horizontal_style->setMarginLeft(Length(kHorizontalDivMarginLeft, Fixed)); 610 toNGPhysicalBoxFragment(container_fragment->Children()[0].get());
575 horizontal_style->setWritingMode(WritingMode::kHorizontalTb); 611 EXPECT_THAT(vertical_fragment->TopOffset(), LayoutUnit());
576 NGBlockNode* horizontal_div = new NGBlockNode(horizontal_style.get()); 612 EXPECT_THAT(vertical_fragment->LeftOffset(), LayoutUnit());
577 613
578 vertical_div->SetNextSibling(horizontal_div); 614 // horizontal
579 615 auto* horizontal_fragment =
580 auto* space = 616 toNGPhysicalBoxFragment(container_fragment->Children()[1].get());
581 ConstructConstraintSpace(kVerticalLeftRight, TextDirection::kLtr, 617 EXPECT_THAT(horizontal_fragment->TopOffset(), LayoutUnit());
582 NGLogicalSize(LayoutUnit(500), LayoutUnit(500))); 618 // 130 = vertical's width 30 +
583 RefPtr<NGPhysicalBoxFragment> frag = 619 // std::max(vertical's margin right 90, horizontal's margin-left 100)
584 RunBlockLayoutAlgorithm(space, vertical_div); 620 EXPECT_THAT(horizontal_fragment->LeftOffset(), LayoutUnit(130));
585
586 ASSERT_EQ(frag->Children().size(), 2UL);
587 const NGPhysicalFragment* child = frag->Children()[1].get();
588 // Horizontal div
589 EXPECT_EQ(0, child->TopOffset());
590 EXPECT_EQ(kVerticalDivWidth + kHorizontalDivMarginLeft, child->LeftOffset());
591 } 621 }
592 622
593 // Verifies that the margin strut of a child with a different writing mode does 623 // Verifies that the margin strut of a child with a different writing mode does
594 // not get used in the collapsing margins calculation. 624 // not get used in the collapsing margins calculation.
595 // 625 //
596 // Test case's HTML representation: 626 // Test case's HTML representation:
597 // <style> 627 // <style>
598 // #div1 { margin-bottom: 10px; height: 60px; writing-mode: vertical-rl; } 628 // #div1 { margin-bottom: 10px; height: 60px; writing-mode: vertical-rl; }
599 // #div2 { margin-left: -20px; width: 10px; } 629 // #div2 { margin-left: -20px; width: 10px; }
600 // #div3 { margin-top: 40px; height: 60px; } 630 // #div3 { margin-top: 40px; height: 60px; }
601 // </style> 631 // </style>
602 // <div id="div1"> 632 // <div id="div1">
603 // <div id="div2">vertical</div> 633 // <div id="div2">vertical</div>
604 // </div> 634 // </div>
605 // <div id="div3"></div> 635 // <div id="div3"></div>
606 TEST_F(NGBlockLayoutAlgorithmTest, CollapsingMarginsCase6) { 636 // TODO(glebl): Disabled for now. Follow-up with kojii@ on
637 // https://software.hixie.ch/utilities/js/live-dom-viewer/?saved=4844
638 TEST_F(NGBlockLayoutAlgorithmTest, DISABLED_CollapsingMarginsCase6) {
607 const int kHeight = 60; 639 const int kHeight = 60;
608 const int kWidth = 10; 640 const int kWidth = 10;
609 const int kMarginBottom = 10; 641 const int kMarginBottom = 10;
610 const int kMarginLeft = -20; 642 const int kMarginLeft = -20;
611 const int kMarginTop = 40; 643 const int kMarginTop = 40;
612 644
613 style_->setWidth(Length(500, Fixed)); 645 style_->setWidth(Length(500, Fixed));
614 style_->setHeight(Length(500, Fixed)); 646 style_->setHeight(Length(500, Fixed));
615 647
616 // DIV1 648 // DIV1
(...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1970 EXPECT_EQ(LayoutUnit(194), fragment->LeftOffset()); 2002 EXPECT_EQ(LayoutUnit(194), fragment->LeftOffset());
1971 EXPECT_EQ(LayoutUnit(), fragment->TopOffset()); 2003 EXPECT_EQ(LayoutUnit(), fragment->TopOffset());
1972 EXPECT_EQ(LayoutUnit(16), fragment->Width()); 2004 EXPECT_EQ(LayoutUnit(16), fragment->Width());
1973 EXPECT_EQ(LayoutUnit(50), fragment->Height()); 2005 EXPECT_EQ(LayoutUnit(50), fragment->Height());
1974 EXPECT_EQ(0UL, fragment->Children().size()); 2006 EXPECT_EQ(0UL, fragment->Children().size());
1975 EXPECT_FALSE(iterator.NextChild()); 2007 EXPECT_FALSE(iterator.NextChild());
1976 } 2008 }
1977 2009
1978 } // namespace 2010 } // namespace
1979 } // namespace blink 2011 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698