diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index 2321d4a0580..36539ccded0 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -679,8 +679,8 @@ void StyleComputer::set_property_expanding_shorthands(StyleProperties& style, CS for_each_property_expanding_shorthands(property_id, value, [&](PropertyID shorthand_id, StyleValue const& shorthand_value) { if (shorthand_value.is_revert()) { auto& property_in_previous_cascade_origin = properties_for_revert[to_underlying(shorthand_id)]; - if (property_in_previous_cascade_origin.has_value()) - style.set_property(shorthand_id, property_in_previous_cascade_origin->style, property_in_previous_cascade_origin->declaration, StyleProperties::Inherited::No, important); + if (property_in_previous_cascade_origin.style) + style.set_property(shorthand_id, *property_in_previous_cascade_origin.style, property_in_previous_cascade_origin.declaration, StyleProperties::Inherited::No, important); } else { style.set_property(shorthand_id, shorthand_value, declaration, StyleProperties::Inherited::No, important); } @@ -694,16 +694,16 @@ void StyleComputer::set_all_properties(DOM::Element& element, Optionalimportant = important; + style.m_property_values[to_underlying(property_id)].important = important; continue; } if (value.is_unset()) { if (is_inherited_property(property_id)) - style.m_property_values[to_underlying(property_id)] = { { get_inherit_value(document.realm(), property_id, &element, pseudo_element), nullptr } }; + style.m_property_values[to_underlying(property_id)] = { get_inherit_value(document.realm(), property_id, &element, pseudo_element), nullptr }; else - style.m_property_values[to_underlying(property_id)] = { { property_initial_value(document.realm(), property_id), nullptr } }; - style.m_property_values[to_underlying(property_id)]->important = important; + style.m_property_values[to_underlying(property_id)] = { property_initial_value(document.realm(), property_id), nullptr }; + style.m_property_values[to_underlying(property_id)].important = important; continue; } @@ -713,7 +713,7 @@ void StyleComputer::set_all_properties(DOM::Element& element, Optionalis_unresolved()) set_property_expanding_shorthands(style, property_id, property_value, declaration, properties_for_revert); - style.m_property_values[to_underlying(property_id)]->important = important; + style.m_property_values[to_underlying(property_id)].important = important; set_property_expanding_shorthands(style, property_id, value, declaration, properties_for_revert, important); } @@ -1491,8 +1491,8 @@ void StyleComputer::compute_cascaded_values(StyleProperties& style, DOM::Element for (auto i = to_underlying(CSS::first_property_id); i <= to_underlying(CSS::last_property_id); ++i) { auto property_id = (CSS::PropertyID)i; auto& property = style.m_property_values[i]; - if (property.has_value() && property->style->is_unresolved()) - property->style = Parser::Parser::resolve_unresolved_style_value({}, Parser::ParsingContext { document() }, element, pseudo_element, property_id, property->style->as_unresolved()); + if (property.style && property.style->is_unresolved()) + property.style = Parser::Parser::resolve_unresolved_style_value({}, Parser::ParsingContext { document() }, element, pseudo_element, property_id, property.style->as_unresolved()); } } } @@ -1600,35 +1600,35 @@ void StyleComputer::compute_defaulted_property_value(StyleProperties& style, DOM // FIXME: If we don't know the correct initial value for a property, we fall back to InitialStyleValue. auto& value_slot = style.m_property_values[to_underlying(property_id)]; - if (!value_slot.has_value()) { + if (!value_slot.style) { if (is_inherited_property(property_id)) - style.m_property_values[to_underlying(property_id)] = { { get_inherit_value(document().realm(), property_id, element, pseudo_element), nullptr, StyleProperties::Important::No, StyleProperties::Inherited::Yes } }; + style.m_property_values[to_underlying(property_id)] = { get_inherit_value(document().realm(), property_id, element, pseudo_element), nullptr, StyleProperties::Important::No, StyleProperties::Inherited::Yes }; else - style.m_property_values[to_underlying(property_id)] = { { property_initial_value(document().realm(), property_id), nullptr } }; + style.m_property_values[to_underlying(property_id)] = { property_initial_value(document().realm(), property_id), nullptr }; return; } - if (value_slot->style->is_initial()) { - value_slot->style = property_initial_value(document().realm(), property_id); + if (value_slot.style->is_initial()) { + value_slot.style = property_initial_value(document().realm(), property_id); return; } - if (value_slot->style->is_inherit()) { - value_slot->style = get_inherit_value(document().realm(), property_id, element, pseudo_element); - value_slot->inherited = StyleProperties::Inherited::Yes; + if (value_slot.style->is_inherit()) { + value_slot.style = get_inherit_value(document().realm(), property_id, element, pseudo_element); + value_slot.inherited = StyleProperties::Inherited::Yes; return; } // https://www.w3.org/TR/css-cascade-4/#inherit-initial // If the cascaded value of a property is the unset keyword, - if (value_slot->style->is_unset()) { + if (value_slot.style->is_unset()) { if (is_inherited_property(property_id)) { // then if it is an inherited property, this is treated as inherit, - value_slot->style = get_inherit_value(document().realm(), property_id, element, pseudo_element); - value_slot->inherited = StyleProperties::Inherited::Yes; + value_slot.style = get_inherit_value(document().realm(), property_id, element, pseudo_element); + value_slot.inherited = StyleProperties::Inherited::Yes; } else { // and if it is not, this is treated as initial. - value_slot->style = property_initial_value(document().realm(), property_id); + value_slot.style = property_initial_value(document().realm(), property_id); } } } @@ -2065,24 +2065,24 @@ void StyleComputer::absolutize_values(StyleProperties& style) const // We have to resolve them right away, so that the *computed* line-height is ready for inheritance. // We can't simply absolutize *all* percentage values against the font size, // because most percentages are relative to containing block metrics. - auto line_height_value_slot = style.m_property_values[to_underlying(CSS::PropertyID::LineHeight)].map([](auto& x) -> auto& { return x.style; }); - if (line_height_value_slot.has_value() && (*line_height_value_slot)->is_percentage()) { - *line_height_value_slot = LengthStyleValue::create( - Length::make_px(CSSPixels::nearest_value_for(font_size * static_cast((*line_height_value_slot)->as_percentage().percentage().as_fraction())))); + auto& line_height_value_slot = style.m_property_values[to_underlying(CSS::PropertyID::LineHeight)].style; + if (line_height_value_slot && line_height_value_slot->is_percentage()) { + line_height_value_slot = LengthStyleValue::create( + Length::make_px(CSSPixels::nearest_value_for(font_size * static_cast(line_height_value_slot->as_percentage().percentage().as_fraction())))); } auto line_height = style.compute_line_height(viewport_rect(), font_metrics, m_root_element_font_metrics); font_metrics.line_height = line_height; // NOTE: line-height might be using lh which should be resolved against the parent line height (like we did here already) - if (line_height_value_slot.has_value() && (*line_height_value_slot)->is_length()) - (*line_height_value_slot) = LengthStyleValue::create(Length::make_px(line_height)); + if (line_height_value_slot && line_height_value_slot->is_length()) + line_height_value_slot = LengthStyleValue::create(Length::make_px(line_height)); for (size_t i = 0; i < style.m_property_values.size(); ++i) { auto& value_slot = style.m_property_values[i]; - if (!value_slot.has_value()) + if (!value_slot.style) continue; - value_slot->style = value_slot->style->absolutized(viewport_rect(), font_metrics, m_root_element_font_metrics); + value_slot.style = value_slot.style->absolutized(viewport_rect(), font_metrics, m_root_element_font_metrics); } style.set_line_height({}, line_height); diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp index 51460257c8d..aef4c67b136 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -47,12 +47,12 @@ NonnullRefPtr StyleProperties::clone() const bool StyleProperties::is_property_important(CSS::PropertyID property_id) const { - return m_property_values[to_underlying(property_id)].has_value() && m_property_values[to_underlying(property_id)]->important == Important::Yes; + return m_property_values[to_underlying(property_id)].style && m_property_values[to_underlying(property_id)].important == Important::Yes; } bool StyleProperties::is_property_inherited(CSS::PropertyID property_id) const { - return m_property_values[to_underlying(property_id)].has_value() && m_property_values[to_underlying(property_id)]->inherited == Inherited::Yes; + return m_property_values[to_underlying(property_id)].style && m_property_values[to_underlying(property_id)].inherited == Inherited::Yes; } void StyleProperties::set_property(CSS::PropertyID id, NonnullRefPtr value, CSS::CSSStyleDeclaration const* source_declaration, Inherited inherited, Important important) @@ -75,26 +75,20 @@ NonnullRefPtr StyleProperties::property(CSS::PropertyID proper if (auto animated_value = m_animated_property_values.get(property_id).value_or(nullptr)) return *animated_value; - auto value = m_property_values[to_underlying(property_id)]; // By the time we call this method, all properties have values assigned. - VERIFY(value.has_value()); - return value->style; + return *m_property_values[to_underlying(property_id)].style; } RefPtr StyleProperties::maybe_null_property(CSS::PropertyID property_id) const { if (auto animated_value = m_animated_property_values.get(property_id).value_or(nullptr)) return *animated_value; - - auto value = m_property_values[to_underlying(property_id)]; - if (value.has_value()) - return value->style; - return {}; + return m_property_values[to_underlying(property_id)].style; } CSS::CSSStyleDeclaration const* StyleProperties::property_source_declaration(CSS::PropertyID property_id) const { - return m_property_values[to_underlying(property_id)].map([](auto& value) { return value.declaration; }).value_or(nullptr); + return m_property_values[to_underlying(property_id)].declaration; } CSS::Size StyleProperties::size_value(CSS::PropertyID id) const @@ -628,15 +622,15 @@ bool StyleProperties::operator==(StyleProperties const& other) const for (size_t i = 0; i < m_property_values.size(); ++i) { auto const& my_style = m_property_values[i]; auto const& other_style = other.m_property_values[i]; - if (!my_style.has_value()) { - if (other_style.has_value()) + if (!my_style.style) { + if (other_style.style) return false; continue; } - if (!other_style.has_value()) + if (!other_style.style) return false; - auto const& my_value = *my_style->style; - auto const& other_value = *other_style->style; + auto const& my_value = *my_style.style; + auto const& other_value = *other_style.style; if (my_value.type() != other_value.type()) return false; if (my_value != other_value) diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.h b/Userland/Libraries/LibWeb/CSS/StyleProperties.h index 8bf8707e111..4c5d36c348c 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.h +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.h @@ -29,8 +29,8 @@ public: inline void for_each_property(Callback callback) const { for (size_t i = 0; i < m_property_values.size(); ++i) { - if (m_property_values[i].has_value()) - callback((CSS::PropertyID)i, *m_property_values[i]->style); + if (m_property_values[i].style) + callback((CSS::PropertyID)i, *m_property_values[i].style); } } @@ -45,12 +45,12 @@ public: }; struct StyleAndSourceDeclaration { - NonnullRefPtr style; + RefPtr style; CSS::CSSStyleDeclaration const* declaration = nullptr; Important important { Important::No }; Inherited inherited { Inherited::No }; }; - using PropertyValues = Array, to_underlying(CSS::last_property_id) + 1>; + using PropertyValues = Array; auto& properties() { return m_property_values; } auto const& properties() const { return m_property_values; } diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index e93e08707e8..5f077ac5ddc 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -389,7 +389,7 @@ void ConnectionFromClient::debug_request(u64 page_id, ByteString const& request, dbgln("+ Element {}", element->debug_description()); auto& properties = styles->properties(); for (size_t i = 0; i < properties.size(); ++i) - dbgln("| {} = {}", Web::CSS::string_from_property_id(static_cast(i)), properties[i].has_value() ? properties[i]->style->to_string() : ""_string); + dbgln("| {} = {}", Web::CSS::string_from_property_id(static_cast(i)), properties[i].style ? properties[i].style->to_string() : ""_string); dbgln("---"); } }