Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
292 changes: 102 additions & 190 deletions Libraries/LibWeb/Rust/src/layout/abspos_engine.rs

Large diffs are not rendered by default.

106 changes: 44 additions & 62 deletions Libraries/LibWeb/Rust/src/layout/block_formatting_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,10 +236,6 @@ impl<'pass> BlockFormattingContext<'pass> {
self.state.used_values(&self.callbacks, node)
}

fn used_mut(&self, node: Node) -> &'pass UsedValues {
self.used(node)
}

fn create_used_values(&self, node: Node, constraints: ContainingBlockConstraints) -> &'pass UsedValues {
self.state.create_used_values(&self.callbacks, node, constraints)
}
Expand Down Expand Up @@ -358,7 +354,7 @@ impl<'pass> BlockFormattingContext<'pass> {

fn resolve_vertical_box_model_metrics(&self, node: Node, containing_block_inline_size: CssPixels) {
let style = self.style(node);
let used = self.used_mut(node);
let used = self.used(node);
used.margin_top
.set(style.margin_top().to_px(containing_block_inline_size));
used.margin_bottom
Expand Down Expand Up @@ -448,7 +444,7 @@ impl<'pass> BlockFormattingContext<'pass> {
let content_inline_size =
self.resolve_root_inline_metrics_and_content_size(node, available_space, constraints, float_avoidance_inline_size);
if let Some(content_inline_size) = content_inline_size {
self.used_mut(node).set_content_inline_size(content_inline_size);
self.used(node).set_content_inline_size(content_inline_size);
}
}

Expand Down Expand Up @@ -476,7 +472,7 @@ impl<'pass> BlockFormattingContext<'pass> {
// margins. Replaced sizing consults the box's own used metrics,
// so they are written first.
{
let used = self.used_mut(node);
let used = self.used(node);
used.margin_left.set(style.margin_left().to_px(available_inline_size));
used.margin_right.set(style.margin_right().to_px(available_inline_size));
used.border_left.set(style.border_left_width());
Expand Down Expand Up @@ -507,7 +503,7 @@ impl<'pass> BlockFormattingContext<'pass> {
let border_left_width = style.border_left_width();
let border_right_width = style.border_right_width();
{
let used = self.used_mut(node);
let used = self.used(node);
used.margin_left.set(margin_left);
used.margin_right.set(margin_right);
used.border_left.set(border_left_width);
Expand Down Expand Up @@ -541,6 +537,14 @@ impl<'pass> BlockFormattingContext<'pass> {
}
}

// An auto margin that is not honoured resolves to zero and stops taking part in the remaining steps.
fn zero_out_auto_margin(margin: &mut CssPixels, is_auto: &mut bool) {
if *is_auto {
*margin = CssPixels::default();
*is_auto = false;
}
}

let remaining_inline_size = remaining_available_space.inline_size.to_px_or_zero();
let computed_margin_left = style.margin_left();
let computed_margin_right = style.margin_right();
Expand Down Expand Up @@ -570,14 +574,8 @@ impl<'pass> BlockFormattingContext<'pass> {
// width of the containing block, then any 'auto' values for 'margin-left' or 'margin-right' are, for the
// following rules, treated as zero.
if inline_size.is_some() && total > remaining_inline_size {
if *margin_left_is_auto {
*margin_left = CssPixels::default();
*margin_left_is_auto = false;
}
if *margin_right_is_auto {
*margin_right = CssPixels::default();
*margin_right_is_auto = false;
}
zero_out_auto_margin(margin_left, margin_left_is_auto);
zero_out_auto_margin(margin_right, margin_right_is_auto);
total = border_left_width
+ border_right_width
+ *margin_left
Expand All @@ -593,14 +591,8 @@ impl<'pass> BlockFormattingContext<'pass> {
underflow = CssPixels::default();
}
if inline_size.is_none() {
if *margin_left_is_auto {
*margin_left = CssPixels::default();
*margin_left_is_auto = false;
}
if *margin_right_is_auto {
*margin_right = CssPixels::default();
*margin_right_is_auto = false;
}
zero_out_auto_margin(margin_left, margin_left_is_auto);
zero_out_auto_margin(margin_right, margin_right_is_auto);
if matches!(available_space.inline_size, AvailableSize::Definite(_)) {
inline_size = Some(underflow.max(CssPixels::default()));
} else if available_space.inline_size == AvailableSize::MinContent {
Expand Down Expand Up @@ -700,7 +692,7 @@ impl<'pass> BlockFormattingContext<'pass> {
}

{
let used = self.used_mut(node);
let used = self.used(node);
used.margin_left.set(margin_left);
used.margin_right.set(margin_right);
}
Expand All @@ -723,7 +715,7 @@ impl<'pass> BlockFormattingContext<'pass> {
let padding_left = style.padding_left().to_px(containing_block_inline_size);
let padding_right = style.padding_right().to_px(containing_block_inline_size);
{
let used = self.used_mut(node);
let used = self.used(node);
used.padding_left.set(padding_left);
used.padding_right.set(padding_right);
used.margin_left.set(margin_left);
Expand Down Expand Up @@ -946,39 +938,29 @@ impl<'pass> BlockFormattingContext<'pass> {
available_space.inline_size.to_px_or_zero() - intrusions.left - intrusions.right;
let has_floats_present =
band.left_intrusion > CssPixels::default() || band.right_intrusion > CssPixels::default();
if matches!(
let fits = matches!(
available_space.inline_size,
AvailableSize::MaxContent | AvailableSize::Indefinite
)
|| margin_box_inline_size <= available_inline_size
|| !has_floats_present
) || margin_box_inline_size <= available_inline_size
|| !has_floats_present;
if !fits
&& let Some(next) = self.next_float_band_block_start_after(candidate_block_start)
{
return FloatPlacement {
block_start: candidate_block_start,
offset_from_edge: if side == FloatSide::Left {
intrusions.left + used.margin_left.get() + used.border_box_left(false)
} else {
intrusions.right
+ used.content_inline_size.get()
+ used.margin_right.get()
+ used.border_box_right(false)
},
};
candidate_block_start = next;
continue;
}
let Some(next) = self.next_float_band_block_start_after(candidate_block_start) else {
return FloatPlacement {
block_start: candidate_block_start,
offset_from_edge: if side == FloatSide::Left {
intrusions.left + used.margin_left.get() + used.border_box_left(false)
} else {
intrusions.right
+ used.content_inline_size.get()
+ used.margin_right.get()
+ used.border_box_right(false)
},
};
let offset_from_edge = if side == FloatSide::Left {
intrusions.left + used.margin_left.get() + used.border_box_left(false)
} else {
intrusions.right
+ used.content_inline_size.get()
+ used.margin_right.get()
+ used.border_box_right(false)
};
return FloatPlacement {
block_start: candidate_block_start,
offset_from_edge,
};
candidate_block_start = next;
}
}

Expand Down Expand Up @@ -1430,7 +1412,7 @@ impl<'pass> BlockFormattingContext<'pass> {
let max_content_inline_size = self
.sizing()
.calculate_max_content_inline_size(marker, marker_constraints);
let marker_used = self.used_mut(marker);
let marker_used = self.used(marker);
marker_used.set_content_inline_size(max_content_inline_size);
marker_used.has_definite_inline_size.set(true);
let inner_available_space = crate::layout::AvailableSpace {
Expand Down Expand Up @@ -1692,7 +1674,7 @@ impl<'pass> BlockFormattingContext<'pass> {
if !has_independent_formatting_context
&& let Some(content_inline_size) = probe.content_inline_size
{
self.used_mut(node).set_content_inline_size(content_inline_size);
self.used(node).set_content_inline_size(content_inline_size);
}
let content_inline_size_now = probe
.content_inline_size
Expand Down Expand Up @@ -1902,7 +1884,7 @@ impl<'pass> BlockFormattingContext<'pass> {

if let Some(position) = pending_position {
if let Some(coordinate) = containing_line_box_fragment {
let used = self.used_mut(node);
let used = self.used(node);
used.has_containing_line_box_fragment.set(true);
used.containing_line_box_fragment.set(coordinate);
}
Expand Down Expand Up @@ -2039,7 +2021,7 @@ impl<'pass> BlockFormattingContext<'pass> {
));
}
}
let used = self.used_mut(block_container);
let used = self.used(block_container);
used.set_content_inline_size(inline_size);
used.set_content_block_size(bottom_of_lowest_margin_box);
}
Expand Down Expand Up @@ -2112,7 +2094,7 @@ impl<'pass> BlockFormattingContext<'pass> {
));
}
}
let used = self.used_mut(fieldset);
let used = self.used(fieldset);
used.set_content_inline_size(inline_size);
used.set_content_block_size(bottom_of_lowest_margin_box);
}
Expand Down Expand Up @@ -2308,7 +2290,7 @@ impl<'pass> BlockFormattingContext<'pass> {
input.containing_block_constraints,
input.sizing.float_avoidance_inline_size,
) {
self.used_mut(node).set_content_inline_size(content_inline_size);
self.used(node).set_content_inline_size(content_inline_size);
}
}

Expand Down Expand Up @@ -2375,7 +2357,7 @@ impl<'pass> BlockFormattingContext<'pass> {
if self.facts(node).is_table_wrapper()
&& let Some((automatic_content_inline_size, _)) = run_automatic_sizes
{
self.used_mut(node).set_content_inline_size(automatic_content_inline_size);
self.used(node).set_content_inline_size(automatic_content_inline_size);
}
self.resolve_used_block_size_if_treated_as_auto(
node,
Expand Down Expand Up @@ -2593,7 +2575,7 @@ impl<'pass> BlockFormattingContext<'pass> {
used_inline_size = used_inline_size.max(minimum);
}
}
let used = self.used_mut(block_container);
let used = self.used(block_container);
used.set_content_inline_size(used_inline_size);
used.set_content_block_size(automatic_block_size);
}
Expand Down
Loading
Loading