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#include "chrome/browser/history/top_sites_cache.h"
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/logging.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted_memory.h"
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace history {
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTopSitesCache::TopSitesCache() {
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
15513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTopSitesCache::~TopSitesCache() {
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::SetTopSites(const MostVisitedURLList& top_sites) {
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites_ = top_sites;
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GenerateCanonicalURLs();
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::SetThumbnails(const URLToImagesMap& images) {
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  images_ = images;
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::SetPageThumbnail(const GURL& url,
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     RefCountedBytes* thumbnail,
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     const ThumbnailScore& score) {
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Images& img = images_[GetCanonicalURL(url)];
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  img.thumbnail = thumbnail;
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  img.thumbnail_score = score;
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
35513209b27ff55e2841eac0e4120199c23acce758Ben MurdochImages* TopSitesCache::GetImage(const GURL& url) {
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return &images_[GetCanonicalURL(url)];
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool TopSitesCache::GetPageThumbnail(const GURL& url,
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     scoped_refptr<RefCountedBytes>* bytes) {
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::map<GURL, Images>::const_iterator found =
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      images_.find(GetCanonicalURL(url));
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (found != images_.end()) {
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *bytes = found->second.thumbnail.get();
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return false;
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool TopSitesCache::GetPageThumbnailScore(const GURL& url,
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                          ThumbnailScore* score) {
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::map<GURL, Images>::const_iterator found =
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      images_.find(GetCanonicalURL(url));
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (found != images_.end()) {
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    *score = found->second.thumbnail_score;
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return true;
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61513209b27ff55e2841eac0e4120199c23acce758Ben MurdochGURL TopSitesCache::GetCanonicalURL(const GURL& url) {
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CanonicalURLs::iterator i = TopSitesCache::GetCanonicalURLsIterator(url);
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return i == canonical_urls_.end() ? url : i->first.first->url;
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool TopSitesCache::IsKnownURL(const GURL& url) {
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return GetCanonicalURLsIterator(url) != canonical_urls_.end();
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdochsize_t TopSitesCache::GetURLIndex(const GURL& url) {
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(IsKnownURL(url));
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return GetCanonicalURLsIterator(url)->second;
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::RemoveUnreferencedThumbnails() {
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (URLToImagesMap::iterator i = images_.begin(); i != images_.end(); ) {
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (IsKnownURL(i->first)) {
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ++i;
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      URLToImagesMap::iterator next_i = i;
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ++next_i;
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      images_.erase(i);
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      i = next_i;
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::GenerateCanonicalURLs() {
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  canonical_urls_.clear();
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (size_t i = 0; i < top_sites_.size(); i++)
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    StoreRedirectChain(top_sites_[i].redirects, i);
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TopSitesCache::StoreRedirectChain(const RedirectList& redirects,
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       size_t destination) {
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // redirects is empty if the user pinned a site and there are not enough top
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // sites before the pinned site.
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Map all the redirected URLs to the destination.
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (size_t i = 0; i < redirects.size(); i++) {
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // If this redirect is already known, don't replace it with a new one.
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!IsKnownURL(redirects[i])) {
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CanonicalURLEntry entry;
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      entry.first = &(top_sites_[destination]);
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      entry.second = i;
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      canonical_urls_[entry] = destination;
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
111513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTopSitesCache::CanonicalURLs::iterator TopSitesCache::GetCanonicalURLsIterator(
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const GURL& url) {
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURL most_visited_url;
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  most_visited_url.redirects.push_back(url);
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CanonicalURLEntry entry;
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  entry.first = &most_visited_url;
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  entry.second = 0u;
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return canonical_urls_.find(entry);
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace history
122