diff --git a/src/algo.rs b/src/algo.rs
index ffd03dec9..4a52786dd 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -250,11 +250,27 @@ fn compute_internal(
// is auto and not definite, in this calculation use fit-content as the
// flex item’s cross size. The flex base size is the item’s resulting main size.
+ let width: Number = if !child.size.width.is_defined()
+ && child.node.align_self(node) == style::AlignSelf::Stretch
+ && is_column
+ {
+ available_space.width
+ } else {
+ child.size.width
+ };
+
+ let height: Number =
+ if !child.size.height.is_defined() && child.node.align_self(node) == style::AlignSelf::Stretch && is_row {
+ available_space.height
+ } else {
+ child.size.height
+ };
+
child.flex_basis = compute_internal(
child.node,
Size {
- width: child.size.width.maybe_max(child.min_size.width).maybe_min(child.max_size.width),
- height: child.size.height.maybe_max(child.min_size.height).maybe_min(child.max_size.height),
+ width: width.maybe_max(child.min_size.width).maybe_min(child.max_size.width),
+ height: height.maybe_max(child.min_size.height).maybe_min(child.max_size.height),
},
available_space,
percent_calc_base_child,
diff --git a/tests/measure.rs b/tests/measure.rs
index b9bb9738d..c2c39d88c 100644
--- a/tests/measure.rs
+++ b/tests/measure.rs
@@ -224,6 +224,31 @@ mod measure {
assert_eq!(layout.children[1].size.height, 100.0);
}
+ #[test]
+ fn remeasure_child_after_stretching() {
+ let layout = stretch::compute(
+ &stretch::style::Node {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(100.0),
+ height: stretch::style::Dimension::Points(100.0),
+ },
+ children: vec![stretch::style::Node {
+ measure: Some(Box::new(|constraint| {
+ let height = constraint.height.or_else(50.0);
+ let width = constraint.width.or_else(height);
+ stretch::geometry::Size { width, height }
+ })),
+ ..Default::default()
+ }],
+ ..Default::default()
+ },
+ stretch::geometry::Size::undefined(),
+ );
+
+ assert_eq!(layout.children[0].size.width, 100.0);
+ assert_eq!(layout.children[0].size.height, 100.0);
+ }
+
#[test]
fn width_overrides_measure() {
let layout = stretch::compute(
@@ -355,4 +380,26 @@ mod measure {
assert_eq!(layout.children[0].size.width, 50.0);
assert_eq!(layout.children[0].size.height, 50.0);
}
+
+ #[test]
+ fn ignore_invalid_measure() {
+ let layout = stretch::compute(
+ &stretch::style::Node {
+ size: stretch::geometry::Size {
+ width: stretch::style::Dimension::Points(100.0),
+ height: stretch::style::Dimension::Points(100.0),
+ },
+ children: vec![stretch::style::Node {
+ flex_grow: 1.0,
+ measure: Some(Box::new(|_| stretch::geometry::Size { width: 200.0, height: 200.0 })),
+ ..Default::default()
+ }],
+ ..Default::default()
+ },
+ stretch::geometry::Size::undefined(),
+ );
+
+ assert_eq!(layout.children[0].size.width, 100.0);
+ assert_eq!(layout.children[0].size.height, 100.0);
+ }
}