OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ |
| 7 |
| 8 #include <map> |
| 9 #include <set> |
| 10 #include <vector> |
| 11 |
| 12 #include "base/callback.h" |
| 13 #include "base/memory/weak_ptr.h" |
| 14 #include "content/public/browser/web_contents_observer.h" |
| 15 |
| 16 class SkBitmap; |
| 17 |
| 18 namespace content { |
| 19 struct FaviconURL; |
| 20 } |
| 21 |
| 22 namespace gfx { |
| 23 class Size; |
| 24 } |
| 25 |
| 26 // Class to help download all favicons for a tab. |
| 27 class FaviconDownloader : public content::WebContentsObserver { |
| 28 public: |
| 29 typedef std::map<GURL, std::vector<SkBitmap> > FaviconMap; |
| 30 typedef base::Callback<void( |
| 31 bool, /* success */ |
| 32 /* A map of icon urls to the bitmaps provided by that url. */ |
| 33 const FaviconMap&)> |
| 34 FaviconDownloaderCallback; |
| 35 // |extra_favicon_urls| allows callers to provide icon urls that aren't |
| 36 // |provided by the renderer (e.g touch icons on non-android environments). |
| 37 FaviconDownloader(content::WebContents* web_contents, |
| 38 const std::vector<GURL>& extra_favicon_urls, |
| 39 FaviconDownloaderCallback callback); |
| 40 virtual ~FaviconDownloader(); |
| 41 |
| 42 void Start(); |
| 43 |
| 44 private: |
| 45 friend class TestFaviconDownloader; |
| 46 |
| 47 // Initiates a download of the image at |url| and returns the download id. |
| 48 // This is overridden in testing. |
| 49 virtual int DownloadImage(const GURL& url); |
| 50 |
| 51 // Queries FaviconTabHelper for the page's current favicon URLs. |
| 52 // This is overridden in testing. |
| 53 virtual std::vector<content::FaviconURL> GetFaviconURLsFromWebContents(); |
| 54 |
| 55 // Fetches icons for the given urls. |
| 56 // |callback_| is run when all downloads complete. |
| 57 void FetchIcons(const std::vector<content::FaviconURL>& favicon_urls); |
| 58 void FetchIcons(const std::vector<GURL>& urls); |
| 59 |
| 60 // Icon download callback. |
| 61 void DidDownloadFavicon(int id, |
| 62 int http_status_code, |
| 63 const GURL& image_url, |
| 64 const std::vector<SkBitmap>& bitmaps, |
| 65 const std::vector<gfx::Size>& original_bitmap_sizes); |
| 66 |
| 67 // content::WebContentsObserver overrides: |
| 68 virtual void DidNavigateMainFrame( |
| 69 const content::LoadCommittedDetails& details, |
| 70 const content::FrameNavigateParams& params) OVERRIDE; |
| 71 virtual void DidUpdateFaviconURL( |
| 72 int32 page_id, |
| 73 const std::vector<content::FaviconURL>& candidates) OVERRIDE; |
| 74 |
| 75 // Whether we have received favicons from the renderer. |
| 76 bool got_favicon_urls_; |
| 77 |
| 78 // URLs that aren't given by WebContentsObserver::DidUpdateFaviconURL() that |
| 79 // should be used for this favicon. This is necessary in order to get touch |
| 80 // icons on non-android environments. |
| 81 std::vector<GURL> extra_favicon_urls_; |
| 82 |
| 83 // The icons which were downloaded. Populated by FetchIcons(). |
| 84 FaviconMap favicon_map_; |
| 85 |
| 86 // Request ids of in-progress requests. |
| 87 std::set<int> in_progress_requests_; |
| 88 |
| 89 // Urls for which a download has already been initiated. Used to prevent |
| 90 // duplicate downloads of the same url. |
| 91 std::set<GURL> processed_urls_; |
| 92 |
| 93 // Callback to run on favicon download completion. |
| 94 FaviconDownloaderCallback callback_; |
| 95 |
| 96 base::WeakPtrFactory<FaviconDownloader> weak_ptr_factory_; |
| 97 |
| 98 DISALLOW_COPY_AND_ASSIGN(FaviconDownloader); |
| 99 }; |
| 100 |
| 101 #endif // CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ |
OLD | NEW |