소스 검색

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.
Anthony Van de Gejuchte 3 년 전
부모
커밋
69ca27d3d7
2개의 변경된 파일14개의 추가작업 그리고 0개의 파일을 삭제
  1. 1 0
      Userland/Libraries/LibWeb/DOM/Document.h
  2. 13 0
      Userland/Libraries/LibWeb/Loader/FrameLoader.cpp

+ 1 - 0
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:

+ 13 - 0
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 {