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

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

Issue 2954953002: [LayoutNG] Abort a layout once the BFC offset is resolved. (Closed)
Patch Set: rebase. Created 3 years, 5 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/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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698