| Index: third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
|
| index 70975911cdd00cf8b0b4427a073f87c8ab4277b6..315138841e58873002c043cf7ce592248d33af2e 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
|
| @@ -13,9 +13,11 @@ namespace blink {
|
|
|
| namespace {
|
|
|
| -RefPtr<NGConstraintSpace> ConstructConstraintSpace(NGWritingMode writing_mode,
|
| - TextDirection direction,
|
| - NGLogicalSize size) {
|
| +RefPtr<NGConstraintSpace> ConstructConstraintSpace(
|
| + NGWritingMode writing_mode,
|
| + TextDirection direction,
|
| + NGLogicalSize size,
|
| + const NGLogicalOffset& bfc_offset = {}) {
|
| return NGConstraintSpaceBuilder(writing_mode)
|
| .SetTextDirection(direction)
|
| .SetAvailableSize(size)
|
| @@ -23,13 +25,10 @@ RefPtr<NGConstraintSpace> ConstructConstraintSpace(NGWritingMode writing_mode,
|
| .SetIsFixedSizeInline(true)
|
| .SetIsInlineDirectionTriggersScrollbar(true)
|
| .SetFragmentationType(NGFragmentationType::kFragmentColumn)
|
| + .SetBfcOffset(bfc_offset)
|
| .ToConstraintSpace(writing_mode);
|
| }
|
|
|
| -static String OpportunityToString(const NGLayoutOpportunity& opportunity) {
|
| - return opportunity.IsEmpty() ? String("(empty)") : opportunity.ToString();
|
| -}
|
| -
|
| TEST(NGConstraintSpaceTest, LayoutOpportunitiesNoExclusions) {
|
| NGLogicalSize size;
|
| size.inline_size = LayoutUnit(600);
|
| @@ -38,8 +37,11 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesNoExclusions) {
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
|
|
| NGLayoutOpportunityIterator iterator(space.get());
|
| - EXPECT_EQ("0,0 600x400", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| + // 600x400 at (0,0)
|
| + NGLayoutOpportunity opp1 = {{}, {LayoutUnit(600), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp1, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
|
|
| TEST(NGConstraintSpaceTest, LayoutOpportunitiesTopRightExclusion) {
|
| @@ -50,19 +52,22 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesTopRightExclusion) {
|
| RefPtr<NGConstraintSpace> space =
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
| NGExclusion exclusion;
|
| - exclusion.rect.size = {/* inline_size */ LayoutUnit(100),
|
| - /* block_size */ LayoutUnit(100)};
|
| - exclusion.rect.offset = {/* inline_offset */ LayoutUnit(500),
|
| - /* block_offset */ LayoutUnit(0)};
|
| + exclusion.rect.size = {LayoutUnit(100), LayoutUnit(100)};
|
| + exclusion.rect.offset = {LayoutUnit(500), LayoutUnit()};
|
| space->AddExclusion(exclusion);
|
|
|
| NGLayoutOpportunityIterator iterator(space.get());
|
| - // First opportunity should be to the left of the exclusion.
|
| - EXPECT_EQ("0,0 500x400", OpportunityToString(iterator.Next()));
|
| - // Second opportunity should be below the exclusion.
|
| - EXPECT_EQ("0,100 600x300", OpportunityToString(iterator.Next()));
|
| - // There should be no third opportunity.
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| +
|
| + // First opportunity should be to the left of the exclusion: 500x400 at (0,0)
|
| + NGLayoutOpportunity opp1 = {{}, {LayoutUnit(500), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp1, iterator.Next());
|
| +
|
| + // Second opportunity should be below the exclusion: 600x300 at (0,100)
|
| + NGLayoutOpportunity opp2 = {{LayoutUnit(), LayoutUnit(100)},
|
| + {LayoutUnit(600), LayoutUnit(300)}};
|
| + EXPECT_EQ(opp2, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
|
|
| TEST(NGConstraintSpaceTest, LayoutOpportunitiesTopLeftExclusion) {
|
| @@ -73,19 +78,22 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesTopLeftExclusion) {
|
| RefPtr<NGConstraintSpace> space =
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
| NGExclusion exclusion;
|
| - exclusion.rect.size = {/* inline_size */ LayoutUnit(100),
|
| - /* block_size */ LayoutUnit(100)};
|
| - exclusion.rect.offset = {/* inline_offset */ LayoutUnit(0),
|
| - /* block_offset */ LayoutUnit(0)};
|
| + exclusion.rect.size = {LayoutUnit(100), LayoutUnit(100)};
|
| space->AddExclusion(exclusion);
|
|
|
| NGLayoutOpportunityIterator iterator(space.get());
|
| - // First opportunity should be to the right of the exclusion.
|
| - EXPECT_EQ("100,0 500x400", OpportunityToString(iterator.Next()));
|
| - // Second opportunity should be below the exclusion.
|
| - EXPECT_EQ("0,100 600x300", OpportunityToString(iterator.Next()));
|
| - // There should be no third opportunity.
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| + // First opportunity should be to the right of the exclusion:
|
| + // 500x400 at (100, 0)
|
| + NGLayoutOpportunity opp1 = {{LayoutUnit(100), LayoutUnit()},
|
| + {LayoutUnit(500), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp1, iterator.Next());
|
| +
|
| + // Second opportunity should be below the exclusion: 600x300 at (0,100)
|
| + NGLayoutOpportunity opp2 = {{LayoutUnit(), LayoutUnit(100)},
|
| + {LayoutUnit(600), LayoutUnit(300)}};
|
| + EXPECT_EQ(opp2, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
|
|
| // Verifies that Layout Opportunity iterator produces 7 layout opportunities
|
| @@ -119,32 +127,45 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesTwoInMiddle) {
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
| // Add exclusions
|
| NGExclusion exclusion1;
|
| - exclusion1.rect.size = {/* inline_size */ LayoutUnit(100),
|
| - /* block_size */ LayoutUnit(100)};
|
| - exclusion1.rect.offset = {/* inline_offset */ LayoutUnit(150),
|
| - /* block_offset */ LayoutUnit(200)};
|
| + exclusion1.rect.size = {LayoutUnit(100), LayoutUnit(100)};
|
| + exclusion1.rect.offset = {LayoutUnit(150), LayoutUnit(200)};
|
| space->AddExclusion(exclusion1);
|
| NGExclusion exclusion2;
|
| - exclusion2.rect.size = {/* inline_size */ LayoutUnit(50),
|
| - /* block_size */ LayoutUnit(50)};
|
| - exclusion2.rect.offset = {/* inline_offset */ LayoutUnit(500),
|
| - /* block_offset */ LayoutUnit(350)};
|
| + exclusion2.rect.size = {LayoutUnit(50), LayoutUnit(50)};
|
| + exclusion2.rect.offset = {LayoutUnit(500), LayoutUnit(350)};
|
| space->AddExclusion(exclusion2);
|
|
|
| NGLayoutOpportunityIterator iterator(space.get());
|
| - // 1st Start point
|
| - EXPECT_EQ("0,0 600x200", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("0,0 150x400", OpportunityToString(iterator.Next()));
|
| - // 2nd Start point
|
| - EXPECT_EQ("250,0 350x350", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("250,0 250x400", OpportunityToString(iterator.Next()));
|
| - // 3rd Start point
|
| - EXPECT_EQ("550,0 50x400", OpportunityToString(iterator.Next()));
|
| - // 4th Start point
|
| - EXPECT_EQ("0,300 600x50", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("0,300 500x100", OpportunityToString(iterator.Next()));
|
| - // Iterator is exhausted.
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| + NGLogicalOffset start_point1;
|
| + // 600x200 at (0,0)
|
| + NGLayoutOpportunity opp1 = {start_point1, {LayoutUnit(600), LayoutUnit(200)}};
|
| + EXPECT_EQ(opp1, (iterator.Next()));
|
| + // 150x400 at (0,0)
|
| + NGLayoutOpportunity opp2 = {start_point1, {LayoutUnit(150), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp2, (iterator.Next()));
|
| +
|
| + NGLogicalOffset start_point2 = {LayoutUnit(250), LayoutUnit()};
|
| + // 350x350 at (250,0)
|
| + NGLayoutOpportunity opp3 = {start_point2, {LayoutUnit(350), LayoutUnit(350)}};
|
| + EXPECT_EQ(opp3, (iterator.Next()));
|
| + // 250x400 at (250,0)
|
| + NGLayoutOpportunity opp4 = {start_point2, {LayoutUnit(250), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp4, (iterator.Next()));
|
| +
|
| + NGLogicalOffset start_point3 = {LayoutUnit(550), LayoutUnit()};
|
| + // 50x400 at (550,0)
|
| + NGLayoutOpportunity opp5 = {start_point3, {LayoutUnit(50), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp5, (iterator.Next()));
|
| +
|
| + NGLogicalOffset start_point4 = {LayoutUnit(), LayoutUnit(300)};
|
| + // 600x50 at (0,300)
|
| + NGLayoutOpportunity opp6 = {start_point4, {LayoutUnit(600), LayoutUnit(50)}};
|
| + EXPECT_EQ(opp6, (iterator.Next()));
|
| + // 500x100 at (0,300)
|
| + NGLayoutOpportunity opp7 = {start_point4, {LayoutUnit(500), LayoutUnit(100)}};
|
| + EXPECT_EQ(opp7, (iterator.Next()));
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
|
|
| // This test is the same as LayoutOpportunitiesTwoInMiddle with the only
|
| @@ -169,36 +190,51 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesTwoInMiddleWithOriginAndLeader) {
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
| // Add exclusions
|
| NGExclusion exclusion1;
|
| - exclusion1.rect.size = {/* inline_size */ LayoutUnit(100),
|
| - /* block_size */ LayoutUnit(100)};
|
| - exclusion1.rect.offset = {/* inline_offset */ LayoutUnit(150),
|
| - /* block_offset */ LayoutUnit(200)};
|
| + exclusion1.rect.size = {LayoutUnit(100), LayoutUnit(100)};
|
| + exclusion1.rect.offset = {LayoutUnit(150), LayoutUnit(200)};
|
| space->AddExclusion(exclusion1);
|
| NGExclusion exclusion2;
|
| - exclusion2.rect.size = {/* inline_size */ LayoutUnit(50),
|
| - /* block_size */ LayoutUnit(50)};
|
| - exclusion2.rect.offset = {/* inline_offset */ LayoutUnit(500),
|
| - /* block_offset */ LayoutUnit(350)};
|
| + exclusion2.rect.size = {LayoutUnit(50), LayoutUnit(50)};
|
| + exclusion2.rect.offset = {LayoutUnit(500), LayoutUnit(350)};
|
| space->AddExclusion(exclusion2);
|
|
|
| - const NGLogicalOffset origin_point = {LayoutUnit(0), LayoutUnit(200)};
|
| + const NGLogicalOffset origin_point = {LayoutUnit(), LayoutUnit(200)};
|
| const NGLogicalOffset leader_point = {LayoutUnit(250), LayoutUnit(300)};
|
| NGLayoutOpportunityIterator iterator(space.get(), origin_point, leader_point);
|
| - // 1st Start Point
|
| - EXPECT_EQ("250,200 350x150", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("250,200 250x400", OpportunityToString(iterator.Next()));
|
| - // 2nd Start Point
|
| - EXPECT_EQ("550,200 50x400", OpportunityToString(iterator.Next()));
|
| - // 3rd Start Point
|
| - EXPECT_EQ("0,300 600x50", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("0,300 500x300", OpportunityToString(iterator.Next()));
|
| +
|
| + NGLogicalOffset start_point1 = {LayoutUnit(250), LayoutUnit(200)};
|
| + // 350x150 at (250,200)
|
| + NGLayoutOpportunity opp1 = {start_point1, {LayoutUnit(350), LayoutUnit(150)}};
|
| + EXPECT_EQ(opp1, iterator.Next());
|
| + // 250x400 at (250,200)
|
| + NGLayoutOpportunity opp2 = {start_point1, {LayoutUnit(250), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp2, iterator.Next());
|
| +
|
| + NGLogicalOffset start_point2 = {LayoutUnit(550), LayoutUnit(200)};
|
| + // 50x400 at (550,200)
|
| + NGLayoutOpportunity opp3 = {start_point2, {LayoutUnit(50), LayoutUnit(400)}};
|
| + EXPECT_EQ(opp3, iterator.Next());
|
| +
|
| + NGLogicalOffset start_point3 = {LayoutUnit(), LayoutUnit(300)};
|
| + // 600x50 at (0,300)
|
| + NGLayoutOpportunity opp4 = {start_point3, {LayoutUnit(600), LayoutUnit(50)}};
|
| + EXPECT_EQ(opp4, iterator.Next());
|
| + // 500x300 at (0,300)
|
| + NGLayoutOpportunity opp5 = {start_point3, {LayoutUnit(500), LayoutUnit(300)}};
|
| + EXPECT_EQ(opp5, iterator.Next());
|
| +
|
| // 4th Start Point
|
| - EXPECT_EQ("0,400 600x200", OpportunityToString(iterator.Next()));
|
| + NGLogicalOffset start_point4 = {LayoutUnit(), LayoutUnit(400)};
|
| + // 600x200 at (0,400)
|
| + NGLayoutOpportunity opp6 = {start_point4, {LayoutUnit(600), LayoutUnit(200)}};
|
| + EXPECT_EQ(opp6, iterator.Next());
|
| +
|
| // TODO(glebl): The opportunity below should not be generated.
|
| - EXPECT_EQ("250,400 350x200", OpportunityToString(iterator.Next()));
|
| - // Iterator is exhausted.
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| + EXPECT_EQ("350x200 at (250,400)", iterator.Next().ToString());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
| +
|
| // Verifies that Layout Opportunity iterator ignores the exclusion that is not
|
| // within constraint space.
|
| //
|
| @@ -215,21 +251,103 @@ TEST(NGConstraintSpaceTest, LayoutOpportunitiesTwoInMiddleWithOriginAndLeader) {
|
| // Layout opportunity iterator generates only one opportunity that equals to
|
| // available constraint space, i.e. 0,0 600x200
|
| TEST(NGConstraintSpaceTest, LayoutOpportunitiesWithOutOfBoundsExclusions) {
|
| - NGLogicalSize size;
|
| - size.inline_size = LayoutUnit(600);
|
| - size.block_size = LayoutUnit(100);
|
| + NGLogicalSize size = {LayoutUnit(600), LayoutUnit(100)};
|
| RefPtr<NGConstraintSpace> space =
|
| ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
|
| NGExclusion exclusion;
|
| - exclusion.rect.size = {/* inline_size */ LayoutUnit(100),
|
| - /* block_size */ LayoutUnit(100)};
|
| - exclusion.rect.offset = {/* inline_offset */ LayoutUnit(0),
|
| - /* block_offset */ LayoutUnit(150)};
|
| + exclusion.rect.size = {LayoutUnit(100), LayoutUnit(100)};
|
| + exclusion.rect.offset = {LayoutUnit(), LayoutUnit(150)};
|
| space->AddExclusion(exclusion);
|
|
|
| NGLayoutOpportunityIterator iterator(space.get());
|
| - EXPECT_EQ("0,0 600x100", OpportunityToString(iterator.Next()));
|
| - EXPECT_EQ("(empty)", OpportunityToString(iterator.Next()));
|
| + // 600x100 at (0,0)
|
| + NGLayoutOpportunity opp = {{}, size};
|
| + EXPECT_EQ(opp, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| +}
|
| +
|
| +// Verifies that we combine 2 adjoining left exclusions into one left exclusion.
|
| +TEST(NGConstraintSpaceTest, TwoLeftExclusionsShadowEachOther) {
|
| + NGLogicalOffset bfc_offset = {LayoutUnit(8), LayoutUnit(8)};
|
| + RefPtr<NGConstraintSpace> space =
|
| + ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr,
|
| + {LayoutUnit(200), LayoutUnit(200)}, bfc_offset);
|
| +
|
| + NGExclusion small_left;
|
| + small_left.rect.size = {LayoutUnit(10), LayoutUnit(10)};
|
| + small_left.rect.offset = bfc_offset;
|
| + small_left.type = NGExclusion::kFloatLeft;
|
| + space->AddExclusion(small_left);
|
| +
|
| + NGExclusion big_left;
|
| + big_left.rect.size = {LayoutUnit(20), LayoutUnit(20)};
|
| + big_left.rect.offset = bfc_offset;
|
| + big_left.rect.offset.inline_offset += small_left.rect.InlineSize();
|
| + big_left.type = NGExclusion::kFloatLeft;
|
| + space->AddExclusion(big_left);
|
| +
|
| + NGLayoutOpportunityIterator iterator(space.get(), bfc_offset);
|
| +
|
| + NGLogicalOffset start_point1 = bfc_offset;
|
| + start_point1.inline_offset +=
|
| + small_left.rect.InlineSize() + big_left.rect.InlineSize();
|
| + // 170x200 at (38, 8)
|
| + NGLayoutOpportunity opportunity1 = {start_point1,
|
| + {LayoutUnit(170), LayoutUnit(200)}};
|
| + EXPECT_EQ(opportunity1, iterator.Next());
|
| +
|
| + NGLogicalOffset start_point2 = bfc_offset;
|
| + start_point2.block_offset += big_left.rect.BlockSize();
|
| + // 200x180 at (8, 28)
|
| + NGLayoutOpportunity opportunity2 = {start_point2,
|
| + {LayoutUnit(200), LayoutUnit(180)}};
|
| + EXPECT_EQ(opportunity2, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| +}
|
| +
|
| +// Verifies that we combine 2 adjoining right exclusions into one right
|
| +// exclusion.
|
| +TEST(NGConstraintSpaceTest, TwoRightExclusionsShadowEachOther) {
|
| + NGLogicalOffset bfc_offset = {LayoutUnit(8), LayoutUnit(8)};
|
| + RefPtr<NGConstraintSpace> space =
|
| + ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr,
|
| + {LayoutUnit(200), LayoutUnit(200)}, bfc_offset);
|
| +
|
| + NGExclusion small_right;
|
| + small_right.rect.size = {LayoutUnit(10), LayoutUnit(10)};
|
| + small_right.rect.offset = bfc_offset;
|
| + small_right.rect.offset.inline_offset +=
|
| + space->AvailableSize().inline_size - small_right.rect.InlineSize();
|
| + small_right.type = NGExclusion::kFloatRight;
|
| + space->AddExclusion(small_right);
|
| +
|
| + NGExclusion big_right;
|
| + big_right.rect.size = {LayoutUnit(20), LayoutUnit(20)};
|
| + big_right.rect.offset = bfc_offset;
|
| + big_right.rect.offset.inline_offset += space->AvailableSize().inline_size -
|
| + small_right.rect.InlineSize() -
|
| + big_right.rect.InlineSize();
|
| + big_right.type = NGExclusion::kFloatRight;
|
| + space->AddExclusion(big_right);
|
| +
|
| + NGLayoutOpportunityIterator iterator(space.get(), bfc_offset);
|
| +
|
| + NGLogicalOffset start_point1 = bfc_offset;
|
| + // 170x200 at (8, 8)
|
| + NGLayoutOpportunity opportunity1 = {start_point1,
|
| + {LayoutUnit(170), LayoutUnit(200)}};
|
| + EXPECT_EQ(opportunity1, iterator.Next());
|
| +
|
| + NGLogicalOffset start_point2 = bfc_offset;
|
| + start_point2.block_offset += big_right.rect.BlockSize();
|
| + // 200x180 at (8, 28)
|
| + NGLayoutOpportunity opportunity2 = {start_point2,
|
| + {LayoutUnit(200), LayoutUnit(180)}};
|
| + EXPECT_EQ(opportunity2, iterator.Next());
|
| +
|
| + EXPECT_EQ(NGLayoutOpportunity(), iterator.Next());
|
| }
|
|
|
| } // namespace
|
|
|