Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 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_FAVICON_SERVICE_H__
      6 #define CHROME_BROWSER_FAVICON_SERVICE_H__
      7 #pragma once
      8 
      9 #include <vector>
     10 
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/ref_counted_memory.h"
     13 #include "base/task.h"
     14 #include "chrome/browser/history/history_types.h"
     15 #include "chrome/common/ref_counted_util.h"
     16 #include "content/browser/cancelable_request.h"
     17 
     18 class GURL;
     19 class Profile;
     20 
     21 // The favicon service provides methods to access favicons. It calls the history
     22 // backend behind the scenes.
     23 //
     24 // This service is thread safe. Each request callback is invoked in the
     25 // thread that made the request.
     26 class FaviconService : public CancelableRequestProvider,
     27                        public base::RefCountedThreadSafe<FaviconService> {
     28  public:
     29   explicit FaviconService(Profile* profile);
     30 
     31   // Callback for GetFavicon. If we have previously inquired about the favicon
     32   // for this URL, |know_favicon| will be true, and the rest of the fields will
     33   // be valid (otherwise they will be ignored).
     34   //
     35   // On |know_favicon| == true, |data| will either contain the PNG encoded
     36   // favicon data, or it will be NULL to indicate that the site does not have
     37   // a favicon (in other words, we know the site doesn't have a favicon, as
     38   // opposed to not knowing anything). |expired| will be set to true if we
     39   // refreshed the favicon "too long" ago and should be updated if the page
     40   // is visited again.
     41   typedef Callback2<Handle,                             // handle
     42                     history::FaviconData>::Type  // the type of favicon
     43                     FaviconDataCallback;
     44 
     45   typedef CancelableRequest<FaviconDataCallback> GetFaviconRequest;
     46 
     47   // Requests the |icon_type| of favicon. |consumer| is notified when the bits
     48   // have been fetched.
     49   Handle GetFavicon(const GURL& icon_url,
     50                     history::IconType icon_type,
     51                     CancelableRequestConsumerBase* consumer,
     52                     FaviconDataCallback* callback);
     53 
     54   // Fetches the |icon_type| of favicon at |icon_url|, sending the results to
     55   // the given |callback|. If the favicon has previously been set via
     56   // SetFavicon(), then the favicon URL for |page_url| and all redirects is set
     57   // to |icon_url|. If the favicon has not been set, the database is not
     58   // updated.
     59   Handle UpdateFaviconMappingAndFetch(const GURL& page_url,
     60                                       const GURL& icon_url,
     61                                       history::IconType icon_type,
     62                                       CancelableRequestConsumerBase* consumer,
     63                                       FaviconDataCallback* callback);
     64 
     65   // Requests any |icon_types| of favicon for a web page URL. |consumer| is
     66   // notified when the bits have been fetched. |icon_types| can be any
     67   // combination of IconType value, but only one icon will be returned in the
     68   // priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON and FAVICON.
     69   //
     70   // Note: this version is intended to be used to retrieve the favicon of a
     71   // page that has been browsed in the past. |expired| in the callback is
     72   // always false.
     73   Handle GetFaviconForURL(const GURL& page_url,
     74                           int icon_types,
     75                           CancelableRequestConsumerBase* consumer,
     76                           FaviconDataCallback* callback);
     77 
     78   // Marks all types of favicon for the page as being out of date.
     79   void SetFaviconOutOfDateForPage(const GURL& page_url);
     80 
     81   // Allows the importer to set many favicons for many pages at once. The pages
     82   // must exist, any favicon sets for unknown pages will be discarded. Existing
     83   // favicons will not be overwritten.
     84   void SetImportedFavicons(
     85       const std::vector<history::ImportedFaviconUsage>& favicon_usage);
     86 
     87   // Sets the favicon for a page.
     88   void SetFavicon(const GURL& page_url,
     89                   const GURL& icon_url,
     90                   const std::vector<unsigned char>& image_data,
     91                   history::IconType icon_type);
     92 
     93  private:
     94   friend class base::RefCountedThreadSafe<FaviconService>;
     95 
     96   ~FaviconService();
     97 
     98   Profile* profile_;
     99 
    100   // Helper to forward an empty result if we cannot get the history service.
    101   void ForwardEmptyResultAsync(GetFaviconRequest* request);
    102 
    103   DISALLOW_COPY_AND_ASSIGN(FaviconService);
    104 };
    105 
    106 #endif  // CHROME_BROWSER_FAVICON_SERVICE_H__
    107