瀏覽代碼

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.
Aliaksandr Kalenik 8 月之前
父節點
當前提交
07d8ddb5fa

+ 4 - 5
Libraries/LibWeb/Layout/BlockFormattingContext.cpp

@@ -651,7 +651,7 @@ void BlockFormattingContext::layout_block_level_box(Box const& box, BlockContain
     if (is<ListItemMarkerBox>(box))
     if (is<ListItemMarkerBox>(box))
         return;
         return;
 
 
-    resolve_vertical_box_model_metrics(box);
+    resolve_vertical_box_model_metrics(box, m_state.get(block_container).content_width());
 
 
     if (box.is_floating()) {
     if (box.is_floating()) {
         auto const y = m_y_offset_of_current_block_container.value();
         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& box_state = m_state.get_mutable(box);
     auto const& computed_values = box.computed_values();
     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_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);
     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());
     VERIFY(box.is_floating());
 
 
     auto& box_state = m_state.get_mutable(box);
     auto& box_state = m_state.get_mutable(box);
     auto const& computed_values = box.computed_values();
     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);
     compute_width(box, available_space);
 
 

+ 1 - 1
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 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 {
     enum class DidIntroduceClearance {
         Yes,
         Yes,

+ 1 - 1
Libraries/LibWeb/Layout/TableFormattingContext.cpp

@@ -46,7 +46,7 @@ CSSPixels TableFormattingContext::run_caption_layout(CSS::CaptionSide phase)
         auto const& child_box = static_cast<Box const&>(*child);
         auto const& child_box = static_cast<Box const&>(*child);
         // FIXME: Since caption only has inline children, BlockFormattingContext doesn't resolve the vertical metrics.
         // FIXME: Since caption only has inline children, BlockFormattingContext doesn't resolve the vertical metrics.
         //        We need to do it manually here.
         //        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);
         auto const& caption_state = m_state.get(child_box);
         if (phase == CSS::CaptionSide::Top) {
         if (phase == CSS::CaptionSide::Top) {
             m_state.get_mutable(table_box()).set_content_y(caption_state.content_height() + caption_state.margin_box_bottom());
             m_state.get_mutable(table_box()).set_content_y(caption_state.content_height() + caption_state.margin_box_bottom());