From b21efa45e6c0ef2d7b6d85b25e9b4262f8167b18 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Mon, 17 Oct 2016 04:07:54 -0700 Subject: [PATCH] Fix justify content + min dimension usage in root Summary: Min dimension was not respected when calculating justify content. This diff ensures that the min dimension is taken into account when at most measure spec is used. Reviewed By: gkassabli, lucasr Differential Revision: D4021443 fbshipit-source-id: 00f58c6078ac3076221e1148aacc34712786deb5 --- CSSLayout/CSSLayout.c | 10 ++- tests/CSSLayoutMinMaxDimensionTest.cpp | 84 ++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index e44429b7..c50095bf 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -1514,10 +1514,14 @@ static void layoutNodeImpl(const CSSNodeRef node, // that are aligned "stretch". We need to compute these stretch values and // set the final positions. - // If we are using "at most" rules in the main axis, we won't distribute - // any remaining space at this point. + // If we are using "at most" rules in the main axis. Calculate the remaining space when + // constraint by the min size defined for the main axis. if (measureModeMainDim == CSSMeasureModeAtMost) { - remainingFreeSpace = 0; + if (!CSSValueIsUndefined(node->style.minDimensions[dim[mainAxis]]) && node->style.minDimensions[dim[mainAxis]] >= 0) { + remainingFreeSpace = fmaxf(0, node->style.minDimensions[dim[mainAxis]] - (availableInnerMainDim - remainingFreeSpace)); + } else { + remainingFreeSpace = 0; + } } switch (justifyContent) { diff --git a/tests/CSSLayoutMinMaxDimensionTest.cpp b/tests/CSSLayoutMinMaxDimensionTest.cpp index 4bcb4911..72501e43 100644 --- a/tests/CSSLayoutMinMaxDimensionTest.cpp +++ b/tests/CSSLayoutMinMaxDimensionTest.cpp @@ -27,6 +27,14 @@
+ +
+
+
+ +
+
+
* */ @@ -206,3 +214,79 @@ TEST(CSSLayoutTest, min_width) { CSSNodeFreeRecursive(root); } + +TEST(CSSLayoutTest, justify_content_min_max) { + const CSSNodeRef root = CSSNodeNew(); + CSSNodeStyleSetJustifyContent(root, CSSJustifyCenter); + CSSNodeStyleSetWidth(root, 100); + CSSNodeStyleSetMinHeight(root, 100); + CSSNodeStyleSetMaxHeight(root, 200); + + const CSSNodeRef root_child0 = CSSNodeNew(); + CSSNodeStyleSetWidth(root_child0, 60); + CSSNodeStyleSetHeight(root_child0, 60); + CSSNodeInsertChild(root, root_child0, 0); + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(100, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(20, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionRTL); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(100, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(40, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(20, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + CSSNodeFreeRecursive(root); +} + +TEST(CSSLayoutTest, align_items_min_max) { + const CSSNodeRef root = CSSNodeNew(); + CSSNodeStyleSetAlignItems(root, CSSAlignCenter); + CSSNodeStyleSetMinWidth(root, 100); + CSSNodeStyleSetMaxWidth(root, 200); + CSSNodeStyleSetHeight(root, 100); + + const CSSNodeRef root_child0 = CSSNodeNew(); + CSSNodeStyleSetWidth(root_child0, 60); + CSSNodeStyleSetHeight(root_child0, 60); + CSSNodeInsertChild(root, root_child0, 0); + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(100, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(20, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionRTL); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(100, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(20, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + CSSNodeFreeRecursive(root); +}