mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 19:17:44 +00:00
LibWeb: Get reference height from closest non-anonymous ancestor
Ignore anonymous block boxes when resolving percentage weights that would refer to them, per the CSS 2 visual formatting model specification. This fixes the case when we create an anonymous block between an image which uses a percentage height relative to a parent which specifies a definite height. Fixes #19052.
This commit is contained in:
parent
706a20c4d4
commit
5cec517153
5 changed files with 79 additions and 3 deletions
|
@ -262,7 +262,7 @@ static CSSPixelSize solve_replaced_size_constraint(LayoutState const& state, CSS
|
|||
{
|
||||
// 10.4 Minimum and maximum widths: 'min-width' and 'max-width'
|
||||
|
||||
auto const& containing_block = *box.containing_block();
|
||||
auto const& containing_block = *box.non_anyonymous_containing_block();
|
||||
auto const& containing_block_state = state.get(containing_block);
|
||||
auto width_of_containing_block = containing_block_state.content_width();
|
||||
auto height_of_containing_block = containing_block_state.content_height();
|
||||
|
@ -509,7 +509,7 @@ CSSPixels FormattingContext::compute_height_for_replaced_element(LayoutState con
|
|||
// 10.6.6 Floating replaced elements
|
||||
// 10.6.10 'inline-block' replaced elements in normal flow
|
||||
|
||||
auto height_of_containing_block = state.get(*box.containing_block()).content_height();
|
||||
auto height_of_containing_block = state.get(*box.non_anyonymous_containing_block()).content_height();
|
||||
auto computed_width = should_treat_width_as_auto(box, available_space) ? CSS::Size::make_auto() : box.computed_values().width();
|
||||
auto computed_height = should_treat_height_as_auto(box, available_space) ? CSS::Size::make_auto() : box.computed_values().height();
|
||||
|
||||
|
@ -1358,7 +1358,7 @@ CSS::Length FormattingContext::calculate_inner_width(Layout::Box const& box, Ava
|
|||
|
||||
CSS::Length FormattingContext::calculate_inner_height(Layout::Box const& box, AvailableSize const&, CSS::Size const& height) const
|
||||
{
|
||||
auto height_of_containing_block = m_state.get(*box.containing_block()).content_height();
|
||||
auto height_of_containing_block = m_state.get(*box.non_anyonymous_containing_block()).content_height();
|
||||
auto height_of_containing_block_as_length_for_resolve = CSS::Length::make_px(height_of_containing_block);
|
||||
if (height.is_auto()) {
|
||||
return height.resolved(box, height_of_containing_block_as_length_for_resolve);
|
||||
|
|
|
@ -114,6 +114,17 @@ Box const* Node::containing_block() const
|
|||
return nearest_ancestor_capable_of_forming_a_containing_block(*this);
|
||||
}
|
||||
|
||||
Box const* Node::non_anyonymous_containing_block() const
|
||||
{
|
||||
auto nearest_ancestor_box = containing_block();
|
||||
VERIFY(nearest_ancestor_box);
|
||||
while (nearest_ancestor_box->is_anonymous()) {
|
||||
nearest_ancestor_box = nearest_ancestor_box->containing_block();
|
||||
VERIFY(nearest_ancestor_box);
|
||||
}
|
||||
return nearest_ancestor_box;
|
||||
}
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
|
||||
bool Node::establishes_stacking_context() const
|
||||
{
|
||||
|
|
|
@ -112,6 +112,12 @@ public:
|
|||
Box const* containing_block() const;
|
||||
Box* containing_block() { return const_cast<Box*>(const_cast<Node const*>(this)->containing_block()); }
|
||||
|
||||
// Closest non-anonymous ancestor box, to be used when resolving percentage values.
|
||||
// Anonymous block boxes are ignored when resolving percentage values that would refer to it:
|
||||
// the closest non-anonymous ancestor box is used instead.
|
||||
// https://www.w3.org/TR/CSS22/visuren.html#anonymous-block-level
|
||||
Box const* non_anyonymous_containing_block() const;
|
||||
|
||||
bool establishes_stacking_context() const;
|
||||
|
||||
bool can_contain_boxes_with_position_absolute() const;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue