| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_CHROME_BROWSER_FAVICON_FAVICON_LOADER_H_ |
| #define IOS_CHROME_BROWSER_FAVICON_FAVICON_LOADER_H_ |
| |
| #import <Foundation/Foundation.h> |
| |
| #include "base/task/cancelable_task_tracker.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| |
| class GURL; |
| @class FaviconAttributes; |
| |
| namespace favicon { |
| class LargeIconService; |
| } |
| |
| // A class that manages asynchronously loading favicons or fallback attributes |
| // from LargeIconService and caching them, given a URL. |
| class FaviconLoader : public KeyedService { |
| public: |
| // Type for completion block for FaviconForURL(). |
| typedef void (^FaviconAttributesCompletionBlock)(FaviconAttributes*); |
| |
| explicit FaviconLoader(favicon::LargeIconService* large_icon_service); |
| |
| FaviconLoader(const FaviconLoader&) = delete; |
| FaviconLoader& operator=(const FaviconLoader&) = delete; |
| |
| ~FaviconLoader() override; |
| |
| // Tries to find a FaviconAttributes in `favicon_cache_` with `page_url`: |
| // If found, invokes `favicon_block_handler` and exits. |
| // If not found, invokes `favicon_block_handler` with a default placeholder |
| // then invokes it again asynchronously with the favicon fetched by trying |
| // following methods: |
| // 1. Use `large_icon_service_` to fetch from local DB managed by |
| // HistoryService; |
| // 2. Use `large_icon_service_` to fetch from Google Favicon server if |
| // `fallback_to_google_server=true` (`size_in_points` is ignored when |
| // fetching from the Google server); |
| // 3. Create a favicon base on the fallback style from `large_icon_service`. |
| void FaviconForPageUrl( |
| const GURL& page_url, |
| float size_in_points, |
| float min_size_in_points, |
| bool fallback_to_google_server, |
| FaviconAttributesCompletionBlock favicon_block_handler); |
| |
| // Tries to find a FaviconAttributes in `favicon_cache_` with `page_url`: |
| // If found, invokes `favicon_block_handler` and exits. |
| // If not found, invokes `favicon_block_handler` with a default placeholder |
| // then invokes it again asynchronously with the favicon fetched by trying |
| // following methods: |
| // 1. Use `large_icon_service_` to fetch from local DB managed by |
| // HistoryService; |
| // 2. Create a favicon base on the fallback style from `large_icon_service`. |
| void FaviconForPageUrlOrHost( |
| const GURL& page_url, |
| float size_in_points, |
| FaviconAttributesCompletionBlock favicon_block_handler); |
| |
| // Tries to find a FaviconAttributes in `favicon_cache_` with `icon_url`: |
| // If found, invokes `favicon_block_handler` and exits. |
| // If not found, invokes `favicon_block_handler` with a default placeholder |
| // then invokes it again asynchronously with the favicon fetched by trying |
| // following methods: |
| // 1. Use `large_icon_service_` to fetch from local DB managed by |
| // HistoryService; |
| // 2. Create a favicon base on the fallback style from `large_icon_service`. |
| void FaviconForIconUrl( |
| const GURL& icon_url, |
| float size_in_points, |
| float min_size_in_points, |
| FaviconAttributesCompletionBlock favicon_block_handler); |
| |
| // Cancel all incomplete requests. |
| void CancellAllRequests(); |
| |
| // Return a weak pointer to the current object. |
| base::WeakPtr<FaviconLoader> AsWeakPtr(); |
| |
| private: |
| // The LargeIconService used to retrieve favicon. |
| favicon::LargeIconService* large_icon_service_; |
| |
| // Tracks tasks sent to FaviconService. |
| base::CancelableTaskTracker cancelable_task_tracker_; |
| // Holds cached favicons. This NSCache is populated as favicons or fallback |
| // attributes are retrieved from `large_icon_service_`. Contents will be |
| // removed during low-memory conditions based on its inherent LRU removal |
| // algorithm. Keyed by NSString of URL (page URL or icon URL) spec. |
| NSCache<NSString*, FaviconAttributes*>* favicon_cache_; |
| |
| base::WeakPtrFactory<FaviconLoader> weak_ptr_factory_{this}; |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_FAVICON_FAVICON_LOADER_H_ |