| OLD | NEW |
| 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/LayoutTestHelper.h" | 9 #include "core/layout/LayoutTestHelper.h" |
| 10 #include "core/layout/ng/layout_ng_block_flow.h" | 10 #include "core/layout/ng/layout_ng_block_flow.h" |
| (...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 ASSERT_EQ(empty1_fragment->Children().size(), 1UL); | 865 ASSERT_EQ(empty1_fragment->Children().size(), 1UL); |
| 866 | 866 |
| 867 auto* empty2_fragment = | 867 auto* empty2_fragment = |
| 868 ToNGPhysicalBoxFragment(empty1_fragment->Children()[0].Get()); | 868 ToNGPhysicalBoxFragment(empty1_fragment->Children()[0].Get()); |
| 869 // 0, vertical margins got collapsed | 869 // 0, vertical margins got collapsed |
| 870 EXPECT_THAT(LayoutUnit(), empty2_fragment->Offset().top); | 870 EXPECT_THAT(LayoutUnit(), empty2_fragment->Offset().top); |
| 871 // 35 = empty1's padding(20) + empty2's padding(15) | 871 // 35 = empty1's padding(20) + empty2's padding(15) |
| 872 int empty2_inline_offset = 35; | 872 int empty2_inline_offset = 35; |
| 873 EXPECT_THAT(empty2_fragment->Offset().left, LayoutUnit(empty2_inline_offset)); | 873 EXPECT_THAT(empty2_fragment->Offset().left, LayoutUnit(empty2_inline_offset)); |
| 874 | 874 |
| 875 ASSERT_EQ(2UL, container_fragment->PositionedFloats().size()); | 875 ASSERT_EQ(2UL, empty2_fragment->PositionedFloats().size()); |
| 876 RefPtr<NGPhysicalFragment> left_float_fragment = | 876 RefPtr<NGPhysicalFragment> left_float_fragment = |
| 877 container_fragment->PositionedFloats().at(0).fragment; | 877 empty2_fragment->PositionedFloats().at(0).fragment; |
| 878 // inline 25 = empty2's padding(15) + left float's margin(10) | 878 // inline 25 = empty2's padding(15) + left float's margin(10) |
| 879 // block 10 = left float's margin | 879 // block 10 = left float's margin |
| 880 EXPECT_THAT(left_float_fragment->Offset(), | 880 EXPECT_THAT(left_float_fragment->Offset(), |
| 881 NGPhysicalOffset(LayoutUnit(25), LayoutUnit(10))); | 881 NGPhysicalOffset(LayoutUnit(25), LayoutUnit(10))); |
| 882 | 882 |
| 883 auto right_float_fragment = | 883 auto right_float_fragment = |
| 884 container_fragment->PositionedFloats().at(1).fragment; | 884 empty2_fragment->PositionedFloats().at(1).fragment; |
| 885 LayoutUnit right_float_offset = LayoutUnit(125); | 885 LayoutUnit right_float_offset = LayoutUnit(125); |
| 886 // inline offset 150 = empty2's padding(15) + right float's margin(10) + right | 886 // inline offset 150 = empty2's padding(15) + right float's margin(10) + right |
| 887 // float offset(125) | 887 // float offset(125) |
| 888 // block offset 15 = right float's margin | 888 // block offset 15 = right float's margin |
| 889 EXPECT_THAT( | 889 EXPECT_THAT( |
| 890 right_float_fragment->Offset(), | 890 right_float_fragment->Offset(), |
| 891 NGPhysicalOffset(LayoutUnit(25) + right_float_offset, LayoutUnit(15))); | 891 NGPhysicalOffset(LayoutUnit(25) + right_float_offset, LayoutUnit(15))); |
| 892 | 892 |
| 893 // ** Verify layout tree ** | 893 // ** Verify layout tree ** |
| 894 Element* left_float = GetDocument().getElementById("left-float"); | 894 Element* left_float = GetDocument().getElementById("left-float"); |
| 895 // 88 = body's margin(8) + | 895 // 88 = body's margin(8) + |
| 896 // empty1's padding and margin + empty2's padding and margins + float's | 896 // empty1's padding and margin + empty2's padding and margins + float's |
| 897 // padding | 897 // padding |
| 898 EXPECT_THAT(left_float->OffsetLeft(), 88); | 898 EXPECT_THAT(left_float->OffsetLeft(), 88); |
| 899 // 30 = body_top_offset(collapsed margins result) + float's padding | 899 // 30 = body_top_offset(collapsed margins result) + float's padding |
| 900 EXPECT_THAT(left_float->OffsetTop(), body_top_offset + 10); | 900 EXPECT_THAT(left_float->OffsetTop(), body_top_offset + 10); |
| 901 | 901 |
| 902 // ** Legacy Floating objects ** | 902 // ** Legacy Floating objects ** |
| 903 // #container is the 1st non-empty block so floats are attached to it. | 903 Element* empty2 = GetDocument().getElementById("empty2"); |
| 904 Element* container = GetDocument().getElementById("container"); | |
| 905 auto& floating_objects = | 904 auto& floating_objects = |
| 906 const_cast<FloatingObjects*>( | 905 const_cast<FloatingObjects*>( |
| 907 ToLayoutBlockFlow(container->GetLayoutObject())->GetFloatingObjects()) | 906 ToLayoutBlockFlow(empty2->GetLayoutObject())->GetFloatingObjects()) |
| 908 ->MutableSet(); | 907 ->MutableSet(); |
| 909 ASSERT_EQ(2UL, floating_objects.size()); | 908 ASSERT_EQ(2UL, floating_objects.size()); |
| 910 auto left_floating_object = floating_objects.TakeFirst(); | 909 auto left_floating_object = floating_objects.TakeFirst(); |
| 911 ASSERT_TRUE(left_floating_object->IsPlaced()); | 910 ASSERT_TRUE(left_floating_object->IsPlaced()); |
| 912 // 80 = float_inline_offset(25) + accumulative offset of empty blocks(35 + 20) | 911 // 80 = float_inline_offset(25) + accumulative offset of empty blocks(35 + 20) |
| 913 EXPECT_THAT(left_floating_object->X(), LayoutUnit(80)); | 912 EXPECT_THAT(left_floating_object->X(), LayoutUnit(25)); |
| 914 // 10 = left float's margin | 913 // 10 = left float's margin |
| 915 EXPECT_THAT(left_floating_object->Y(), LayoutUnit(10)); | 914 EXPECT_THAT(left_floating_object->Y(), LayoutUnit(10)); |
| 916 | 915 |
| 917 auto right_floating_object = floating_objects.TakeFirst(); | 916 auto right_floating_object = floating_objects.TakeFirst(); |
| 918 ASSERT_TRUE(right_floating_object->IsPlaced()); | 917 ASSERT_TRUE(right_floating_object->IsPlaced()); |
| 919 // 205 = float_inline_offset(25) + | 918 // 150 = float_inline_offset(25) + |
| 920 // accumulative offset of empty blocks(35 + 20) | 919 // right float offset(125) |
| 921 // + right float offset(125) | 920 EXPECT_THAT(right_floating_object->X(), LayoutUnit(150)); |
| 922 EXPECT_THAT(right_floating_object->X(), LayoutUnit(80) + right_float_offset); | |
| 923 // 15 = right float's margin | 921 // 15 = right float's margin |
| 924 EXPECT_THAT(right_floating_object->Y(), LayoutUnit(15)); | 922 EXPECT_THAT(right_floating_object->Y(), LayoutUnit(15)); |
| 925 } | 923 } |
| 926 | 924 |
| 927 // Verifies that left/right floating and regular blocks can be positioned | 925 // Verifies that left/right floating and regular blocks can be positioned |
| 928 // correctly by the algorithm. | 926 // correctly by the algorithm. |
| 929 TEST_F(NGBlockLayoutAlgorithmTest, PositionFloatFragments) { | 927 TEST_F(NGBlockLayoutAlgorithmTest, PositionFloatFragments) { |
| 930 SetBodyInnerHTML(R"HTML( | 928 SetBodyInnerHTML(R"HTML( |
| 931 <style> | 929 <style> |
| 932 #container { | 930 #container { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 std::tie(fragment, space) = RunBlockLayoutAlgorithmForElement( | 977 std::tie(fragment, space) = RunBlockLayoutAlgorithmForElement( |
| 980 GetDocument().getElementsByTagName("html")->item(0)); | 978 GetDocument().getElementsByTagName("html")->item(0)); |
| 981 | 979 |
| 982 // ** Verify LayoutNG fragments and the list of positioned floats ** | 980 // ** Verify LayoutNG fragments and the list of positioned floats ** |
| 983 ASSERT_EQ(1UL, fragment->Children().size()); | 981 ASSERT_EQ(1UL, fragment->Children().size()); |
| 984 auto* body_fragment = ToNGPhysicalBoxFragment(fragment->Children()[0].Get()); | 982 auto* body_fragment = ToNGPhysicalBoxFragment(fragment->Children()[0].Get()); |
| 985 EXPECT_THAT(LayoutUnit(8), body_fragment->Offset().top); | 983 EXPECT_THAT(LayoutUnit(8), body_fragment->Offset().top); |
| 986 auto* container_fragment = | 984 auto* container_fragment = |
| 987 ToNGPhysicalBoxFragment(body_fragment->Children()[0].Get()); | 985 ToNGPhysicalBoxFragment(body_fragment->Children()[0].Get()); |
| 988 ASSERT_EQ(1UL, container_fragment->Children().size()); | 986 ASSERT_EQ(1UL, container_fragment->Children().size()); |
| 989 auto* regular_fragment = | 987 ASSERT_EQ(4UL, container_fragment->PositionedFloats().size()); |
| 990 ToNGPhysicalBoxFragment(container_fragment->Children()[0].Get()); | |
| 991 ASSERT_EQ(2UL, container_fragment->PositionedFloats().size()); | |
| 992 ASSERT_EQ(2UL, regular_fragment->PositionedFloats().size()); | |
| 993 | 988 |
| 994 // ** Verify layout tree ** | 989 // ** Verify layout tree ** |
| 995 Element* left_float = GetDocument().getElementById("left-float"); | 990 Element* left_float = GetDocument().getElementById("left-float"); |
| 996 // 8 = body's margin-top | 991 // 8 = body's margin-top |
| 997 int left_float_block_offset = 8; | 992 int left_float_block_offset = 8; |
| 998 EXPECT_EQ(left_float_block_offset, left_float->OffsetTop()); | 993 EXPECT_EQ(left_float_block_offset, left_float->OffsetTop()); |
| 999 auto left_float_fragment = | 994 auto left_float_fragment = |
| 1000 regular_fragment->PositionedFloats().at(0).fragment; | 995 container_fragment->PositionedFloats().at(0).fragment; |
| 1001 EXPECT_THAT(LayoutUnit(), left_float_fragment->Offset().top); | 996 EXPECT_THAT(LayoutUnit(), left_float_fragment->Offset().top); |
| 1002 | 997 |
| 1003 Element* left_wide_float = GetDocument().getElementById("left-wide-float"); | 998 Element* left_wide_float = GetDocument().getElementById("left-wide-float"); |
| 1004 // left-wide-float is positioned right below left-float as it's too wide. | 999 // left-wide-float is positioned right below left-float as it's too wide. |
| 1005 // 38 = left_float_block_offset + | 1000 // 38 = left_float_block_offset + |
| 1006 // left-float's height 30 | 1001 // left-float's height 30 |
| 1007 int left_wide_float_block_offset = 38; | 1002 int left_wide_float_block_offset = 38; |
| 1008 EXPECT_EQ(left_wide_float_block_offset, left_wide_float->OffsetTop()); | 1003 EXPECT_EQ(left_wide_float_block_offset, left_wide_float->OffsetTop()); |
| 1009 auto left_wide_float_fragment = | 1004 auto left_wide_float_fragment = |
| 1010 regular_fragment->PositionedFloats().at(1).fragment; | 1005 container_fragment->PositionedFloats().at(1).fragment; |
| 1011 // 30 = left-float's height. | 1006 // 30 = left-float's height. |
| 1012 EXPECT_THAT(LayoutUnit(30), left_wide_float_fragment->Offset().top); | 1007 EXPECT_THAT(LayoutUnit(30), left_wide_float_fragment->Offset().top); |
| 1013 | 1008 |
| 1014 Element* regular = GetDocument().getElementById("regular"); | 1009 Element* regular = GetDocument().getElementById("regular"); |
| 1015 // regular_block_offset = body's margin-top 8 | 1010 // regular_block_offset = body's margin-top 8 |
| 1016 int regular_block_offset = 8; | 1011 int regular_block_offset = 8; |
| 1017 EXPECT_EQ(regular_block_offset, regular->OffsetTop()); | 1012 EXPECT_EQ(regular_block_offset, regular->OffsetTop()); |
| 1018 auto* regular_block_fragment = | 1013 auto* regular_block_fragment = |
| 1019 ToNGPhysicalBoxFragment(container_fragment->Children()[0].Get()); | 1014 ToNGPhysicalBoxFragment(container_fragment->Children()[0].Get()); |
| 1020 EXPECT_THAT(LayoutUnit(), regular_block_fragment->Offset().top); | 1015 EXPECT_THAT(LayoutUnit(), regular_block_fragment->Offset().top); |
| 1021 | 1016 |
| 1022 Element* right_float = GetDocument().getElementById("right-float"); | 1017 Element* right_float = GetDocument().getElementById("right-float"); |
| 1023 // 158 = body's margin-left 8 + container's width 200 - right_float's width 50 | 1018 // 158 = body's margin-left 8 + container's width 200 - right_float's width 50 |
| 1024 int right_float_inline_offset = 158; | 1019 int right_float_inline_offset = 158; |
| 1025 // it's positioned right after our left_wide_float | 1020 // it's positioned right after our left_wide_float |
| 1026 // 68 = left_wide_float_block_offset 38 + left-wide-float's height 30 | 1021 // 68 = left_wide_float_block_offset 38 + left-wide-float's height 30 |
| 1027 int right_float_block_offset = left_wide_float_block_offset + 30; | 1022 int right_float_block_offset = left_wide_float_block_offset + 30; |
| 1028 EXPECT_EQ(right_float_inline_offset, right_float->OffsetLeft()); | 1023 EXPECT_EQ(right_float_inline_offset, right_float->OffsetLeft()); |
| 1029 EXPECT_EQ(right_float_block_offset, right_float->OffsetTop()); | 1024 EXPECT_EQ(right_float_block_offset, right_float->OffsetTop()); |
| 1030 auto right_float_fragment = | 1025 auto right_float_fragment = |
| 1031 container_fragment->PositionedFloats().at(0).fragment; | 1026 container_fragment->PositionedFloats().at(2).fragment; |
| 1032 // 60 = right_float_block_offset(68) - body's margin(8) | 1027 // 60 = right_float_block_offset(68) - body's margin(8) |
| 1033 EXPECT_THAT(LayoutUnit(right_float_block_offset - 8), | 1028 EXPECT_THAT(LayoutUnit(right_float_block_offset - 8), |
| 1034 right_float_fragment->Offset().top); | 1029 right_float_fragment->Offset().top); |
| 1035 // 150 = right_float_inline_offset(158) - body's margin(8) | 1030 // 150 = right_float_inline_offset(158) - body's margin(8) |
| 1036 EXPECT_THAT(LayoutUnit(right_float_inline_offset - 8), | 1031 EXPECT_THAT(LayoutUnit(right_float_inline_offset - 8), |
| 1037 right_float_fragment->Offset().left); | 1032 right_float_fragment->Offset().left); |
| 1038 | 1033 |
| 1039 Element* left_float_with_margin = | 1034 Element* left_float_with_margin = |
| 1040 GetDocument().getElementById("left-float-with-margin"); | 1035 GetDocument().getElementById("left-float-with-margin"); |
| 1041 // 18 = body's margin(8) + left-float-with-margin's margin(10) | 1036 // 18 = body's margin(8) + left-float-with-margin's margin(10) |
| 1042 int left_float_with_margin_inline_offset = 18; | 1037 int left_float_with_margin_inline_offset = 18; |
| 1043 EXPECT_EQ(left_float_with_margin_inline_offset, | 1038 EXPECT_EQ(left_float_with_margin_inline_offset, |
| 1044 left_float_with_margin->OffsetLeft()); | 1039 left_float_with_margin->OffsetLeft()); |
| 1045 // 78 = left_wide_float_block_offset 38 + left-wide-float's height 30 + | 1040 // 78 = left_wide_float_block_offset 38 + left-wide-float's height 30 + |
| 1046 // left-float-with-margin's margin(10) | 1041 // left-float-with-margin's margin(10) |
| 1047 int left_float_with_margin_block_offset = 78; | 1042 int left_float_with_margin_block_offset = 78; |
| 1048 EXPECT_EQ(left_float_with_margin_block_offset, | 1043 EXPECT_EQ(left_float_with_margin_block_offset, |
| 1049 left_float_with_margin->OffsetTop()); | 1044 left_float_with_margin->OffsetTop()); |
| 1050 auto left_float_with_margin_fragment = | 1045 auto left_float_with_margin_fragment = |
| 1051 container_fragment->PositionedFloats().at(1).fragment; | 1046 container_fragment->PositionedFloats().at(3).fragment; |
| 1052 // 70 = left_float_with_margin_block_offset(78) - body's margin(8) | 1047 // 70 = left_float_with_margin_block_offset(78) - body's margin(8) |
| 1053 EXPECT_THAT(LayoutUnit(left_float_with_margin_block_offset - 8), | 1048 EXPECT_THAT(LayoutUnit(left_float_with_margin_block_offset - 8), |
| 1054 left_float_with_margin_fragment->Offset().top); | 1049 left_float_with_margin_fragment->Offset().top); |
| 1055 // 10 = left_float_with_margin_inline_offset(18) - body's margin(8) | 1050 // 10 = left_float_with_margin_inline_offset(18) - body's margin(8) |
| 1056 EXPECT_THAT(LayoutUnit(left_float_with_margin_inline_offset - 8), | 1051 EXPECT_THAT(LayoutUnit(left_float_with_margin_inline_offset - 8), |
| 1057 left_float_with_margin_fragment->Offset().left); | 1052 left_float_with_margin_fragment->Offset().left); |
| 1058 } | 1053 } |
| 1059 | 1054 |
| 1060 // Verifies that NG block layout algorithm respects "clear" CSS property. | 1055 // Verifies that NG block layout algorithm respects "clear" CSS property. |
| 1061 TEST_F(NGBlockLayoutAlgorithmTest, PositionFragmentsWithClear) { | 1056 TEST_F(NGBlockLayoutAlgorithmTest, PositionFragmentsWithClear) { |
| (...skipping 1530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2592 EXPECT_EQ(NGPhysicalSize(LayoutUnit(70), LayoutUnit(0)), child->Size()); | 2587 EXPECT_EQ(NGPhysicalSize(LayoutUnit(70), LayoutUnit(0)), child->Size()); |
| 2593 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(-10)), child->Offset()); | 2588 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(-10)), child->Offset()); |
| 2594 | 2589 |
| 2595 child = iterator.NextChild(); | 2590 child = iterator.NextChild(); |
| 2596 EXPECT_EQ(NGPhysicalSize(LayoutUnit(90), LayoutUnit(20)), child->Size()); | 2591 EXPECT_EQ(NGPhysicalSize(LayoutUnit(90), LayoutUnit(20)), child->Size()); |
| 2597 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(-10)), child->Offset()); | 2592 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(-10)), child->Offset()); |
| 2598 } | 2593 } |
| 2599 | 2594 |
| 2600 } // namespace | 2595 } // namespace |
| 2601 } // namespace blink | 2596 } // namespace blink |
| OLD | NEW |