diff options
Diffstat (limited to 'chrome/browser/extensions/favicon_downloader.h')
-rw-r--r-- | chrome/browser/extensions/favicon_downloader.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/chrome/browser/extensions/favicon_downloader.h b/chrome/browser/extensions/favicon_downloader.h new file mode 100644 index 0000000..e42ee9b --- /dev/null +++ b/chrome/browser/extensions/favicon_downloader.h @@ -0,0 +1,101 @@ +// 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/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). + FaviconDownloader(content::WebContents* web_contents, + const std::vector<GURL>& extra_favicon_urls, + FaviconDownloaderCallback callback); + virtual ~FaviconDownloader(); + + 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 FaviconTabHelper 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: + virtual void DidNavigateMainFrame( + const content::LoadCommittedDetails& details, + const content::FrameNavigateParams& params) OVERRIDE; + virtual void DidUpdateFaviconURL( + int32 page_id, + const std::vector<content::FaviconURL>& candidates) OVERRIDE; + + // Whether we have received favicons from the renderer. + bool got_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_ |