LibWeb: Move containment checks to Layout::Node
Some checks are pending
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (push) Waiting to run
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, true, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (arm64, macos-15, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (x86_64, ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run

It fits better there and avoids having to reach into the Element
all the time.
This commit is contained in:
Psychpsyo 2025-05-09 21:34:47 +02:00 committed by Alexander Kalenik
commit a0be82b2cb
Notes: github-actions[bot] 2025-05-13 12:32:25 +00:00
10 changed files with 145 additions and 169 deletions

View file

@ -1333,9 +1333,6 @@ void Document::update_layout(UpdateLayoutReason reason)
});
m_layout_root->for_each_in_inclusive_subtree_of_type<Layout::Box>([&](auto& child) {
if (auto dom_node = child.dom_node(); dom_node && dom_node->is_element()) {
child.set_has_size_containment(as<Element>(*dom_node).has_size_containment());
}
if (child.needs_layout_update()) {
child.reset_cached_intrinsic_sizes();
}

View file

@ -3188,131 +3188,6 @@ bool Element::skips_its_contents()
return false;
}
// https://drafts.csswg.org/css-contain-2/#containment-size
bool Element::has_size_containment() const
{
// However, giving an element size containment has no effect if any of the following are true:
// - if the element does not generate a principal box (as is the case with 'display: contents' or 'display: none')
if (!layout_node())
return false;
// - if its inner display type is 'table'
if (layout_node()->display().is_table_inside())
return false;
// - if its principal box is an internal table box
if (layout_node()->display().is_internal_table())
return false;
// - if its principal box is an internal ruby box or a non-atomic inline-level box
// FIXME: Implement this.
if (computed_properties()->contain().size_containment)
return true;
return false;
}
// https://drafts.csswg.org/css-contain-2/#containment-inline-size
bool Element::has_inline_size_containment() const
{
// Giving an element inline-size containment has no effect if any of the following are true:
// - if the element does not generate a principal box (as is the case with 'display: contents' or 'display: none')
if (!layout_node())
return false;
// - if its inner display type is 'table'
if (layout_node()->display().is_table_inside())
return false;
// - if its principal box is an internal table box
if (layout_node()->display().is_internal_table())
return false;
// - if its principal box is an internal ruby box or a non-atomic inline-level box
// FIXME: Implement this.
if (computed_properties()->contain().inline_size_containment)
return true;
return false;
}
// https://drafts.csswg.org/css-contain-2/#containment-layout
bool Element::has_layout_containment() const
{
// However, giving an element layout containment has no effect if any of the following are true:
// - if the element does not generate a principal box (as is the case with 'display: contents' or 'display: none')
if (!layout_node())
return false;
// - if its principal box is an internal table box other than 'table-cell'
if (layout_node()->display().is_internal_table() && !layout_node()->display().is_table_cell())
return false;
// - if its principal box is an internal ruby box or a non-atomic inline-level box
// FIXME: Implement this.
if (computed_properties()->contain().layout_containment)
return true;
// https://drafts.csswg.org/css-contain-2/#valdef-content-visibility-auto
// Changes the used value of the 'contain' property so as to turn on layout containment, style containment, and
// paint containment for the element.
if (computed_properties()->content_visibility() == CSS::ContentVisibility::Auto)
return true;
return false;
}
// https://drafts.csswg.org/css-contain-2/#containment-style
bool Element::has_style_containment() const
{
// However, giving an element style containment has no effect if any of the following are true:
// - if the element does not generate a principal box (as is the case with 'display: contents' or 'display: none')
if (!layout_node())
return false;
if (computed_properties()->contain().style_containment)
return true;
// https://drafts.csswg.org/css-contain-2/#valdef-content-visibility-auto
// Changes the used value of the 'contain' property so as to turn on layout containment, style containment, and
// paint containment for the element.
if (computed_properties()->content_visibility() == CSS::ContentVisibility::Auto)
return true;
return false;
}
// https://drafts.csswg.org/css-contain-2/#containment-paint
bool Element::has_paint_containment() const
{
// However, giving an element paint containment has no effect if any of the following are true:
// - if the element does not generate a principal box (as is the case with 'display: contents' or 'display: none')
if (!layout_node())
return false;
// - if its principal box is an internal table box other than 'table-cell'
if (layout_node()->display().is_internal_table() && !layout_node()->display().is_table_cell())
return false;
// - if its principal box is an internal ruby box or a non-atomic inline-level box
// FIXME: Implement this
if (computed_properties()->contain().paint_containment)
return true;
// https://drafts.csswg.org/css-contain-2/#valdef-content-visibility-auto
// Changes the used value of the 'contain' property so as to turn on layout containment, style containment, and
// paint containment for the element.
if (computed_properties()->content_visibility() == CSS::ContentVisibility::Auto)
return true;
return false;
}
size_t Element::number_of_owned_list_items() const
{
auto number_of_owned_li_elements = 0;

View file

@ -422,13 +422,6 @@ public:
// https://drafts.csswg.org/css-contain-2/#skips-its-contents
bool skips_its_contents();
// https://drafts.csswg.org/css-contain-2/#containment-types
bool has_size_containment() const;
bool has_inline_size_containment() const;
bool has_layout_containment() const;
bool has_style_containment() const;
bool has_paint_containment() const;
bool matches_enabled_pseudo_class() const;
bool matches_disabled_pseudo_class() const;
bool matches_checked_pseudo_class() const;