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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 // second child's height(50) | 347 // second child's height(50) |
348 int empty5_fragment_block_offset = 90; | 348 int empty5_fragment_block_offset = 90; |
349 EXPECT_THAT(LayoutUnit(empty5_fragment_block_offset), | 349 EXPECT_THAT(LayoutUnit(empty5_fragment_block_offset), |
350 empty5_fragment->TopOffset()); | 350 empty5_fragment->TopOffset()); |
351 | 351 |
352 ASSERT_EQ(1UL, body_fragment->PositionedFloats().size()); | 352 ASSERT_EQ(1UL, body_fragment->PositionedFloats().size()); |
353 ASSERT_EQ(1UL, body_fragment->PositionedFloats().size()); | 353 ASSERT_EQ(1UL, body_fragment->PositionedFloats().size()); |
354 auto float_nonempties_fragment = | 354 auto float_nonempties_fragment = |
355 body_fragment->PositionedFloats().at(0)->fragment; | 355 body_fragment->PositionedFloats().at(0)->fragment; |
356 // 70 = first_child's height(50) + first child's margin-bottom(20) | 356 // 70 = first_child's height(50) + first child's margin-bottom(20) |
357 EXPECT_THAT(LayoutUnit(70), float_nonempties_fragment->TopOffset()); | 357 EXPECT_THAT(float_nonempties_fragment->TopOffset(), LayoutUnit(70)); |
358 EXPECT_THAT(LayoutUnit(0), float_nonempties_fragment->LeftOffset()); | 358 EXPECT_THAT(float_nonempties_fragment->LeftOffset(), LayoutUnit(0)); |
359 | 359 |
360 // ** Verify layout tree ** | 360 // ** Verify layout tree ** |
361 Element* first_child = document().getElementById("first-child"); | 361 Element* first_child = document().getElementById("first-child"); |
362 // -7 = body_top_offset | 362 // -7 = body_top_offset |
363 EXPECT_EQ(body_top_offset, first_child->offsetTop()); | 363 EXPECT_EQ(body_top_offset, first_child->offsetTop()); |
364 } | 364 } |
365 | 365 |
366 // Verifies the collapsing margins case for the next pair: | 366 // Verifies the collapsing margins case for the next pair: |
367 // - bottom margin of a last in-flow child and bottom margin of its parent if | 367 // - bottom margin of a last in-flow child and bottom margin of its parent if |
368 // the parent has 'auto' computed height | 368 // the parent has 'auto' computed height |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 | 842 |
843 // ** Run LayoutNG algorithm ** | 843 // ** Run LayoutNG algorithm ** |
844 RefPtr<NGConstraintSpace> space; | 844 RefPtr<NGConstraintSpace> space; |
845 RefPtr<NGPhysicalBoxFragment> fragment; | 845 RefPtr<NGPhysicalBoxFragment> fragment; |
846 std::tie(fragment, space) = RunBlockLayoutAlgorithmForElement( | 846 std::tie(fragment, space) = RunBlockLayoutAlgorithmForElement( |
847 document().getElementsByTagName("html")->item(0)); | 847 document().getElementsByTagName("html")->item(0)); |
848 | 848 |
849 auto* body_fragment = toNGPhysicalBoxFragment(fragment->Children()[0].get()); | 849 auto* body_fragment = toNGPhysicalBoxFragment(fragment->Children()[0].get()); |
850 // 20 = std::max(empty1's margin, empty2's margin, body's margin) | 850 // 20 = std::max(empty1's margin, empty2's margin, body's margin) |
851 int body_top_offset = 20; | 851 int body_top_offset = 20; |
852 EXPECT_THAT(LayoutUnit(body_top_offset), body_fragment->TopOffset()); | 852 EXPECT_THAT(body_fragment->TopOffset(), LayoutUnit(body_top_offset)); |
853 ASSERT_EQ(1UL, body_fragment->Children().size()); | 853 ASSERT_EQ(1UL, body_fragment->Children().size()); |
854 auto* container_fragment = | 854 auto* container_fragment = |
855 toNGPhysicalBoxFragment(body_fragment->Children()[0].get()); | 855 toNGPhysicalBoxFragment(body_fragment->Children()[0].get()); |
856 ASSERT_EQ(1UL, container_fragment->Children().size()); | 856 ASSERT_EQ(1UL, container_fragment->Children().size()); |
857 | 857 |
858 auto* empty1_fragment = | 858 auto* empty1_fragment = |
859 toNGPhysicalBoxFragment(container_fragment->Children()[0].get()); | 859 toNGPhysicalBoxFragment(container_fragment->Children()[0].get()); |
860 // 0, vertical margins got collapsed | 860 // 0, vertical margins got collapsed |
861 EXPECT_THAT(LayoutUnit(), empty1_fragment->TopOffset()); | 861 EXPECT_THAT(empty1_fragment->TopOffset(), LayoutUnit()); |
862 // 20 empty1's margin | 862 // 20 empty1's margin |
863 int empty1_inline_offset = 20; | 863 int empty1_inline_offset = 20; |
864 EXPECT_THAT(LayoutUnit(empty1_inline_offset), empty1_fragment->LeftOffset()); | 864 EXPECT_THAT(empty1_fragment->LeftOffset(), LayoutUnit(empty1_inline_offset)); |
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->TopOffset()); | 870 EXPECT_THAT(LayoutUnit(), empty2_fragment->TopOffset()); |
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(LayoutUnit(empty2_inline_offset), empty2_fragment->LeftOffset()); | 873 EXPECT_THAT(empty2_fragment->LeftOffset(), LayoutUnit(empty2_inline_offset)); |
874 | 874 |
875 ASSERT_EQ(2UL, container_fragment->PositionedFloats().size()); | 875 ASSERT_EQ(2UL, container_fragment->PositionedFloats().size()); |
876 RefPtr<NGPhysicalFragment> left_float_fragment = | 876 RefPtr<NGPhysicalFragment> left_float_fragment = |
877 container_fragment->PositionedFloats().at(0)->fragment; | 877 container_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(NGPhysicalOffset(LayoutUnit(25), LayoutUnit(10)), | 880 EXPECT_THAT(left_float_fragment->Offset(), |
881 left_float_fragment->Offset()); | 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 container_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 NGPhysicalOffset(LayoutUnit(25) + right_float_offset, LayoutUnit(15)), | 890 right_float_fragment->Offset(), |
891 right_float_fragment->Offset()); | 891 NGPhysicalOffset(LayoutUnit(25) + right_float_offset, LayoutUnit(15))); |
892 | 892 |
893 // ** Verify layout tree ** | 893 // ** Verify layout tree ** |
894 Element* left_float = document().getElementById("left-float"); | 894 Element* left_float = document().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(body_top_offset + 10, left_float->offsetTop()); | 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 // #container is the 1st non-empty block so floats are attached to it. |
904 Element* container = document().getElementById("container"); | 904 Element* container = document().getElementById("container"); |
905 auto& floating_objects = | 905 auto& floating_objects = |
906 const_cast<FloatingObjects*>( | 906 const_cast<FloatingObjects*>( |
907 toLayoutBlockFlow(container->layoutObject())->floatingObjects()) | 907 toLayoutBlockFlow(container->layoutObject())->floatingObjects()) |
908 ->mutableSet(); | 908 ->mutableSet(); |
909 ASSERT_EQ(2UL, floating_objects.size()); | 909 ASSERT_EQ(2UL, floating_objects.size()); |
910 auto left_floating_object = floating_objects.takeFirst(); | 910 auto left_floating_object = floating_objects.takeFirst(); |
911 ASSERT_TRUE(left_floating_object->isPlaced()); | 911 ASSERT_TRUE(left_floating_object->isPlaced()); |
912 // 80 = float_inline_offset(25) + accumulative offset of empty blocks(35 + 20) | 912 // 80 = float_inline_offset(25) + accumulative offset of empty blocks(35 + 20) |
913 EXPECT_THAT(LayoutUnit(80), left_floating_object->x()); | 913 EXPECT_THAT(left_floating_object->x(), LayoutUnit(80)); |
914 // 10 = left float's margin | 914 // 10 = left float's margin |
915 EXPECT_THAT(LayoutUnit(10), left_floating_object->y()); | 915 EXPECT_THAT(left_floating_object->y(), LayoutUnit(10)); |
916 | 916 |
917 auto right_floating_object = floating_objects.takeFirst(); | 917 auto right_floating_object = floating_objects.takeFirst(); |
918 ASSERT_TRUE(right_floating_object->isPlaced()); | 918 ASSERT_TRUE(right_floating_object->isPlaced()); |
919 // 205 = float_inline_offset(25) + | 919 // 205 = float_inline_offset(25) + |
920 // accumulative offset of empty blocks(35 + 20) | 920 // accumulative offset of empty blocks(35 + 20) |
921 // + right float offset(125) | 921 // + right float offset(125) |
922 EXPECT_THAT(LayoutUnit(80) + right_float_offset, right_floating_object->x()); | 922 EXPECT_THAT(right_floating_object->x(), LayoutUnit(80) + right_float_offset); |
923 // 15 = right float's margin | 923 // 15 = right float's margin |
924 EXPECT_THAT(LayoutUnit(15), right_floating_object->y()); | 924 EXPECT_THAT(right_floating_object->y(), LayoutUnit(15)); |
925 } | 925 } |
926 | 926 |
927 // Verifies that left/right floating and regular blocks can be positioned | 927 // Verifies that left/right floating and regular blocks can be positioned |
928 // correctly by the algorithm. | 928 // correctly by the algorithm. |
929 TEST_F(NGBlockLayoutAlgorithmTest, PositionFloatFragments) { | 929 TEST_F(NGBlockLayoutAlgorithmTest, PositionFloatFragments) { |
930 setBodyInnerHTML(R"HTML( | 930 setBodyInnerHTML(R"HTML( |
931 <style> | 931 <style> |
932 #container { | 932 #container { |
933 height: 200px; | 933 height: 200px; |
934 width: 200px; | 934 width: 200px; |
(...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2265 | 2265 |
2266 child = iterator.NextChild(); | 2266 child = iterator.NextChild(); |
2267 EXPECT_EQ(NGPhysicalSize(LayoutUnit(150), LayoutUnit(100)), child->Size()); | 2267 EXPECT_EQ(NGPhysicalSize(LayoutUnit(150), LayoutUnit(100)), child->Size()); |
2268 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(40)), child->Offset()); | 2268 EXPECT_EQ(NGPhysicalOffset(LayoutUnit(0), LayoutUnit(40)), child->Offset()); |
2269 | 2269 |
2270 EXPECT_FALSE(iterator.NextChild()); | 2270 EXPECT_FALSE(iterator.NextChild()); |
2271 } | 2271 } |
2272 | 2272 |
2273 } // namespace | 2273 } // namespace |
2274 } // namespace blink | 2274 } // namespace blink |
OLD | NEW |