1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#pragma once
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <algorithm>
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <map>
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <string>
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/history_types.h"
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass RefCountedBytes;
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace history {
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TopSitesCache caches the top sites and thumbnails for TopSites.
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TopSitesCache {
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesCache();
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~TopSitesCache();
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The top sites.
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetTopSites(const MostVisitedURLList& top_sites);
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const MostVisitedURLList& top_sites() const { return top_sites_; }
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The thumbnails.
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetThumbnails(const URLToImagesMap& images);
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const URLToImagesMap& images() const { return images_; }
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Set a thumbnail.
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetPageThumbnail(const GURL& url,
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        RefCountedBytes* thumbnail,
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const ThumbnailScore& score);
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns the thumbnail as an Image for the specified url. This adds an entry
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // for |url| if one has not yet been added.
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Images* GetImage(const GURL& url);
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Fetches the thumbnail for the specified url. Returns true if there is a
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // thumbnail for the specified url.
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool GetPageThumbnail(const GURL& url,
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        scoped_refptr<RefCountedBytes>* bytes);
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Fetches the thumbnail score for the specified url. Returns true if
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // there is a thumbnail score for the specified url.
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool GetPageThumbnailScore(const GURL& url, ThumbnailScore* score);
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns the canonical URL for |url|.
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL GetCanonicalURL(const GURL& url);
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if |url| is known.
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool IsKnownURL(const GURL& url);
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns the index into |top_sites_| for |url|.
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  size_t GetURLIndex(const GURL& url);
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Removes any thumbnails that are no longer referenced by the top sites.
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RemoveUnreferencedThumbnails();
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The entries in CanonicalURLs, see CanonicalURLs for details. The second
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // argument gives the index of the URL into MostVisitedURLs redirects.
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  typedef std::pair<MostVisitedURL*, size_t> CanonicalURLEntry;
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Comparator used for CanonicalURLs.
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class CanonicalURLComparator {
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool operator()(const CanonicalURLEntry& e1,
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    const CanonicalURLEntry& e2) const {
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return e1.first->redirects[e1.second] < e2.first->redirects[e2.second];
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This is used to map from redirect url to the MostVisitedURL the redirect is
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // from. Ideally this would be map<GURL, size_t> (second param indexing into
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // top_sites_), but this results in duplicating all redirect urls. As some
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // sites have a lot of redirects, we instead use the MostVisitedURL* and the
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // index of the redirect as the key, and the index into top_sites_ as the
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // value. This way we aren't duplicating GURLs. CanonicalURLComparator
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // enforces the ordering as if we were using GURLs.
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  typedef std::map<CanonicalURLEntry, size_t,
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                   CanonicalURLComparator> CanonicalURLs;
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Generates the set of canonical urls from |top_sites_|.
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void GenerateCanonicalURLs();
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Stores a set of redirects. This is used by GenerateCanonicalURLs.
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void StoreRedirectChain(const RedirectList& redirects, size_t destination);
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns the iterator into canconical_urls_ for the specified url.
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CanonicalURLs::iterator GetCanonicalURLsIterator(const GURL& url);
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The top sites.
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList top_sites_;
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The images. These map from canonical url to image.
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  URLToImagesMap images_;
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Generated from the redirects to and from the most visited pages. See
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // description above typedef for details.
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CanonicalURLs canonical_urls_;
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TopSitesCache);
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace history
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif  // CHROME_BROWSER_HISTORY_TOP_SITES_CACHE_H_
113