From db74244fb234aead8fb31638ffe58d1b193cb723 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 4 Sep 2024 17:20:19 +0200 Subject: [PATCH] LibWeb: Read header to check if a blob without mime type is WOFF/WOFF2 Currently we rely on parser returning an error if encoded data cannot be parsed into a valid WOFF or WOFF2 font, which is not going to be true after switching to Skia that sometimes does not fail even if a data does not represent a valid font. --- .../Libraries/LibWeb/CSS/StyleComputer.cpp | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index 0d12d621f1f..9d4294c90de 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -71,6 +71,8 @@ #include #include #include +#include +#include #include #include #include @@ -164,33 +166,31 @@ void FontLoader::start_loading_next_url() ErrorOr> FontLoader::try_load_font() { // FIXME: This could maybe use the format() provided in @font-face as well, since often the mime type is just application/octet-stream and we have to try every format - auto const& mime_type = resource()->mime_type(); - if (mime_type == "font/ttf"sv || mime_type == "application/x-font-ttf"sv) { - if (auto result = OpenType::Typeface::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { - return result; - } + auto mime_type = MUST(MimeSniff::MimeType::parse(resource()->mime_type())); + if (!mime_type.has_value() || !mime_type->is_font()) { + mime_type = MUST(MimeSniff::Resource::sniff(resource()->encoded_data(), Web::MimeSniff::SniffingConfiguration { .sniffing_context = Web::MimeSniff::SniffingContext::Font })); } - if (mime_type == "font/woff"sv || mime_type == "application/font-woff"sv) { - if (auto result = WOFF::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { - return result; + if (mime_type.has_value()) { + if (mime_type->essence() == "font/ttf"sv || mime_type->essence() == "application/x-font-ttf"sv) { + if (auto result = OpenType::Typeface::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { + return result; + } } - } - if (mime_type == "font/woff2"sv || mime_type == "application/font-woff2"sv) { - if (auto result = WOFF2::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { - return result; + if (mime_type->essence() == "font/woff"sv || mime_type->essence() == "application/font-woff"sv) { + if (auto result = WOFF::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { + return result; + } + } + if (mime_type->essence() == "font/woff2"sv || mime_type->essence() == "application/font-woff2"sv) { + if (auto result = WOFF2::try_load_from_externally_owned_memory(resource()->encoded_data()); !result.is_error()) { + return result; + } } } - // We don't have the luxury of knowing the MIME type, so we have to try all formats. auto ttf = OpenType::Typeface::try_load_from_externally_owned_memory(resource()->encoded_data()); if (!ttf.is_error()) return ttf.release_value(); - auto woff = WOFF::try_load_from_externally_owned_memory(resource()->encoded_data()); - if (!woff.is_error()) - return woff.release_value(); - auto woff2 = WOFF2::try_load_from_externally_owned_memory(resource()->encoded_data()); - if (!woff2.is_error()) - return woff2.release_value(); return Error::from_string_literal("Automatic format detection failed"); }