LibWeb: Remove box argument from FormattingContext::run()

Root formatting context box is passed into constructor and saved in FC,
so it's possible to access it from there instead of passing the same
box into run().
This commit is contained in:
Aliaksandr Kalenik 2024-09-11 00:28:22 +02:00 committed by Andreas Kling
commit 623e358d7a
Notes: github-actions[bot] 2024-09-11 07:31:05 +00:00
15 changed files with 37 additions and 41 deletions

View file

@ -1147,7 +1147,6 @@ void Document::update_layout()
}
root_formatting_context.run(
*m_layout_root,
Layout::LayoutMode::Normal,
Layout::AvailableSpace(
Layout::AvailableSize::make_definite(viewport_rect.width()),

View file

@ -66,7 +66,7 @@ static bool margins_collapse_through(Box const& box, LayoutState& state)
return state.get(box).border_box_height() == 0;
}
void BlockFormattingContext::run(Box const&, LayoutMode layout_mode, AvailableSpace const& available_space)
void BlockFormattingContext::run(LayoutMode layout_mode, AvailableSpace const& available_space)
{
if (is<Viewport>(root())) {
layout_viewport(layout_mode, available_space);
@ -474,7 +474,6 @@ void BlockFormattingContext::layout_inline_children(BlockContainer const& block_
InlineFormattingContext context(m_state, block_container, block_container_state, *this);
context.run(
block_container,
layout_mode,
available_space);
@ -678,7 +677,7 @@ void BlockFormattingContext::layout_block_level_box(Box const& box, BlockContain
if (independent_formatting_context) {
// This box establishes a new formatting context. Pass control to it.
independent_formatting_context->run(box, layout_mode, box_state.available_inner_space_or_constraints_from(available_space));
independent_formatting_context->run(layout_mode, box_state.available_inner_space_or_constraints_from(available_space));
} else {
// This box participates in the current block container's flow.
if (box.children_are_inline()) {
@ -921,7 +920,7 @@ void BlockFormattingContext::layout_viewport(LayoutMode layout_mode, AvailableSp
auto content_height = m_state.get(*svg_root.containing_block()).content_height();
m_state.get_mutable(svg_root).set_content_height(content_height);
auto svg_formatting_context = create_independent_formatting_context_if_needed(m_state, svg_root);
svg_formatting_context->run(svg_root, layout_mode, available_space);
svg_formatting_context->run(layout_mode, available_space);
} else {
if (root().children_are_inline())
layout_inline_children(root(), layout_mode, available_space);

View file

@ -22,7 +22,7 @@ public:
explicit BlockFormattingContext(LayoutState&, BlockContainer const&, FormattingContext* parent);
~BlockFormattingContext();
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
virtual void run(LayoutMode, AvailableSpace const&) override;
virtual CSSPixels automatic_content_width() const override;
virtual CSSPixels automatic_content_height() const override;

View file

@ -47,10 +47,8 @@ CSSPixels FlexFormattingContext::automatic_content_height() const
return m_flex_container_state.content_height();
}
void FlexFormattingContext::run(Box const& run_box, LayoutMode, AvailableSpace const& available_space)
void FlexFormattingContext::run(LayoutMode, AvailableSpace const& available_space)
{
VERIFY(&run_box == &flex_container());
// This implements https://www.w3.org/TR/css-flexbox-1/#layout-algorithm
// 1. Generate anonymous flex items
@ -1135,7 +1133,7 @@ void FlexFormattingContext::determine_hypothetical_cross_size_of_item(FlexItem&
auto available_width = is_row_layout() ? AvailableSize::make_definite(item.main_size.value()) : AvailableSize::make_indefinite();
auto available_height = is_row_layout() ? AvailableSize::make_indefinite() : AvailableSize::make_definite(item.main_size.value());
independent_formatting_context->run(item.box, LayoutMode::Normal, AvailableSpace(available_width, available_height));
independent_formatting_context->run(LayoutMode::Normal, AvailableSpace(available_width, available_height));
auto automatic_cross_size = is_row_layout() ? independent_formatting_context->automatic_content_height()
: independent_formatting_context->automatic_content_width();

View file

@ -18,7 +18,7 @@ public:
virtual bool inhibits_floating() const override { return true; }
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
virtual void run(LayoutMode, AvailableSpace const&) override;
virtual CSSPixels automatic_content_width() const override;
virtual CSSPixels automatic_content_height() const override;

View file

@ -160,7 +160,7 @@ struct ReplacedFormattingContext : public FormattingContext {
}
virtual CSSPixels automatic_content_width() const override { return 0; }
virtual CSSPixels automatic_content_height() const override { return 0; }
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override { }
virtual void run(LayoutMode, AvailableSpace const&) override { }
};
// FIXME: This is a hack. Get rid of it.
@ -171,7 +171,7 @@ struct DummyFormattingContext : public FormattingContext {
}
virtual CSSPixels automatic_content_width() const override { return 0; }
virtual CSSPixels automatic_content_height() const override { return 0; }
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override { }
virtual void run(LayoutMode, AvailableSpace const&) override { }
};
OwnPtr<FormattingContext> FormattingContext::create_independent_formatting_context_if_needed(LayoutState& state, Box const& child_box)
@ -225,9 +225,9 @@ OwnPtr<FormattingContext> FormattingContext::layout_inside(Box const& child_box,
auto independent_formatting_context = create_independent_formatting_context_if_needed(m_state, child_box);
if (independent_formatting_context)
independent_formatting_context->run(child_box, layout_mode, available_space);
independent_formatting_context->run(layout_mode, available_space);
else
run(child_box, layout_mode, available_space);
run(layout_mode, available_space);
return independent_formatting_context;
}
@ -424,7 +424,7 @@ CSSPixels FormattingContext::compute_table_box_width_inside_table_wrapper(Box co
table_box_state.border_right = table_box_computed_values.border_right().width;
auto context = make<TableFormattingContext>(throwaway_state, *table_box, this);
context->run_until_width_calculation(*table_box, m_state.get(*table_box).available_inner_space_or_constraints_from(available_space));
context->run_until_width_calculation(m_state.get(*table_box).available_inner_space_or_constraints_from(available_space));
auto table_used_width = throwaway_state.get(*table_box).border_box_width();
return available_space.width.is_definite() ? min(table_used_width, available_width) : table_used_width;
@ -458,7 +458,7 @@ CSSPixels FormattingContext::compute_table_box_height_inside_table_wrapper(Box c
LayoutState throwaway_state(&m_state);
auto context = create_independent_formatting_context_if_needed(throwaway_state, box);
VERIFY(context);
context->run(box, LayoutMode::IntrinsicSizing, m_state.get(box).available_inner_space_or_constraints_from(available_space));
context->run(LayoutMode::IntrinsicSizing, m_state.get(box).available_inner_space_or_constraints_from(available_space));
Optional<Box const&> table_box;
box.for_each_in_subtree_of_type<Box>([&](Box const& child_box) {
@ -1460,7 +1460,7 @@ CSSPixels FormattingContext::calculate_min_content_width(Layout::Box const& box)
auto available_width = AvailableSize::make_min_content();
auto available_height = AvailableSize::make_indefinite();
context->run(box, LayoutMode::IntrinsicSizing, AvailableSpace(available_width, available_height));
context->run(LayoutMode::IntrinsicSizing, AvailableSpace(available_width, available_height));
cache.min_content_width = context->automatic_content_width();
@ -1498,7 +1498,7 @@ CSSPixels FormattingContext::calculate_max_content_width(Layout::Box const& box)
auto available_width = AvailableSize::make_max_content();
auto available_height = AvailableSize::make_indefinite();
context->run(box, LayoutMode::IntrinsicSizing, AvailableSpace(available_width, available_height));
context->run(LayoutMode::IntrinsicSizing, AvailableSpace(available_width, available_height));
cache.max_content_width = context->automatic_content_width();
@ -1542,7 +1542,7 @@ CSSPixels FormattingContext::calculate_min_content_height(Layout::Box const& box
context = make<BlockFormattingContext>(throwaway_state, verify_cast<BlockContainer>(box), nullptr);
}
context->run(box, LayoutMode::IntrinsicSizing, AvailableSpace(AvailableSize::make_definite(width), AvailableSize::make_min_content()));
context->run(LayoutMode::IntrinsicSizing, AvailableSpace(AvailableSize::make_definite(width), AvailableSize::make_min_content()));
auto min_content_height = context->automatic_content_height();
if (min_content_height.might_be_saturated()) {
@ -1586,7 +1586,7 @@ CSSPixels FormattingContext::calculate_max_content_height(Layout::Box const& box
context = make<BlockFormattingContext>(throwaway_state, verify_cast<BlockContainer>(box), nullptr);
}
context->run(box, LayoutMode::IntrinsicSizing, AvailableSpace(AvailableSize::make_definite(width), AvailableSize::make_max_content()));
context->run(LayoutMode::IntrinsicSizing, AvailableSpace(AvailableSize::make_definite(width), AvailableSize::make_max_content()));
auto max_content_height = context->automatic_content_height();

View file

@ -36,7 +36,7 @@ public:
InternalDummy, // Internal hack formatting context for unimplemented things. FIXME: Get rid of this.
};
virtual void run(Box const&, LayoutMode, AvailableSpace const&) = 0;
virtual void run(LayoutMode, AvailableSpace const&) = 0;
// This function returns the automatic content height of the context's root box.
virtual CSSPixels automatic_content_width() const = 0;

View file

@ -1771,7 +1771,7 @@ CSSPixelRect GridFormattingContext::get_grid_area_rect(GridItem const& grid_item
return { x_start, y_start, x_end - x_start, y_end - y_start };
}
void GridFormattingContext::run(Box const&, LayoutMode, AvailableSpace const& available_space)
void GridFormattingContext::run(LayoutMode, AvailableSpace const& available_space)
{
m_available_space = available_space;

View file

@ -106,7 +106,7 @@ public:
virtual bool inhibits_floating() const override { return true; }
virtual void run(Box const&, LayoutMode, AvailableSpace const& available_space) override;
virtual void run(LayoutMode, AvailableSpace const& available_space) override;
virtual CSSPixels automatic_content_width() const override;
virtual CSSPixels automatic_content_height() const override;

View file

@ -77,7 +77,7 @@ CSSPixels InlineFormattingContext::automatic_content_height() const
return m_automatic_content_height;
}
void InlineFormattingContext::run(Box const&, LayoutMode layout_mode, AvailableSpace const& available_space)
void InlineFormattingContext::run(LayoutMode layout_mode, AvailableSpace const& available_space)
{
VERIFY(containing_block().children_are_inline());
m_available_space = available_space;

View file

@ -23,7 +23,7 @@ public:
BlockContainer const& containing_block() const { return static_cast<BlockContainer const&>(context_box()); }
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
virtual void run(LayoutMode, AvailableSpace const&) override;
virtual CSSPixels automatic_content_height() const override;
virtual CSSPixels automatic_content_width() const override;

View file

@ -171,13 +171,13 @@ static bool is_container_element(Node const& node)
return false;
}
void SVGFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const& available_space)
void SVGFormattingContext::run(LayoutMode, AvailableSpace const& available_space)
{
// NOTE: SVG doesn't have a "formatting context" in the spec, but this is the most
// obvious way to drive SVG layout in our engine at the moment.
auto& svg_viewport = dynamic_cast<SVG::SVGViewport const&>(*box.dom_node());
auto& svg_box_state = m_state.get_mutable(box);
auto& svg_viewport = dynamic_cast<SVG::SVGViewport const&>(*context_box().dom_node());
auto& svg_box_state = m_state.get_mutable(context_box());
// NOTE: We consider all SVG root elements to have definite size in both axes.
// I'm not sure if this is good or bad, but our viewport transform logic depends on it.
@ -254,7 +254,7 @@ void SVGFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const&
m_svg_offset = svg_box_state.offset;
m_viewport_size = { viewport_width, viewport_height };
box.for_each_child_of_type<Box>([&](Box const& child) {
context_box().for_each_child_of_type<Box>([&](Box const& child) {
layout_svg_element(child);
return IterationDecision::Continue;
});
@ -266,7 +266,7 @@ void SVGFormattingContext::layout_svg_element(Box const& child)
layout_nested_viewport(child);
} else if (is<SVG::SVGForeignObjectElement>(child.dom_node()) && is<BlockContainer>(child)) {
Layout::BlockFormattingContext bfc(m_state, static_cast<BlockContainer const&>(child), this);
bfc.run(child, LayoutMode::Normal, *m_available_space);
bfc.run(LayoutMode::Normal, *m_available_space);
auto& child_state = m_state.get_mutable(child);
child_state.set_content_offset(child_state.offset.translated(m_svg_offset));
child.for_each_child_of_type<SVGMaskBox>([&](SVGMaskBox const& child) {
@ -301,7 +301,7 @@ void SVGFormattingContext::layout_nested_viewport(Box const& viewport)
nested_viewport_state.set_content_height(nested_viewport_height);
nested_viewport_state.set_has_definite_width(true);
nested_viewport_state.set_has_definite_height(true);
nested_context.run(static_cast<Box const&>(viewport), LayoutMode::Normal, *m_available_space);
nested_context.run(LayoutMode::Normal, *m_available_space);
}
Gfx::Path SVGFormattingContext::compute_path_for_text(SVGTextBox const& text_box)
@ -459,7 +459,7 @@ void SVGFormattingContext::layout_mask_or_clip(SVGBox const& mask_or_clip)
SVGFormattingContext nested_context(m_state, mask_or_clip, this, parent_viewbox_transform);
layout_state.set_has_definite_width(true);
layout_state.set_has_definite_height(true);
nested_context.run(static_cast<Box const&>(mask_or_clip), LayoutMode::Normal, *m_available_space);
nested_context.run(LayoutMode::Normal, *m_available_space);
}
void SVGFormattingContext::layout_container_element(SVGBox const& container)

View file

@ -21,7 +21,7 @@ public:
explicit SVGFormattingContext(LayoutState&, Box const&, FormattingContext* parent, Gfx::AffineTransform parent_viewbox_transform = {});
~SVGFormattingContext();
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
virtual void run(LayoutMode, AvailableSpace const&) override;
virtual CSSPixels automatic_content_width() const override;
virtual CSSPixels automatic_content_height() const override;

View file

@ -41,7 +41,7 @@ CSSPixels TableFormattingContext::run_caption_layout(LayoutMode layout_mode, CSS
// The caption boxes are principal block-level boxes that retain their own content, padding, margin, and border areas,
// and are rendered as normal block boxes inside the table wrapper box, as described in https://www.w3.org/TR/CSS22/tables.html#model
auto caption_context = make<BlockFormattingContext>(m_state, *verify_cast<BlockContainer>(child), this);
caption_context->run(table_box(), layout_mode, *m_available_space);
caption_context->run(layout_mode, *m_available_space);
VERIFY(child->is_box());
auto const& child_box = static_cast<Box const&>(*child);
// FIXME: Since caption only has inline children, BlockFormattingContext doesn't resolve the vertical metrics.
@ -1581,12 +1581,12 @@ void TableFormattingContext::finish_grid_initialization(TableGrid const& table_g
}
}
void TableFormattingContext::run_until_width_calculation(Box const& box, AvailableSpace const& available_space)
void TableFormattingContext::run_until_width_calculation(AvailableSpace const& available_space)
{
m_available_space = available_space;
// Determine the number of rows/columns the table requires.
finish_grid_initialization(TableGrid::calculate_row_column_grid(box, m_cells, m_rows));
finish_grid_initialization(TableGrid::calculate_row_column_grid(context_box(), m_cells, m_rows));
border_conflict_resolution();
@ -1607,13 +1607,13 @@ void TableFormattingContext::run_until_width_calculation(Box const& box, Availab
compute_table_width();
}
void TableFormattingContext::run(Box const& box, LayoutMode layout_mode, AvailableSpace const& available_space)
void TableFormattingContext::run(LayoutMode layout_mode, AvailableSpace const& available_space)
{
m_available_space = available_space;
auto total_captions_height = run_caption_layout(layout_mode, CSS::CaptionSide::Top);
run_until_width_calculation(box, available_space);
run_until_width_calculation(available_space);
if (available_space.width.is_intrinsic_sizing_constraint() && !available_space.height.is_intrinsic_sizing_constraint()) {
return;

View file

@ -23,9 +23,9 @@ public:
explicit TableFormattingContext(LayoutState&, Box const&, FormattingContext* parent);
~TableFormattingContext();
void run_until_width_calculation(Box const&, AvailableSpace const& available_space);
void run_until_width_calculation(AvailableSpace const& available_space);
virtual void run(Box const&, LayoutMode, AvailableSpace const&) override;
virtual void run(LayoutMode, AvailableSpace const&) override;
virtual CSSPixels automatic_content_width() const override;
virtual CSSPixels automatic_content_height() const override;