Block: return margin-collapsing outputs from vertical axis ComputeSize calls (#976)

* Block: return margin-collapsing outputs from ComputeSize calls

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix clippy lint

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>
This commit is contained in:
Nico Burns
2026-07-15 22:40:13 +01:00
committed by GitHub
parent c4c7d09fe4
commit b9067e7431
3 changed files with 41 additions and 34 deletions
+2 -2
View File
@@ -68,7 +68,7 @@ async fn main() {
let test_descs: Vec<_> = test_descs
.iter()
.flat_map(|(name, fixture_path, description)| {
debug!("generating test contents for {}", &name);
debug!("generating test contents for {}", name);
let border_box_ltr_test =
generate_test(format!("{name}__border_box_ltr"), &description["borderBoxLtrData"]);
@@ -136,7 +136,7 @@ async fn main() {
let mut test_filename = test_path.join(&name);
test_filename.set_extension("xml");
debug!("writing {} to disk...", &name);
debug!("writing {} to disk...", name);
fs::write(test_filename, test_body).unwrap();
}
+1 -1
View File
@@ -72,7 +72,7 @@ fn main() {
new_fixture_path.set_extension("html");
let new_fixture_content = fixture_template.replace("__HTML_GOES_HERE__", &fixture.content);
println!("Writing new fixture {}", &fixture.name);
println!("Writing new fixture {}", fixture.name);
fs::write(new_fixture_path, new_fixture_content).unwrap();
}
}
+38 -31
View File
@@ -534,9 +534,39 @@ fn compute_inner(
}
}
// Short-circuit if computing size
// Determine whether this node can be collapsed through
let all_in_flow_children_can_be_collapsed_through =
items.iter().all(|item| item.position == Position::Absolute || item.can_be_collapsed_through);
let can_be_collapsed_through =
!has_styles_preventing_being_collapsed_through && all_in_flow_children_can_be_collapsed_through;
let mut output = LayoutOutput {
size: final_outer_size,
#[cfg(feature = "content_size")]
content_size: Size::ZERO,
first_baselines: Point::NONE,
top_margin: if own_margins_collapse_with_children.start {
first_child_top_margin_set
} else {
let margin_top = raw_margin.top.resolve_or_zero(parent_size.width, |val, basis| tree.calc(val, basis));
CollapsibleMarginSet::from_margin(margin_top)
},
bottom_margin: if own_margins_collapse_with_children.end {
last_child_bottom_margin_set
} else {
let margin_bottom =
raw_margin.bottom.resolve_or_zero(parent_size.width, |val, basis| tree.calc(val, basis));
CollapsibleMarginSet::from_margin(margin_bottom)
},
margins_can_collapse_through: can_be_collapsed_through,
};
// Short-circuit if computing size.
//
// Note: it is important that we return the margin-collapsing related outputs here as Parent block containers
// rely on the `top_margin`/`bottom_margin` of their children to compute their own intrinsic height.
if run_mode == RunMode::ComputeSize {
return LayoutOutput::from_outer_size(final_outer_size);
return output;
}
// Commit deferred in-flow layouts to the tree. Floated items already wrote their own layouts.
@@ -558,6 +588,11 @@ fn compute_inner(
direction,
);
#[cfg(feature = "content_size")]
{
output.content_size = inflow_content_size.f32_max(absolute_content_size);
}
// 5. Perform hidden layout on hidden children
let len = tree.child_count(node_id);
for order in 0..len {
@@ -577,35 +612,7 @@ fn compute_inner(
}
}
// 7. Determine whether this node can be collapsed through
let all_in_flow_children_can_be_collapsed_through =
items.iter().all(|item| item.position == Position::Absolute || item.can_be_collapsed_through);
let can_be_collapsed_through =
!has_styles_preventing_being_collapsed_through && all_in_flow_children_can_be_collapsed_through;
#[cfg_attr(not(feature = "content_size"), allow(unused_variables))]
let content_size = inflow_content_size.f32_max(absolute_content_size);
LayoutOutput {
size: final_outer_size,
#[cfg(feature = "content_size")]
content_size,
first_baselines: Point::NONE,
top_margin: if own_margins_collapse_with_children.start {
first_child_top_margin_set
} else {
let margin_top = raw_margin.top.resolve_or_zero(parent_size.width, |val, basis| tree.calc(val, basis));
CollapsibleMarginSet::from_margin(margin_top)
},
bottom_margin: if own_margins_collapse_with_children.end {
last_child_bottom_margin_set
} else {
let margin_bottom =
raw_margin.bottom.resolve_or_zero(parent_size.width, |val, basis| tree.calc(val, basis));
CollapsibleMarginSet::from_margin(margin_bottom)
},
margins_can_collapse_through: can_be_collapsed_through,
}
output
}
/// Create a `Vec` of `BlockItem` structs where each item in the `Vec` represents a child of the current node