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 |