diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index 6d6c06d5..0e1d37d6 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -839,7 +839,13 @@ static void computeChildFlexBasis( CSSMeasureMode childWidthMeasureMode; CSSMeasureMode childHeightMeasureMode; - if (isMainAxisRow && isStyleDimDefined(child, CSSFlexDirectionRow)) { + if (!CSSValueIsUndefined(child->style.flexBasis) && + !CSSValueIsUndefined(isMainAxisRow ? width : height)) { + if (CSSValueIsUndefined(child->layout.computedFlexBasis)) { + child->layout.computedFlexBasis = + fmaxf(child->style.flexBasis, getPaddingAndBorderAxis(child, mainAxis)); + } + } else if (isMainAxisRow && isStyleDimDefined(child, CSSFlexDirectionRow)) { // The width is definite, so use that as the flex basis. child->layout.computedFlexBasis = fmaxf(child->style.dimensions[CSSDimensionWidth], @@ -849,12 +855,6 @@ static void computeChildFlexBasis( child->layout.computedFlexBasis = fmaxf(child->style.dimensions[CSSDimensionHeight], getPaddingAndBorderAxis(child, CSSFlexDirectionColumn)); - } else if (!CSSValueIsUndefined(child->style.flexBasis) && - !CSSValueIsUndefined(isMainAxisRow ? width : height)) { - if (CSSValueIsUndefined(child->layout.computedFlexBasis)) { - child->layout.computedFlexBasis = - fmaxf(child->style.flexBasis, getPaddingAndBorderAxis(child, mainAxis)); - } } else { // Compute the flex basis and hypothetical main size (i.e. the clamped // flex basis). diff --git a/tests/CSSLayoutFlexTest.cpp b/tests/CSSLayoutFlexTest.cpp index 5ce2d618..7a5c76e7 100644 --- a/tests/CSSLayoutFlexTest.cpp +++ b/tests/CSSLayoutFlexTest.cpp @@ -35,6 +35,12 @@
+ +
+
+
+
+
* */ @@ -308,3 +314,70 @@ TEST(CSSLayoutTest, flex_shrink_to_zero) { CSSNodeFreeRecursive(root); } + +TEST(CSSLayoutTest, flex_basis_overrides_main_size) { + const CSSNodeRef root = CSSNodeNew(); + CSSNodeStyleSetWidth(root, 100); + CSSNodeStyleSetHeight(root, 100); + + const CSSNodeRef root_child0 = CSSNodeNew(); + CSSNodeStyleSetFlexGrow(root_child0, 1); + CSSNodeStyleSetFlexBasis(root_child0, 50); + CSSNodeStyleSetHeight(root_child0, 20); + CSSNodeInsertChild(root, root_child0, 0); + + const CSSNodeRef root_child1 = CSSNodeNew(); + CSSNodeStyleSetFlexGrow(root_child1, 1); + CSSNodeStyleSetHeight(root_child1, 10); + CSSNodeInsertChild(root, root_child1, 1); + + const CSSNodeRef root_child2 = CSSNodeNew(); + CSSNodeStyleSetFlexGrow(root_child2, 1); + CSSNodeStyleSetHeight(root_child2, 10); + CSSNodeInsertChild(root, root_child2, 2); + 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(0, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1)); + ASSERT_EQ(60, CSSNodeLayoutGetTop(root_child1)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1)); + ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child1)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child2)); + ASSERT_EQ(80, CSSNodeLayoutGetTop(root_child2)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child2)); + ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child2)); + + 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(0, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(60, CSSNodeLayoutGetHeight(root_child0)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1)); + ASSERT_EQ(60, CSSNodeLayoutGetTop(root_child1)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1)); + ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child1)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child2)); + ASSERT_EQ(80, CSSNodeLayoutGetTop(root_child2)); + ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child2)); + ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child2)); + + CSSNodeFreeRecursive(root); +}