From cd4ea67706ea5cec24affea90eafed43c4013c1e Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 19 Jun 2025 15:03:50 +0100 Subject: [PATCH] LibWeb/DOM: Add custom-property helpers to AbstractElement --- Libraries/LibWeb/DOM/AbstractElement.cpp | 29 ++++++++++++++++++++++++ Libraries/LibWeb/DOM/AbstractElement.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/Libraries/LibWeb/DOM/AbstractElement.cpp b/Libraries/LibWeb/DOM/AbstractElement.cpp index ad5143ddc17..54b5139d4eb 100644 --- a/Libraries/LibWeb/DOM/AbstractElement.cpp +++ b/Libraries/LibWeb/DOM/AbstractElement.cpp @@ -75,6 +75,35 @@ GC::Ptr AbstractElement::computed_properties() co return m_element->computed_properties(); } +HashMap const& AbstractElement::custom_properties() const +{ + return m_element->custom_properties(m_pseudo_element); +} + +void AbstractElement::set_custom_properties(HashMap&& custom_properties) +{ + m_element->set_custom_properties(m_pseudo_element, move(custom_properties)); +} + +RefPtr AbstractElement::get_custom_property(FlyString const& name) const +{ + // FIXME: We should be producing computed values for custom properties, just like regular properties. + if (m_pseudo_element.has_value()) { + auto const& custom_properties = m_element->custom_properties(*m_pseudo_element); + if (auto it = custom_properties.find(name); it != custom_properties.end()) { + return it->value.value; + } + } + + for (auto const* current_element = m_element.ptr(); current_element; current_element = current_element->parent_or_shadow_host_element()) { + auto const& custom_properties = current_element->custom_properties({}); + if (auto it = custom_properties.find(name); it != custom_properties.end()) { + return it->value.value; + } + } + return nullptr; +} + bool AbstractElement::has_non_empty_counters_set() const { if (m_pseudo_element.has_value()) diff --git a/Libraries/LibWeb/DOM/AbstractElement.h b/Libraries/LibWeb/DOM/AbstractElement.h index b8b1e1bfa7c..f5076ece11f 100644 --- a/Libraries/LibWeb/DOM/AbstractElement.h +++ b/Libraries/LibWeb/DOM/AbstractElement.h @@ -31,6 +31,10 @@ public: GC::Ptr computed_properties() const; + void set_custom_properties(HashMap&& custom_properties); + [[nodiscard]] HashMap const& custom_properties() const; + RefPtr get_custom_property(FlyString const& name) const; + bool has_non_empty_counters_set() const; Optional counters_set() const; CSS::CountersSet& ensure_counters_set();