15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TopSitesCache caches the top sites and thumbnails for TopSites.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSitesCache {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesCache();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TopSitesCache();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The top sites.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTopSites(const MostVisitedURLList& top_sites);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MostVisitedURLList& top_sites() const { return top_sites_; }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The thumbnails.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetThumbnails(const URLToImagesMap& images);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const URLToImagesMap& images() const { return images_; }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the thumbnail as an Image for the specified url. This adds an entry
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for |url| if one has not yet been added.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Images* GetImage(const GURL& url);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetches the thumbnail for the specified url. Returns true if there is a
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thumbnail for the specified url. It is possible for a URL to be in TopSites
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but not have an thumbnail.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPageThumbnail(const GURL& url,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        scoped_refptr<base::RefCountedMemory>* bytes);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetches the thumbnail score for the specified url. Returns true if
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there is a thumbnail score for the specified url.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPageThumbnailScore(const GURL& url, ThumbnailScore* score);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the canonical URL for |url|.
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const GURL& GetCanonicalURL(const GURL& url);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if |url| is known.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsKnownURL(const GURL& url);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the index into |top_sites_| for |url|.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t GetURLIndex(const GURL& url);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The entries in CanonicalURLs, see CanonicalURLs for details. The second
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // argument gives the index of the URL into MostVisitedURLs redirects.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<MostVisitedURL*, size_t> CanonicalURLEntry;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Comparator used for CanonicalURLs.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class CanonicalURLComparator {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool operator()(const CanonicalURLEntry& e1,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const CanonicalURLEntry& e2) const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return e1.first->redirects[e1.second] < e2.first->redirects[e2.second];
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used to map from redirect url to the MostVisitedURL the redirect is
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from. Ideally this would be map<GURL, size_t> (second param indexing into
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top_sites_), but this results in duplicating all redirect urls. As some
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sites have a lot of redirects, we instead use the MostVisitedURL* and the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // index of the redirect as the key, and the index into top_sites_ as the
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value. This way we aren't duplicating GURLs. CanonicalURLComparator
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enforces the ordering as if we were using GURLs.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<CanonicalURLEntry, size_t,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   CanonicalURLComparator> CanonicalURLs;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates the set of canonical urls from |top_sites_|.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GenerateCanonicalURLs();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores a set of redirects. This is used by GenerateCanonicalURLs.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StoreRedirectChain(const RedirectList& redirects, size_t destination);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the iterator into canconical_urls_ for the specified url.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CanonicalURLs::iterator GetCanonicalURLsIterator(const GURL& url);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The top sites.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList top_sites_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The images. These map from canonical url to image.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLToImagesMap images_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generated from the redirects to and from the most visited pages. See
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // description above typedef for details.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CanonicalURLs canonical_urls_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesCache);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
102