From 1978578a7260a7c29ac9b55bb6d4bb2d47a5ccf3 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 18 Mar 2025 16:55:00 +0000 Subject: [PATCH] LibWeb: Expose HTMLMeterElement's optimum/suboptimum/etc state No behaviour change, but this will allow us to switch over to pseudo-classes for this state. --- Libraries/LibWeb/HTML/HTMLMeterElement.cpp | 32 +++++++++++++++------- Libraries/LibWeb/HTML/HTMLMeterElement.h | 8 ++++++ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Libraries/LibWeb/HTML/HTMLMeterElement.cpp b/Libraries/LibWeb/HTML/HTMLMeterElement.cpp index e5c1f25dfd2..e901460d240 100644 --- a/Libraries/LibWeb/HTML/HTMLMeterElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLMeterElement.cpp @@ -207,9 +207,6 @@ void HTMLMeterElement::create_shadow_tree_if_needed() void HTMLMeterElement::update_meter_value_element() { - if (!m_meter_value_element) - return; - // UA requirements for regions of the gauge: double value = this->value(); double min = this->min(); @@ -221,25 +218,40 @@ void HTMLMeterElement::update_meter_value_element() // If the optimum point is equal to the low boundary or the high boundary, or anywhere in between them, then the region between the low and high boundaries of the gauge must be treated as the optimum region, and the low and high parts, if any, must be treated as suboptimal. if (optimum >= low && optimum <= high) { if (value >= low && value <= high) - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterOptimumValue); + m_cached_value_state = ValueState::Optimal; else - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterSuboptimumValue); + m_cached_value_state = ValueState::Suboptimal; } // Otherwise, if the optimum point is less than the low boundary, then the region between the minimum value and the low boundary must be treated as the optimum region, the region from the low boundary up to the high boundary must be treated as a suboptimal region, and the remaining region must be treated as an even less good region. else if (optimum < low) { if (value >= low && value <= high) - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterSuboptimumValue); + m_cached_value_state = ValueState::Suboptimal; else - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterEvenLessGoodValue); + m_cached_value_state = ValueState::EvenLessGood; } // Finally, if the optimum point is higher than the high boundary, then the situation is reversed; the region between the high boundary and the maximum value must be treated as the optimum region, the region from the high boundary down to the low boundary must be treated as a suboptimal region, and the remaining region must be treated as an even less good region. else { if (value >= high && value <= max) - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterOptimumValue); + m_cached_value_state = ValueState::Optimal; else if (value >= low && value <= high) - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterSuboptimumValue); + m_cached_value_state = ValueState::Suboptimal; else - m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterEvenLessGoodValue); + m_cached_value_state = ValueState::EvenLessGood; + } + + if (!m_meter_value_element) + return; + + switch (m_cached_value_state) { + case ValueState::Optimal: + m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterOptimumValue); + break; + case ValueState::Suboptimal: + m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterSuboptimumValue); + break; + case ValueState::EvenLessGood: + m_meter_value_element->set_use_pseudo_element(CSS::Selector::PseudoElement::Type::MeterEvenLessGoodValue); + break; } double position = (value - min) / (max - min) * 100; diff --git a/Libraries/LibWeb/HTML/HTMLMeterElement.h b/Libraries/LibWeb/HTML/HTMLMeterElement.h index 0a80948c61b..7dd2f8aaadb 100644 --- a/Libraries/LibWeb/HTML/HTMLMeterElement.h +++ b/Libraries/LibWeb/HTML/HTMLMeterElement.h @@ -45,6 +45,13 @@ public: // https://www.w3.org/TR/html-aria/#el-meter virtual Optional default_role() const override { return ARIA::Role::meter; } + enum class ValueState : u8 { + Optimal, + Suboptimal, + EvenLessGood, + }; + ValueState value_state() const { return m_cached_value_state; } + private: HTMLMeterElement(DOM::Document&, DOM::QualifiedName); @@ -56,6 +63,7 @@ private: void update_meter_value_element(); GC::Ptr m_meter_value_element; + ValueState m_cached_value_state { ValueState::Optimal }; }; }