From 50455c2f5e4abcfeff9396cd6c4cfd894a7c4e72 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 17 Mar 2025 12:55:21 +0000 Subject: [PATCH] LibWeb: Stop constructing temporary ElementInlineCSSStyleDeclarations Previously, parse_css_style_attribute() would parse the string, extract the properties, add them to a newly-created ElementInlineCSSStyleDeclarations, and then user code would take the properties back out of it again and throw it away. Instead, just return the list of properties, and the caller can create an EICSD if it needs one. --- Libraries/LibWeb/CSS/CSSStyleDeclaration.cpp | 4 ++-- Libraries/LibWeb/CSS/Parser/Helpers.cpp | 6 +++--- Libraries/LibWeb/CSS/Parser/Parser.cpp | 8 ++++---- Libraries/LibWeb/CSS/Parser/Parser.h | 14 +++++++------- Libraries/LibWeb/DOM/Element.cpp | 9 +++------ 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Libraries/LibWeb/CSS/CSSStyleDeclaration.cpp b/Libraries/LibWeb/CSS/CSSStyleDeclaration.cpp index 0f97ffa29f5..4cd7de609cb 100644 --- a/Libraries/LibWeb/CSS/CSSStyleDeclaration.cpp +++ b/Libraries/LibWeb/CSS/CSSStyleDeclaration.cpp @@ -668,8 +668,8 @@ void ElementInlineCSSStyleDeclaration::set_declarations_from_text(StringView css } empty_the_declarations(); - auto style = parse_css_style_attribute(CSS::Parser::ParsingParams(element->element().document()), css_text, element->element()); - set_the_declarations(style->properties(), style->custom_properties()); + auto style = parse_css_style_attribute(Parser::ParsingParams(element->element().document()), css_text); + set_the_declarations(style.properties, style.custom_properties); } // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext diff --git a/Libraries/LibWeb/CSS/Parser/Helpers.cpp b/Libraries/LibWeb/CSS/Parser/Helpers.cpp index c503f65ba7d..8de40db92f0 100644 --- a/Libraries/LibWeb/CSS/Parser/Helpers.cpp +++ b/Libraries/LibWeb/CSS/Parser/Helpers.cpp @@ -30,11 +30,11 @@ CSS::CSSStyleSheet* parse_css_stylesheet(CSS::Parser::ParsingParams const& conte return style_sheet; } -CSS::ElementInlineCSSStyleDeclaration* parse_css_style_attribute(CSS::Parser::ParsingParams const& context, StringView css, DOM::Element& element) +CSS::Parser::Parser::PropertiesAndCustomProperties parse_css_style_attribute(CSS::Parser::ParsingParams const& context, StringView css) { if (css.is_empty()) - return CSS::ElementInlineCSSStyleDeclaration::create(element, {}, {}); - return CSS::Parser::Parser::create(context, css).parse_as_style_attribute(element); + return {}; + return CSS::Parser::Parser::create(context, css).parse_as_style_attribute(); } RefPtr parse_css_value(CSS::Parser::ParsingParams const& context, StringView string, CSS::PropertyID property_id) diff --git a/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Libraries/LibWeb/CSS/Parser/Parser.cpp index 441e1de4924..731fbfcdfd9 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1317,7 +1317,7 @@ Vector> Parser::parse_a_comma_separated_list_of_component return groups; } -ElementInlineCSSStyleDeclaration* Parser::parse_as_style_attribute(DOM::Element& element) +Parser::PropertiesAndCustomProperties Parser::parse_as_style_attribute() { auto expand_shorthands = [&](Vector& properties) -> Vector { Vector expanded_properties; @@ -1341,9 +1341,9 @@ ElementInlineCSSStyleDeclaration* Parser::parse_as_style_attribute(DOM::Element& auto declarations_and_at_rules = parse_a_blocks_contents(m_token_stream); m_rule_context.take_last(); - auto [properties, custom_properties] = extract_properties(declarations_and_at_rules); - auto expanded_properties = expand_shorthands(properties); - return ElementInlineCSSStyleDeclaration::create(element, move(expanded_properties), move(custom_properties)); + auto properties = extract_properties(declarations_and_at_rules); + properties.properties = expand_shorthands(properties.properties); + return properties; } bool Parser::is_valid_in_the_current_context(Declaration const&) const diff --git a/Libraries/LibWeb/CSS/Parser/Parser.h b/Libraries/LibWeb/CSS/Parser/Parser.h index 99cfa4c59ef..50391d0343f 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Libraries/LibWeb/CSS/Parser/Parser.h @@ -88,7 +88,12 @@ public: static Parser create(ParsingParams const&, StringView input, StringView encoding = "utf-8"sv); CSSStyleSheet* parse_as_css_stylesheet(Optional location); - ElementInlineCSSStyleDeclaration* parse_as_style_attribute(DOM::Element&); + + struct PropertiesAndCustomProperties { + Vector properties; + HashMap custom_properties; + }; + PropertiesAndCustomProperties parse_as_style_attribute(); CSSRule* parse_as_css_rule(); Optional parse_as_supports_condition(); @@ -452,11 +457,6 @@ private: static bool has_ignored_vendor_prefix(StringView); - struct PropertiesAndCustomProperties { - Vector properties; - HashMap custom_properties; - }; - PropertiesAndCustomProperties extract_properties(Vector const&); void extract_property(Declaration const&, Parser::PropertiesAndCustomProperties&); @@ -510,7 +510,7 @@ private: namespace Web { CSS::CSSStyleSheet* parse_css_stylesheet(CSS::Parser::ParsingParams const&, StringView, Optional location = {}); -CSS::ElementInlineCSSStyleDeclaration* parse_css_style_attribute(CSS::Parser::ParsingParams const&, StringView, DOM::Element&); +CSS::Parser::Parser::PropertiesAndCustomProperties parse_css_style_attribute(CSS::Parser::ParsingParams const&, StringView); RefPtr parse_css_value(CSS::Parser::ParsingParams const&, StringView, CSS::PropertyID property_id = CSS::PropertyID::Invalid); Optional parse_selector(CSS::Parser::ParsingParams const&, StringView); Optional parse_selector_for_nested_style_rule(CSS::Parser::ParsingParams const&, StringView); diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 36e8224ed22..3479b2a0733 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -3523,12 +3523,9 @@ void Element::attribute_changed(FlyString const& local_name, Optional co // https://drafts.csswg.org/cssom/#ref-for-cssstyledeclaration-updating-flag if (m_inline_style && m_inline_style->is_updating()) return; - if (!m_inline_style) { - m_inline_style = parse_css_style_attribute(CSS::Parser::ParsingParams(document()), *value, *this); - } else { - // NOTE: ElementInlineCSSStyleDeclaration::set_css_text should never throw an exception. - m_inline_style->set_declarations_from_text(*value); - } + if (!m_inline_style) + m_inline_style = CSS::ElementInlineCSSStyleDeclaration::create(*this, {}, {}); + m_inline_style->set_declarations_from_text(*value); set_needs_style_update(true); } } else if (local_name == HTML::AttributeNames::dir) {