// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_ #define ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_ #include #include #include #include "base/memory/raw_ptr.h" #include "content/public/browser/reload_type.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h" #include "url/gurl.h" class SkBitmap; namespace gfx { class Size; } namespace android_webview { // A helper that observes favicon changes for Webview. class IconHelper : public content::WebContentsObserver { public: class Listener { public: virtual bool ShouldDownloadFavicon(const GURL& icon_url) = 0; virtual void OnReceivedIcon(const GURL& icon_url, const SkBitmap& bitmap) = 0; virtual void OnReceivedTouchIconUrl(const std::string& url, const bool precomposed) = 0; protected: virtual ~Listener() {} }; explicit IconHelper(content::WebContents* web_contents); IconHelper(const IconHelper&) = delete; IconHelper& operator=(const IconHelper&) = delete; ~IconHelper() override; void SetListener(Listener* listener); // From WebContentsObserver void DidUpdateFaviconURL( content::RenderFrameHost* render_frame_host, const std::vector& candidates) override; void DidStartNavigation(content::NavigationHandle* navigation) override; void DownloadFaviconCallback( int id, int http_status_code, const GURL& image_url, const std::vector& bitmaps, const std::vector& original_bitmap_sizes); private: void MarkUnableToDownloadFavicon(const GURL& icon_url); bool WasUnableToDownloadFavicon(const GURL& icon_url) const; void ClearUnableToDownloadFavicons(); raw_ptr listener_; using MissingFaviconURLHash = size_t; std::unordered_set missing_favicon_urls_; }; } // namespace android_webview #endif // ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_