toolkit/components/places/nsFaviconService.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsFaviconService_h_
     7 #define nsFaviconService_h_
     9 #include "nsIFaviconService.h"
    10 #include "mozIAsyncFavicons.h"
    12 #include "nsCOMPtr.h"
    13 #include "nsString.h"
    14 #include "nsDataHashtable.h"
    15 #include "nsServiceManagerUtils.h"
    16 #include "nsTHashtable.h"
    17 #include "nsToolkitCompsCID.h"
    18 #include "nsURIHashKey.h"
    19 #include "nsITimer.h"
    20 #include "Database.h"
    21 #include "mozilla/storage.h"
    22 #include "mozilla/Attributes.h"
    24 #include "AsyncFaviconHelpers.h"
    26 // Favicons bigger than this size should not be saved to the db to avoid
    27 // bloating it with large image blobs.
    28 // This still allows us to accept a favicon even if we cannot optimize it.
    29 #define MAX_FAVICON_SIZE 10240
    31 // Most icons will be smaller than this rough estimate of the size of an
    32 // uncompressed 16x16 RGBA image of the same dimensions.
    33 #define MAX_ICON_FILESIZE(s) ((uint32_t) s*s*4)
    35 // forward class definitions
    36 class mozIStorageStatementCallback;
    38 class UnassociatedIconHashKey : public nsURIHashKey
    39 {
    40 public:
    41   UnassociatedIconHashKey(const nsIURI* aURI)
    42   : nsURIHashKey(aURI)
    43   {
    44   }
    45   UnassociatedIconHashKey(const UnassociatedIconHashKey& aOther)
    46   : nsURIHashKey(aOther)
    47   {
    48     NS_NOTREACHED("Do not call me!");
    49   }
    50   mozilla::places::IconData iconData;
    51   PRTime created;
    52 };
    54 class nsFaviconService MOZ_FINAL : public nsIFaviconService
    55                                  , public mozIAsyncFavicons
    56                                  , public nsITimerCallback
    57 {
    58 public:
    59   nsFaviconService();
    61   /**
    62    * Obtains the service's object.
    63    */
    64   static already_AddRefed<nsFaviconService> GetSingleton();
    66   /**
    67    * Initializes the service's object.  This should only be called once.
    68    */
    69   nsresult Init();
    71   /**
    72    * Returns a cached pointer to the favicon service for consumers in the
    73    * places directory.
    74    */
    75   static nsFaviconService* GetFaviconService()
    76   {
    77     if (!gFaviconService) {
    78       nsCOMPtr<nsIFaviconService> serv =
    79         do_GetService(NS_FAVICONSERVICE_CONTRACTID);
    80       NS_ENSURE_TRUE(serv, nullptr);
    81       NS_ASSERTION(gFaviconService, "Should have static instance pointer now");
    82     }
    83     return gFaviconService;
    84   }
    86   // addition to API for strings to prevent excessive parsing of URIs
    87   nsresult GetFaviconLinkForIconString(const nsCString& aIcon, nsIURI** aOutput);
    88   void GetFaviconSpecForIconString(const nsCString& aIcon, nsACString& aOutput);
    90   nsresult OptimizeFaviconImage(const uint8_t* aData, uint32_t aDataLen,
    91                                 const nsACString& aMimeType,
    92                                 nsACString& aNewData, nsACString& aNewMimeType);
    93   int32_t GetOptimizedIconDimension() { return mOptimizedIconDimension; }
    95   /**
    96    * Obtains the favicon data asynchronously.
    97    *
    98    * @param aFaviconURI
    99    *        The URI representing the favicon we are looking for.
   100    * @param aCallback
   101    *        The callback where results or errors will be dispatch to.  In the
   102    *        returned result, the favicon binary data will be at index 0, and the
   103    *        mime type will be at index 1.
   104    */
   105   nsresult GetFaviconDataAsync(nsIURI* aFaviconURI,
   106                                mozIStorageStatementCallback* aCallback);
   108   /**
   109    * Call to send out favicon changed notifications. Should only be called
   110    * when there is data loaded for the favicon.
   111    * @param aPageURI
   112    *        The URI of the page to notify about.
   113    * @param aFaviconURI
   114    *        The moz-anno:favicon URI of the icon.
   115    * @param aGUID
   116    *        The unique ID associated with the page.
   117    */
   118   void SendFaviconNotifications(nsIURI* aPageURI, nsIURI* aFaviconURI,
   119                                 const nsACString& aGUID);
   121   NS_DECL_ISUPPORTS
   122   NS_DECL_NSIFAVICONSERVICE
   123   NS_DECL_MOZIASYNCFAVICONS
   124   NS_DECL_NSITIMERCALLBACK
   126 private:
   127   ~nsFaviconService();
   129   nsRefPtr<mozilla::places::Database> mDB;
   131   nsCOMPtr<nsITimer> mExpireUnassociatedIconsTimer;
   133   static nsFaviconService* gFaviconService;
   135   /**
   136    * A cached URI for the default icon. We return this a lot, and don't want to
   137    * re-parse and normalize our unchanging string many times.  Important: do
   138    * not return this directly; use Clone() since callers may change the object
   139    * they get back. May be null, in which case it needs initialization.
   140    */
   141   nsCOMPtr<nsIURI> mDefaultIcon;
   143   // The target dimension, in pixels, for favicons we optimize.
   144   // If we find images that are as large or larger than an uncompressed RGBA
   145   // image of this size (mOptimizedIconDimension*mOptimizedIconDimension*4),
   146   // we will try to optimize it.
   147   int32_t mOptimizedIconDimension;
   149   uint32_t mFailedFaviconSerial;
   150   nsDataHashtable<nsCStringHashKey, uint32_t> mFailedFavicons;
   152   // AsyncFetchAndSetIconForPage needs access to the icon cache
   153   friend class mozilla::places::AsyncFetchAndSetIconForPage;
   154   friend class mozilla::places::RemoveIconDataCacheEntry;
   155   nsTHashtable<UnassociatedIconHashKey> mUnassociatedIcons;
   156 };
   158 #define FAVICON_ANNOTATION_NAME "favicon"
   160 #endif // nsFaviconService_h_

mercurial