From 07d8ddb5fa55155e30079c5344cdbca1ccdca187 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 11 Nov 2024 15:12:09 +0100 Subject: [PATCH] LibWeb: Reduce usage of Node::containing_block() in BFC Explicitly pass containing block width in resolve_vertical_box_model_metrics() instead of doing containing block box lookup. This is a part of refactoring towards removing containing_block() usage that will allow us introduce partial layout. --- Libraries/LibWeb/Layout/BlockFormattingContext.cpp | 9 ++++----- Libraries/LibWeb/Layout/BlockFormattingContext.h | 2 +- Libraries/LibWeb/Layout/TableFormattingContext.cpp | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 37632dea116..513d0ef2216 100644 --- a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -651,7 +651,7 @@ void BlockFormattingContext::layout_block_level_box(Box const& box, BlockContain if (is(box)) return; - resolve_vertical_box_model_metrics(box); + resolve_vertical_box_model_metrics(box, m_state.get(block_container).content_width()); if (box.is_floating()) { auto const y = m_y_offset_of_current_block_container.value(); @@ -848,11 +848,10 @@ void BlockFormattingContext::layout_block_level_children(BlockContainer const& b } } -void BlockFormattingContext::resolve_vertical_box_model_metrics(Box const& box) +void BlockFormattingContext::resolve_vertical_box_model_metrics(Box const& box, CSSPixels width_of_containing_block) { auto& box_state = m_state.get_mutable(box); auto const& computed_values = box.computed_values(); - auto width_of_containing_block = containing_block_width_for(box); box_state.margin_top = computed_values.margin().top().to_px(box, width_of_containing_block); box_state.margin_bottom = computed_values.margin().bottom().to_px(box, width_of_containing_block); @@ -1006,14 +1005,14 @@ void BlockFormattingContext::layout_viewport(AvailableSpace const& available_spa } } -void BlockFormattingContext::layout_floating_box(Box const& box, BlockContainer const&, AvailableSpace const& available_space, CSSPixels y, LineBuilder* line_builder) +void BlockFormattingContext::layout_floating_box(Box const& box, BlockContainer const& block_container, AvailableSpace const& available_space, CSSPixels y, LineBuilder* line_builder) { VERIFY(box.is_floating()); auto& box_state = m_state.get_mutable(box); auto const& computed_values = box.computed_values(); - resolve_vertical_box_model_metrics(box); + resolve_vertical_box_model_metrics(box, m_state.get(block_container).content_width()); compute_width(box, available_space); diff --git a/Libraries/LibWeb/Layout/BlockFormattingContext.h b/Libraries/LibWeb/Layout/BlockFormattingContext.h index 6d7301d003f..14b7c4e0885 100644 --- a/Libraries/LibWeb/Layout/BlockFormattingContext.h +++ b/Libraries/LibWeb/Layout/BlockFormattingContext.h @@ -50,7 +50,7 @@ public: void layout_block_level_box(Box const&, BlockContainer const&, CSSPixels& bottom_of_lowest_margin_box, AvailableSpace const&); - void resolve_vertical_box_model_metrics(Box const&); + void resolve_vertical_box_model_metrics(Box const&, CSSPixels width_of_containing_block); enum class DidIntroduceClearance { Yes, diff --git a/Libraries/LibWeb/Layout/TableFormattingContext.cpp b/Libraries/LibWeb/Layout/TableFormattingContext.cpp index 69420a0d78c..4b46679b56a 100644 --- a/Libraries/LibWeb/Layout/TableFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/TableFormattingContext.cpp @@ -46,7 +46,7 @@ CSSPixels TableFormattingContext::run_caption_layout(CSS::CaptionSide phase) auto const& child_box = static_cast(*child); // FIXME: Since caption only has inline children, BlockFormattingContext doesn't resolve the vertical metrics. // We need to do it manually here. - caption_context->resolve_vertical_box_model_metrics(child_box); + caption_context->resolve_vertical_box_model_metrics(child_box, m_available_space->width.to_px_or_zero()); auto const& caption_state = m_state.get(child_box); if (phase == CSS::CaptionSide::Top) { m_state.get_mutable(table_box()).set_content_y(caption_state.content_height() + caption_state.margin_box_bottom());