// Copyright 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 CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ #define CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ #include <map> #include <set> #include <vector> #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/web_contents_observer.h" class SkBitmap; namespace content { struct FaviconURL; } namespace gfx { class Size; } // Class to help download all favicons for a tab. class FaviconDownloader : public content::WebContentsObserver { public: typedef std::map<GURL, std::vector<SkBitmap> > FaviconMap; typedef base::Callback<void( bool, /* success */ /* A map of icon urls to the bitmaps provided by that url. */ const FaviconMap&)> FaviconDownloaderCallback; // |extra_favicon_urls| allows callers to provide icon urls that aren't // provided by the renderer (e.g touch icons on non-android environments). // |skip_page_favicons| instructs the downloader to not query the page // for favicons (e.g. when a favicon URL has already been provided in // |extra_favicon_urls|). FaviconDownloader(content::WebContents* web_contents, const std::vector<GURL>& extra_favicon_urls, FaviconDownloaderCallback callback); ~FaviconDownloader() override; void SkipPageFavicons(); void Start(); private: friend class TestFaviconDownloader; // Initiates a download of the image at |url| and returns the download id. // This is overridden in testing. virtual int DownloadImage(const GURL& url); // Queries FaviconDriver for the page's current favicon URLs. // This is overridden in testing. virtual std::vector<content::FaviconURL> GetFaviconURLsFromWebContents(); // Fetches icons for the given urls. // |callback_| is run when all downloads complete. void FetchIcons(const std::vector<content::FaviconURL>& favicon_urls); void FetchIcons(const std::vector<GURL>& urls); // Icon download callback. void DidDownloadFavicon(int id, int http_status_code, const GURL& image_url, const std::vector<SkBitmap>& bitmaps, const std::vector<gfx::Size>& original_bitmap_sizes); // content::WebContentsObserver overrides: void DidNavigateMainFrame( const content::LoadCommittedDetails& details, const content::FrameNavigateParams& params) override; void DidUpdateFaviconURL( const std::vector<content::FaviconURL>& candidates) override; // Whether we need to fetch favicons from the renderer. bool need_favicon_urls_; // URLs that aren't given by WebContentsObserver::DidUpdateFaviconURL() that // should be used for this favicon. This is necessary in order to get touch // icons on non-android environments. std::vector<GURL> extra_favicon_urls_; // The icons which were downloaded. Populated by FetchIcons(). FaviconMap favicon_map_; // Request ids of in-progress requests. std::set<int> in_progress_requests_; // Urls for which a download has already been initiated. Used to prevent // duplicate downloads of the same url. std::set<GURL> processed_urls_; // Callback to run on favicon download completion. FaviconDownloaderCallback callback_; base::WeakPtrFactory<FaviconDownloader> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(FaviconDownloader); }; #endif // CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_