From 12716dccf013eed56767bccc0c672906ba3537e8 Mon Sep 17 00:00:00 2001 From: Callum Law Date: Fri, 24 Oct 2025 14:27:15 +1300 Subject: [PATCH] LibWeb: Avoid including ComputedProperties.h in Element.h This reduces the size of the recompile when ComputedProperties.h is modified from ~1200 to ~70 --- Libraries/LibWeb/CSS/ComputedValues.h | 2 - Libraries/LibWeb/CSS/Length.cpp | 1 + .../LibWeb/CSS/StylePropertyMapReadOnly.cpp | 1 + .../LibWeb/CSS/StyleValues/StyleValue.cpp | 1 + Libraries/LibWeb/DOM/Element.cpp | 29 ++++++++++++ Libraries/LibWeb/DOM/Element.h | 45 ++++--------------- Libraries/LibWeb/Forward.h | 3 ++ .../HTML/Canvas/CanvasTextDrawingStyles.cpp | 1 + Libraries/LibWeb/HTML/Navigable.cpp | 1 + .../LibWeb/Layout/BlockFormattingContext.cpp | 1 + Libraries/LibWeb/SVG/SVGGradientElement.cpp | 1 + 11 files changed, 48 insertions(+), 38 deletions(-) diff --git a/Libraries/LibWeb/CSS/ComputedValues.h b/Libraries/LibWeb/CSS/ComputedValues.h index add212c6fdd..948aa39e8e8 100644 --- a/Libraries/LibWeb/CSS/ComputedValues.h +++ b/Libraries/LibWeb/CSS/ComputedValues.h @@ -130,8 +130,6 @@ using CursorData = Variant, CursorPredefin using ListStyleType = Variant; -using PaintOrderList = Array; - class InitialValues { public: static AspectRatio aspect_ratio() { return AspectRatio { true, {} }; } diff --git a/Libraries/LibWeb/CSS/Length.cpp b/Libraries/LibWeb/CSS/Length.cpp index 11d97db9ed2..5f11b3306bf 100644 --- a/Libraries/LibWeb/CSS/Length.cpp +++ b/Libraries/LibWeb/CSS/Length.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/Libraries/LibWeb/CSS/StylePropertyMapReadOnly.cpp b/Libraries/LibWeb/CSS/StylePropertyMapReadOnly.cpp index cb0b8006c23..67487943f2b 100644 --- a/Libraries/LibWeb/CSS/StylePropertyMapReadOnly.cpp +++ b/Libraries/LibWeb/CSS/StylePropertyMapReadOnly.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp index fdf72848bd9..e2c0a7535c3 100644 --- a/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index ca4eaf8eff5..e1acb7f5db8 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -4002,6 +4002,35 @@ Optional Element::lang() const return maybe_lang.release_value(); } +template +void Element::for_each_numbered_item_owned_by_list_owner(Callback callback) +{ + for (auto* node = this->first_child(); node != nullptr; node = node->next_in_pre_order(this)) { + auto* element = as_if(node); + if (!element) + continue; + + element->m_is_contained_in_list_subtree = true; + + if (node->is_html_ol_ul_menu_element()) { + // Skip list nodes and their descendents. They have their own, unrelated ordinals. + while (node->last_child() != nullptr) // Find the last node (preorder) in the subtree headed by node. O(1). + node = node->last_child(); + + continue; + } + + if (!node->layout_node()) + continue; // Skip nodes that do not participate in the layout. + + if (!element->computed_properties()->display().is_list_item()) + continue; // Skip nodes that are not list items. + + if (callback(element) == IterationDecision::Break) + return; + } +} + // https://drafts.csswg.org/css-images-4/#element-not-rendered bool Element::not_rendered() const { diff --git a/Libraries/LibWeb/DOM/Element.h b/Libraries/LibWeb/DOM/Element.h index f2755e87409..470b89be05a 100644 --- a/Libraries/LibWeb/DOM/Element.h +++ b/Libraries/LibWeb/DOM/Element.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -495,41 +494,6 @@ public: void maybe_invalidate_ordinals_for_list_owner(Optional skip_node = {}); i32 ordinal_value(); - template - void for_each_numbered_item_owned_by_list_owner(Callback callback) const - { - const_cast(this)->for_each_numbered_item_owned_by_list_owner(move(callback)); - } - - template - void for_each_numbered_item_owned_by_list_owner(Callback callback) - { - for (auto* node = this->first_child(); node != nullptr; node = node->next_in_pre_order(this)) { - auto* element = as_if(node); - if (!element) - continue; - - element->m_is_contained_in_list_subtree = true; - - if (node->is_html_ol_ul_menu_element()) { - // Skip list nodes and their descendents. They have their own, unrelated ordinals. - while (node->last_child() != nullptr) // Find the last node (preorder) in the subtree headed by node. O(1). - node = node->last_child(); - - continue; - } - - if (!node->layout_node()) - continue; // Skip nodes that do not participate in the layout. - - if (!element->computed_properties()->display().is_list_item()) - continue; // Skip nodes that are not list items. - - if (callback(element) == IterationDecision::Break) - return; - } - } - bool captured_in_a_view_transition() const { return m_captured_in_a_view_transition; } void set_captured_in_a_view_transition(bool value) { m_captured_in_a_view_transition = value; } @@ -590,6 +554,15 @@ private: Optional contained_text_auto_directionality(bool can_exclude_root) const; Directionality parent_directionality() const; + template + void for_each_numbered_item_owned_by_list_owner(Callback callback) const + { + const_cast(this)->for_each_numbered_item_owned_by_list_owner(move(callback)); + } + + template + void for_each_numbered_item_owned_by_list_owner(Callback callback); + QualifiedName m_qualified_name; mutable Optional m_html_uppercased_qualified_name; diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index eafc4b99551..2e34df39b1c 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -394,6 +394,7 @@ class VisualViewport; enum class Keyword : u16; enum class MediaFeatureID : u8; enum class PropertyID : u16; +enum class PaintOrder : u8; struct BackgroundLayerData; struct CalculationContext; @@ -402,6 +403,8 @@ struct CSSStyleSheetInit; struct GridRepeatParams; struct StyleSheetIdentifier; +using PaintOrderList = Array; + } namespace Web::CSS::Parser { diff --git a/Libraries/LibWeb/HTML/Canvas/CanvasTextDrawingStyles.cpp b/Libraries/LibWeb/HTML/Canvas/CanvasTextDrawingStyles.cpp index da9e874280e..7bbe32fa7e4 100644 --- a/Libraries/LibWeb/HTML/Canvas/CanvasTextDrawingStyles.cpp +++ b/Libraries/LibWeb/HTML/Canvas/CanvasTextDrawingStyles.cpp @@ -6,6 +6,7 @@ */ #include "CanvasTextDrawingStyles.h" +#include #include #include #include diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index 42ed6c2ea8e..128d0c21f10 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -6,6 +6,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include diff --git a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 7c4041fb3dc..24de463dbd7 100644 --- a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include #include diff --git a/Libraries/LibWeb/SVG/SVGGradientElement.cpp b/Libraries/LibWeb/SVG/SVGGradientElement.cpp index a9007d3af94..dc1ba778146 100644 --- a/Libraries/LibWeb/SVG/SVGGradientElement.cpp +++ b/Libraries/LibWeb/SVG/SVGGradientElement.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include