From 7c50a31402c0240ccd19658284dec48ff876fc17 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 26 Sep 2024 14:45:55 +0100 Subject: [PATCH] LibWeb/CSS: Parse font-named-instance descriptor --- Userland/Libraries/LibWeb/CSS/FontFace.cpp | 13 +++++++++- .../Libraries/LibWeb/CSS/ParsedFontFace.cpp | 3 ++- .../Libraries/LibWeb/CSS/ParsedFontFace.h | 4 +++- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 24 ++++++++++++++++++- Userland/Libraries/LibWeb/Dump.cpp | 5 ++++ 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/FontFace.cpp b/Userland/Libraries/LibWeb/CSS/FontFace.cpp index 2f940964df3..bb9885a67eb 100644 --- a/Userland/Libraries/LibWeb/CSS/FontFace.cpp +++ b/Userland/Libraries/LibWeb/CSS/FontFace.cpp @@ -388,7 +388,18 @@ void FontFace::load_font_source() auto& style_computer = const_cast(window.document()->style_computer()); // FIXME: The ParsedFontFace is kind of expensive to create. We should be using a shared sub-object for the data - ParsedFontFace parsed_font_face { font->m_family, font->m_weight.to_number(), 0 /* FIXME: slope */, font->m_urls, font->m_unicode_ranges, /* FIXME: ascent_override */ {}, /* FIXME: descent_override */ {}, /* FIXME: line_gap_override */ {}, /* FIXME: font_display */ FontDisplay::Auto }; + ParsedFontFace parsed_font_face { + font->m_family, + font->m_weight.to_number(), + 0, // FIXME: slope + font->m_urls, + font->m_unicode_ranges, + {}, // FIXME: ascent_override + {}, // FIXME: descent_override + {}, // FIXME: line_gap_override + FontDisplay::Auto, // FIXME: font_display + {}, // font-named-instance doesn't exist in FontFace + }; if (auto loader = style_computer.load_font_face(parsed_font_face, move(on_load), move(on_error)); loader.has_value()) loader->start_loading_next_url(); } else { diff --git a/Userland/Libraries/LibWeb/CSS/ParsedFontFace.cpp b/Userland/Libraries/LibWeb/CSS/ParsedFontFace.cpp index e77f9e11335..adf1a214d23 100644 --- a/Userland/Libraries/LibWeb/CSS/ParsedFontFace.cpp +++ b/Userland/Libraries/LibWeb/CSS/ParsedFontFace.cpp @@ -9,8 +9,9 @@ namespace Web::CSS { -ParsedFontFace::ParsedFontFace(FlyString font_family, Optional weight, Optional slope, Vector sources, Vector unicode_ranges, Optional ascent_override, Optional descent_override, Optional line_gap_override, FontDisplay font_display) +ParsedFontFace::ParsedFontFace(FlyString font_family, Optional weight, Optional slope, Vector sources, Vector unicode_ranges, Optional ascent_override, Optional descent_override, Optional line_gap_override, FontDisplay font_display, Optional font_named_instance) : m_font_family(move(font_family)) + , m_font_named_instance(move(font_named_instance)) , m_weight(weight) , m_slope(slope) , m_sources(move(sources)) diff --git a/Userland/Libraries/LibWeb/CSS/ParsedFontFace.h b/Userland/Libraries/LibWeb/CSS/ParsedFontFace.h index 0e4553cd1c4..cae522839cb 100644 --- a/Userland/Libraries/LibWeb/CSS/ParsedFontFace.h +++ b/Userland/Libraries/LibWeb/CSS/ParsedFontFace.h @@ -23,13 +23,14 @@ public: Optional format; }; - ParsedFontFace(FlyString font_family, Optional weight, Optional slope, Vector sources, Vector unicode_ranges, Optional ascent_override, Optional descent_override, Optional line_gap_override, FontDisplay font_display); + ParsedFontFace(FlyString font_family, Optional weight, Optional slope, Vector sources, Vector unicode_ranges, Optional ascent_override, Optional descent_override, Optional line_gap_override, FontDisplay font_display, Optional font_named_instance); ~ParsedFontFace() = default; Optional ascent_override() const { return m_ascent_override; } Optional descent_override() const { return m_descent_override; } FontDisplay font_display() const { return m_font_display; } FlyString font_family() const { return m_font_family; } + Optional font_named_instance() const { return m_font_named_instance; } Optional slope() const { return m_slope; } Optional weight() const { return m_weight; } Optional line_gap_override() const { return m_line_gap_override; } @@ -38,6 +39,7 @@ public: private: FlyString m_font_family; + Optional m_font_named_instance; Optional m_weight { 0 }; Optional m_slope { 0 }; Vector m_sources; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 64554a27813..a59b7fce45d 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -5451,6 +5451,7 @@ JS::GCPtr Parser::parse_font_face_rule(TokenStream font_family; + Optional font_named_instance; Vector src; Vector unicode_range; Optional weight; @@ -5578,6 +5579,27 @@ JS::GCPtr Parser::parse_font_face_rule(TokenStream + TokenStream token_stream { declaration.values() }; + token_stream.skip_whitespace(); + auto& token = token_stream.next_token(); + token_stream.skip_whitespace(); + if (token_stream.has_next_token()) { + dbgln_if(CSS_PARSER_DEBUG, "CSSParser: Unexpected trailing tokens in font-named-instance"); + continue; + } + + if (token.is_ident("auto"sv)) { + font_named_instance.clear(); + } else if (token.is(Token::Type::String)) { + font_named_instance = token.token().string(); + } else { + dbgln_if(CSS_PARSER_DEBUG, "CSSParser: Failed to parse font-named-instance from {}", token.to_debug_string()); + } + + continue; + } if (declaration.name().equals_ignoring_ascii_case("font-style"sv)) { TokenStream token_stream { declaration.values() }; if (auto value = parse_css_value(CSS::PropertyID::FontStyle, token_stream); !value.is_error()) { @@ -5630,7 +5652,7 @@ JS::GCPtr Parser::parse_font_face_rule(TokenStream Parser::parse_as_font_face_src() diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index 9db03f4da6a..07bd8e9073b 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -694,6 +694,11 @@ void dump_font_face_rule(StringBuilder& builder, CSS::CSSFontFaceRule const& rul indent(builder, indent_levels + 1); builder.appendff("display: {}\n", CSS::to_string(font_face.font_display())); + + if (font_face.font_named_instance().has_value()) { + indent(builder, indent_levels + 1); + builder.appendff("named-instance: {}\n", font_face.font_named_instance().value()); + } } void dump_import_rule(StringBuilder& builder, CSS::CSSImportRule const& rule, int indent_levels)