| 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 |