瀏覽代碼

LibWeb: Set up both containing block sizes before intrinsic sizing

When calculating e.g the min-content height of some box, we would only
set its containing block's height to 0 in the temporary formatting
state. The containing block width was not touched at all.

This patch aims to do a bit better by resolving indefinite containing
block sizes to INFINITY before performing intrinsic sizing. We should
probably also find a way to resolve definite containing block sizes,
but I'll leave that for our future selves.
Andreas Kling 3 年之前
父節點
當前提交
31fc1990fa
共有 1 個文件被更改,包括 20 次插入0 次删除
  1. 20 0
      Userland/Libraries/LibWeb/Layout/FormattingContext.cpp

+ 20 - 0
Userland/Libraries/LibWeb/Layout/FormattingContext.cpp

@@ -30,6 +30,14 @@ FormattingContext::~FormattingContext() = default;
 
 void FormattingContext::run_intrinsic_size_determination(Box const& box)
 {
+    auto& box_state = m_state.get_mutable(box);
+
+    if (box.has_definite_width())
+        box_state.content_width = box.computed_values().width().resolved(box, CSS::Length::make_px(containing_block_width_for(box))).to_px(box);
+
+    if (box.has_definite_height())
+        box_state.content_height = box.computed_values().height().resolved(box, CSS::Length::make_px(containing_block_height_for(box))).to_px(box);
+
     run(box, LayoutMode::IntrinsicSizeDetermination);
 }
 
@@ -862,6 +870,9 @@ float FormattingContext::calculate_min_content_width(Layout::Box const& box) con
     auto& containing_block_state = throwaway_state.get_mutable(containing_block);
     containing_block_state.content_width = 0;
 
+    if (!containing_block.has_definite_height())
+        containing_block_state.content_height = INFINITY;
+
     auto& box_state = throwaway_state.get_mutable(box);
     box_state.width_constraint = SizeConstraint::MinContent;
 
@@ -899,6 +910,9 @@ float FormattingContext::calculate_max_content_width(Layout::Box const& box) con
     auto& containing_block_state = throwaway_state.get_mutable(containing_block);
     containing_block_state.content_width = INFINITY;
 
+    if (!containing_block.has_definite_height())
+        containing_block_state.content_height = INFINITY;
+
     auto& box_state = throwaway_state.get_mutable(box);
     box_state.width_constraint = SizeConstraint::MaxContent;
 
@@ -936,6 +950,9 @@ float FormattingContext::calculate_min_content_height(Layout::Box const& box) co
     auto& containing_block_state = throwaway_state.get_mutable(containing_block);
     containing_block_state.content_height = 0;
 
+    if (!containing_block.has_definite_width())
+        containing_block_state.content_width = INFINITY;
+
     auto& box_state = throwaway_state.get_mutable(box);
     box_state.height_constraint = SizeConstraint::MinContent;
 
@@ -973,6 +990,9 @@ float FormattingContext::calculate_max_content_height(Layout::Box const& box) co
     auto& containing_block_state = throwaway_state.get_mutable(containing_block);
     containing_block_state.content_height = INFINITY;
 
+    if (!containing_block.has_definite_width())
+        containing_block_state.content_width = INFINITY;
+
     auto& box_state = throwaway_state.get_mutable(box);
     box_state.height_constraint = SizeConstraint::MaxContent;