From 549205fe33cdd5697c25fbd875c379f322581b83 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 4 Apr 2025 12:10:12 +0100 Subject: [PATCH] LibWeb/CSS: Use initial values for `@font-face` descriptors --- .../LibWeb/CSS/CSSFontFaceDescriptors.cpp | 8 +++++ Libraries/LibWeb/CSS/CSSFontFaceDescriptors.h | 1 + Libraries/LibWeb/CSS/ParsedFontFace.cpp | 30 +++++++++---------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.cpp b/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.cpp index 86d25094c56..8997f18aff5 100644 --- a/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.cpp +++ b/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.cpp @@ -263,6 +263,14 @@ RefPtr CSSFontFaceDescriptors::descriptor(DescriptorID desc return nullptr; } +RefPtr CSSFontFaceDescriptors::descriptor_or_initial_value(DescriptorID descriptor_id) const +{ + if (auto value = descriptor(descriptor_id)) + return value.release_nonnull(); + + return descriptor_initial_value(AtRuleID::FontFace, descriptor_id); +} + WebIDL::ExceptionOr CSSFontFaceDescriptors::set_ascent_override(StringView value) { return set_property("ascent-override"sv, value, ""sv); diff --git a/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.h b/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.h index 214df680de2..82ba82c5d04 100644 --- a/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.h +++ b/Libraries/LibWeb/CSS/CSSFontFaceDescriptors.h @@ -33,6 +33,7 @@ public: virtual StringView get_property_priority(StringView property) const override; RefPtr descriptor(DescriptorID) const; + RefPtr descriptor_or_initial_value(DescriptorID) const; WebIDL::ExceptionOr set_ascent_override(StringView value); String ascent_override() const; diff --git a/Libraries/LibWeb/CSS/ParsedFontFace.cpp b/Libraries/LibWeb/CSS/ParsedFontFace.cpp index 82e62ec1e45..e4f3ae0ce84 100644 --- a/Libraries/LibWeb/CSS/ParsedFontFace.cpp +++ b/Libraries/LibWeb/CSS/ParsedFontFace.cpp @@ -45,23 +45,23 @@ ParsedFontFace ParsedFontFace::from_descriptors(CSSFontFaceDescriptors const& de }; FlyString font_family; - if (auto value = descriptors.descriptor(DescriptorID::FontFamily)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontFamily)) font_family = extract_font_name(*value); Optional weight; - if (auto value = descriptors.descriptor(DescriptorID::FontWeight)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontWeight)) weight = value->to_font_weight(); Optional slope; - if (auto value = descriptors.descriptor(DescriptorID::FontStyle)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontStyle)) slope = value->to_font_slope(); Optional width; - if (auto value = descriptors.descriptor(DescriptorID::FontWidth)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontWidth)) width = value->to_font_width(); Vector sources; - if (auto value = descriptors.descriptor(DescriptorID::Src)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::Src)) { auto add_source = [&sources, extract_font_name](FontSourceStyleValue const& font_source) { font_source.source().visit( [&](FontSourceStyleValue::Local const& local) { @@ -82,7 +82,7 @@ ParsedFontFace ParsedFontFace::from_descriptors(CSSFontFaceDescriptors const& de } Vector unicode_ranges; - if (auto value = descriptors.descriptor(DescriptorID::UnicodeRange)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::UnicodeRange)) { if (value->is_unicode_range()) { unicode_ranges.append(value->as_unicode_range().unicode_range()); } else if (value->is_value_list()) { @@ -90,39 +90,37 @@ ParsedFontFace ParsedFontFace::from_descriptors(CSSFontFaceDescriptors const& de unicode_ranges.append(range->as_unicode_range().unicode_range()); } } - if (unicode_ranges.is_empty()) - unicode_ranges.empend(0x0u, 0x10FFFFu); Optional ascent_override; - if (auto value = descriptors.descriptor(DescriptorID::AscentOverride)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::AscentOverride)) ascent_override = extract_percentage_or_normal(*value); Optional descent_override; - if (auto value = descriptors.descriptor(DescriptorID::DescentOverride)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::DescentOverride)) descent_override = extract_percentage_or_normal(*value); Optional line_gap_override; - if (auto value = descriptors.descriptor(DescriptorID::LineGapOverride)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::LineGapOverride)) line_gap_override = extract_percentage_or_normal(*value); FontDisplay font_display; - if (auto value = descriptors.descriptor(DescriptorID::FontDisplay)) + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontDisplay)) font_display = keyword_to_font_display(value->to_keyword()).value_or(FontDisplay::Auto); Optional font_named_instance; - if (auto value = descriptors.descriptor(DescriptorID::FontNamedInstance)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontNamedInstance)) { if (value->is_string()) font_named_instance = value->as_string().string_value(); } Optional font_language_override; - if (auto value = descriptors.descriptor(DescriptorID::FontLanguageOverride)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontLanguageOverride)) { if (value->is_string()) font_language_override = value->as_string().string_value(); } Optional> font_feature_settings; - if (auto value = descriptors.descriptor(DescriptorID::FontFeatureSettings)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontFeatureSettings)) { if (value->to_keyword() == Keyword::Normal) { font_feature_settings.clear(); } else if (value->is_value_list()) { @@ -144,7 +142,7 @@ ParsedFontFace ParsedFontFace::from_descriptors(CSSFontFaceDescriptors const& de } Optional> font_variation_settings; - if (auto value = descriptors.descriptor(DescriptorID::FontVariationSettings)) { + if (auto value = descriptors.descriptor_or_initial_value(DescriptorID::FontVariationSettings)) { if (value->to_keyword() == Keyword::Normal) { font_variation_settings.clear(); } else if (value->is_value_list()) {