diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c
index 2e2b9960..d9d7d65b 100644
--- a/CSSLayout/CSSLayout.c
+++ b/CSSLayout/CSSLayout.c
@@ -964,6 +964,16 @@ static void computeChildFlexBasis(const CSSNodeRef node,
childHeightMeasureMode = CSSMeasureModeExactly;
}
+ if (!CSSValueIsUndefined(child->style.maxDimensions[CSSDimensionWidth])) {
+ childWidth = child->style.maxDimensions[CSSDimensionWidth];
+ childWidthMeasureMode = CSSMeasureModeAtMost;
+ }
+
+ if (!CSSValueIsUndefined(child->style.maxDimensions[CSSDimensionHeight])) {
+ childHeight = child->style.maxDimensions[CSSDimensionHeight];
+ childHeightMeasureMode = CSSMeasureModeAtMost;
+ }
+
// Measure the child
layoutNodeInternal(child,
childWidth,
@@ -1670,6 +1680,16 @@ static void layoutNodeImpl(const CSSNodeRef node,
}
}
+ if (!CSSValueIsUndefined(currentRelativeChild->style.maxDimensions[CSSDimensionWidth])) {
+ childWidth = currentRelativeChild->style.maxDimensions[CSSDimensionWidth];
+ childWidthMeasureMode = CSSMeasureModeAtMost;
+ }
+
+ if (!CSSValueIsUndefined(currentRelativeChild->style.maxDimensions[CSSDimensionHeight])) {
+ childHeight = currentRelativeChild->style.maxDimensions[CSSDimensionHeight];
+ childHeightMeasureMode = CSSMeasureModeAtMost;
+ }
+
const bool requiresStretchLayout =
!isStyleDimDefined(currentRelativeChild, crossAxis) &&
getAlignItem(node, currentRelativeChild) == CSSAlignStretch;
@@ -1859,6 +1879,16 @@ static void layoutNodeImpl(const CSSNodeRef node,
getMarginAxis(child, CSSFlexDirectionColumn);
}
+ if (!CSSValueIsUndefined(child->style.maxDimensions[CSSDimensionWidth])) {
+ childWidth = child->style.maxDimensions[CSSDimensionWidth];
+ childWidthMeasureMode = CSSMeasureModeAtMost;
+ }
+
+ if (!CSSValueIsUndefined(child->style.maxDimensions[CSSDimensionHeight])) {
+ childHeight = child->style.maxDimensions[CSSDimensionHeight];
+ childHeightMeasureMode = CSSMeasureModeAtMost;
+ }
+
// If the child defines a definite size for its cross axis, there's
// no need to stretch.
if (!isCrossSizeDefinite) {
diff --git a/csharp/tests/Facebook.CSSLayout/CSSLayoutMinMaxDimensionTest.cs b/csharp/tests/Facebook.CSSLayout/CSSLayoutMinMaxDimensionTest.cs
index 73a2a84f..f09deb1f 100644
--- a/csharp/tests/Facebook.CSSLayout/CSSLayoutMinMaxDimensionTest.cs
+++ b/csharp/tests/Facebook.CSSLayout/CSSLayoutMinMaxDimensionTest.cs
@@ -41,6 +41,12 @@
+
+
*
*/
@@ -383,5 +389,58 @@ namespace Facebook.CSSLayout
Assert.AreEqual(50, root_child2.LayoutHeight);
}
+ [Test]
+ public void Test_flex_grow_within_max_width()
+ {
+ CSSNode root = new CSSNode();
+ root.StyleWidth = 200;
+ root.StyleHeight = 100;
+
+ CSSNode root_child0 = new CSSNode();
+ root_child0.FlexDirection = CSSFlexDirection.Row;
+ root_child0.StyleMaxWidth = 100;
+ root.Insert(0, root_child0);
+
+ CSSNode root_child0_child0 = new CSSNode();
+ root_child0_child0.FlexGrow = 1;
+ root_child0_child0.StyleHeight = 20;
+ root_child0.Insert(0, root_child0_child0);
+ root.StyleDirection = CSSDirection.LeftToRight;
+ root.CalculateLayout();
+
+ Assert.AreEqual(0, root.LayoutX);
+ Assert.AreEqual(0, root.LayoutY);
+ Assert.AreEqual(200, root.LayoutWidth);
+ Assert.AreEqual(100, root.LayoutHeight);
+
+ Assert.AreEqual(0, root_child0.LayoutX);
+ Assert.AreEqual(0, root_child0.LayoutY);
+ Assert.AreEqual(100, root_child0.LayoutWidth);
+ Assert.AreEqual(20, root_child0.LayoutHeight);
+
+ Assert.AreEqual(0, root_child0_child0.LayoutX);
+ Assert.AreEqual(0, root_child0_child0.LayoutY);
+ Assert.AreEqual(100, root_child0_child0.LayoutWidth);
+ Assert.AreEqual(20, root_child0_child0.LayoutHeight);
+
+ root.StyleDirection = CSSDirection.RightToLeft;
+ root.CalculateLayout();
+
+ Assert.AreEqual(0, root.LayoutX);
+ Assert.AreEqual(0, root.LayoutY);
+ Assert.AreEqual(200, root.LayoutWidth);
+ Assert.AreEqual(100, root.LayoutHeight);
+
+ Assert.AreEqual(100, root_child0.LayoutX);
+ Assert.AreEqual(0, root_child0.LayoutY);
+ Assert.AreEqual(100, root_child0.LayoutWidth);
+ Assert.AreEqual(20, root_child0.LayoutHeight);
+
+ Assert.AreEqual(0, root_child0_child0.LayoutX);
+ Assert.AreEqual(0, root_child0_child0.LayoutY);
+ Assert.AreEqual(100, root_child0_child0.LayoutWidth);
+ Assert.AreEqual(20, root_child0_child0.LayoutHeight);
+ }
+
}
}
diff --git a/gentest/fixtures/CSSLayoutMinMaxDimensionTest.html b/gentest/fixtures/CSSLayoutMinMaxDimensionTest.html
index d2925c04..599f3fe6 100644
--- a/gentest/fixtures/CSSLayoutMinMaxDimensionTest.html
+++ b/gentest/fixtures/CSSLayoutMinMaxDimensionTest.html
@@ -29,3 +29,9 @@
+
+
diff --git a/java/tests/com/facebook/csslayout/CSSLayoutMinMaxDimensionTest.java b/java/tests/com/facebook/csslayout/CSSLayoutMinMaxDimensionTest.java
index 2607d23e..271f3a9f 100644
--- a/java/tests/com/facebook/csslayout/CSSLayoutMinMaxDimensionTest.java
+++ b/java/tests/com/facebook/csslayout/CSSLayoutMinMaxDimensionTest.java
@@ -41,6 +41,12 @@
+
+
*
*/
@@ -375,4 +381,56 @@ public class CSSLayoutMinMaxDimensionTest {
assertEquals(50, root_child2.getLayoutHeight(), 0.0f);
}
+ @Test
+ public void test_flex_grow_within_max_width() {
+ final CSSNode root = new CSSNode();
+ root.setStyleWidth(200);
+ root.setStyleHeight(100);
+
+ final CSSNode root_child0 = new CSSNode();
+ root_child0.setFlexDirection(CSSFlexDirection.ROW);
+ root_child0.setStyleMaxWidth(100);
+ root.addChildAt(root_child0, 0);
+
+ final CSSNode root_child0_child0 = new CSSNode();
+ root_child0_child0.setFlexGrow(1);
+ root_child0_child0.setStyleHeight(20);
+ root_child0.addChildAt(root_child0_child0, 0);
+ root.setDirection(CSSDirection.LTR);
+ root.calculateLayout(null);
+
+ assertEquals(0, root.getLayoutX(), 0.0f);
+ assertEquals(0, root.getLayoutY(), 0.0f);
+ assertEquals(200, root.getLayoutWidth(), 0.0f);
+ assertEquals(100, root.getLayoutHeight(), 0.0f);
+
+ assertEquals(0, root_child0.getLayoutX(), 0.0f);
+ assertEquals(0, root_child0.getLayoutY(), 0.0f);
+ assertEquals(100, root_child0.getLayoutWidth(), 0.0f);
+ assertEquals(20, root_child0.getLayoutHeight(), 0.0f);
+
+ assertEquals(0, root_child0_child0.getLayoutX(), 0.0f);
+ assertEquals(0, root_child0_child0.getLayoutY(), 0.0f);
+ assertEquals(100, root_child0_child0.getLayoutWidth(), 0.0f);
+ assertEquals(20, root_child0_child0.getLayoutHeight(), 0.0f);
+
+ root.setDirection(CSSDirection.RTL);
+ root.calculateLayout(null);
+
+ assertEquals(0, root.getLayoutX(), 0.0f);
+ assertEquals(0, root.getLayoutY(), 0.0f);
+ assertEquals(200, root.getLayoutWidth(), 0.0f);
+ assertEquals(100, root.getLayoutHeight(), 0.0f);
+
+ assertEquals(100, root_child0.getLayoutX(), 0.0f);
+ assertEquals(0, root_child0.getLayoutY(), 0.0f);
+ assertEquals(100, root_child0.getLayoutWidth(), 0.0f);
+ assertEquals(20, root_child0.getLayoutHeight(), 0.0f);
+
+ assertEquals(0, root_child0_child0.getLayoutX(), 0.0f);
+ assertEquals(0, root_child0_child0.getLayoutY(), 0.0f);
+ assertEquals(100, root_child0_child0.getLayoutWidth(), 0.0f);
+ assertEquals(20, root_child0_child0.getLayoutHeight(), 0.0f);
+ }
+
}
diff --git a/tests/CSSLayoutMinMaxDimensionTest.cpp b/tests/CSSLayoutMinMaxDimensionTest.cpp
index b58f22db..38358a36 100644
--- a/tests/CSSLayoutMinMaxDimensionTest.cpp
+++ b/tests/CSSLayoutMinMaxDimensionTest.cpp
@@ -41,6 +41,12 @@
+
+
*
*/
@@ -363,3 +369,54 @@ TEST(CSSLayoutTest, justify_content_overflow_min_max) {
CSSNodeFreeRecursive(root);
}
+
+TEST(CSSLayoutTest, flex_grow_within_max_width) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetWidth(root, 200);
+ CSSNodeStyleSetHeight(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexDirection(root_child0, CSSFlexDirectionRow);
+ CSSNodeStyleSetMaxWidth(root_child0, 100);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child0_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child0_child0, 1);
+ CSSNodeStyleSetHeight(root_child0_child0, 20);
+ CSSNodeInsertChild(root_child0, root_child0_child0, 0);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(200, 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(20, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0_child0));
+ ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child0_child0));
+
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionRTL);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(200, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(100, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0_child0));
+ ASSERT_EQ(20, CSSNodeLayoutGetHeight(root_child0_child0));
+
+ CSSNodeFreeRecursive(root);
+}