diff options
author | Andreas Kling <kling@serenityos.org> | 2022-07-12 02:17:17 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-07-12 02:46:21 +0200 |
commit | 31fc1990fa69612b16bd3aa59b9fefcd0c058aa9 (patch) | |
tree | 49cba1227ed76700c4a54bddc3889a241a57b939 | |
parent | c81e5c9d8219f0255bffb74c3b185a653628efcb (diff) | |
download | serenity-31fc1990fa69612b16bd3aa59b9fefcd0c058aa9.zip |
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.
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/FormattingContext.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp index 9f1b60dc25..c598fd1ef0 100644 --- a/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp +++ b/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; |