// Copyright (c) 2011 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_FAVICON_SERVICE_H__ #define CHROME_BROWSER_FAVICON_SERVICE_H__ #pragma once #include <vector> #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/task.h" #include "chrome/browser/history/history_types.h" #include "chrome/common/ref_counted_util.h" #include "content/browser/cancelable_request.h" class GURL; class Profile; // The favicon service provides methods to access favicons. It calls the history // backend behind the scenes. // // This service is thread safe. Each request callback is invoked in the // thread that made the request. class FaviconService : public CancelableRequestProvider, public base::RefCountedThreadSafe<FaviconService> { public: explicit FaviconService(Profile* profile); // Callback for GetFavicon. If we have previously inquired about the favicon // for this URL, |know_favicon| will be true, and the rest of the fields will // be valid (otherwise they will be ignored). // // On |know_favicon| == true, |data| will either contain the PNG encoded // favicon data, or it will be NULL to indicate that the site does not have // a favicon (in other words, we know the site doesn't have a favicon, as // opposed to not knowing anything). |expired| will be set to true if we // refreshed the favicon "too long" ago and should be updated if the page // is visited again. typedef Callback2<Handle, // handle history::FaviconData>::Type // the type of favicon FaviconDataCallback; typedef CancelableRequest<FaviconDataCallback> GetFaviconRequest; // Requests the |icon_type| of favicon. |consumer| is notified when the bits // have been fetched. Handle GetFavicon(const GURL& icon_url, history::IconType icon_type, CancelableRequestConsumerBase* consumer, FaviconDataCallback* callback); // Fetches the |icon_type| of favicon at |icon_url|, sending the results to // the given |callback|. If the favicon has previously been set via // SetFavicon(), then the favicon URL for |page_url| and all redirects is set // to |icon_url|. If the favicon has not been set, the database is not // updated. Handle UpdateFaviconMappingAndFetch(const GURL& page_url, const GURL& icon_url, history::IconType icon_type, CancelableRequestConsumerBase* consumer, FaviconDataCallback* callback); // Requests any |icon_types| of favicon for a web page URL. |consumer| is // notified when the bits have been fetched. |icon_types| can be any // combination of IconType value, but only one icon will be returned in the // priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON and FAVICON. // // Note: this version is intended to be used to retrieve the favicon of a // page that has been browsed in the past. |expired| in the callback is // always false. Handle GetFaviconForURL(const GURL& page_url, int icon_types, CancelableRequestConsumerBase* consumer, FaviconDataCallback* callback); // Marks all types of favicon for the page as being out of date. void SetFaviconOutOfDateForPage(const GURL& page_url); // Allows the importer to set many favicons for many pages at once. The pages // must exist, any favicon sets for unknown pages will be discarded. Existing // favicons will not be overwritten. void SetImportedFavicons( const std::vector<history::ImportedFaviconUsage>& favicon_usage); // Sets the favicon for a page. void SetFavicon(const GURL& page_url, const GURL& icon_url, const std::vector<unsigned char>& image_data, history::IconType icon_type); private: friend class base::RefCountedThreadSafe<FaviconService>; ~FaviconService(); Profile* profile_; // Helper to forward an empty result if we cannot get the history service. void ForwardEmptyResultAsync(GetFaviconRequest* request); DISALLOW_COPY_AND_ASSIGN(FaviconService); }; #endif // CHROME_BROWSER_FAVICON_SERVICE_H__