From 69ca27d3d7868ca2e19153b636455e2e8fbfada1 Mon Sep 17 00:00:00 2001 From: Anthony Van de Gejuchte Date: Sun, 3 Apr 2022 19:56:15 +0200 Subject: [PATCH] LibWeb: Show correct favicon when default favicon is loaded Block the replacement of the favicon by the default favicon loader when a favicon that is loaded through a link tag is already active. This way, the favicon in the link tags will be prioritized against the default favicons from `/favicon.ico` or the seranity default icon. --- Userland/Libraries/LibWeb/DOM/Document.h | 1 + Userland/Libraries/LibWeb/Loader/FrameLoader.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index d64ca68435..846926b593 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -339,6 +339,7 @@ public: bool in_removed_last_ref() const { return m_in_removed_last_ref; } + bool has_active_favicon() const { return m_active_favicon; } void check_favicon_after_loading_link_resource(); private: diff --git a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp index 630fde5599..73d5a17132 100644 --- a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp @@ -187,6 +187,10 @@ bool FrameLoader::load(LoadRequest& request, Type type) if (type == Type::IFrame) return true; + auto* document = browsing_context().active_document(); + if (document && document->has_active_favicon()) + return true; + if (url.protocol() == "http" || url.protocol() == "https") { AK::URL favicon_url; favicon_url.set_protocol(url.protocol()); @@ -197,6 +201,10 @@ bool FrameLoader::load(LoadRequest& request, Type type) ResourceLoader::the().load( favicon_url, [this, favicon_url](auto data, auto&, auto) { + // Always fetch the current document + auto* document = this->browsing_context().active_document(); + if (document && document->has_active_favicon()) + return; dbgln_if(SPAM_DEBUG, "Favicon downloaded, {} bytes from {}", data.size(), favicon_url); if (data.is_empty()) return; @@ -211,6 +219,11 @@ bool FrameLoader::load(LoadRequest& request, Type type) load_favicon(favicon_bitmap); }, [this](auto&, auto) { + // Always fetch the current document + auto* document = this->browsing_context().active_document(); + if (document && document->has_active_favicon()) + return; + load_favicon(); }); } else {