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) {