Home | History | Annotate | Download | only in history
      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 #include "chrome/browser/history/top_sites_cache.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/memory/ref_counted_memory.h"
      9 
     10 namespace history {
     11 
     12 TopSitesCache::TopSitesCache() {
     13 }
     14 
     15 TopSitesCache::~TopSitesCache() {
     16 }
     17 
     18 void TopSitesCache::SetTopSites(const MostVisitedURLList& top_sites) {
     19   top_sites_ = top_sites;
     20   GenerateCanonicalURLs();
     21 }
     22 
     23 void TopSitesCache::SetThumbnails(const URLToImagesMap& images) {
     24   images_ = images;
     25 }
     26 
     27 void TopSitesCache::SetPageThumbnail(const GURL& url,
     28                                      RefCountedBytes* thumbnail,
     29                                      const ThumbnailScore& score) {
     30   Images& img = images_[GetCanonicalURL(url)];
     31   img.thumbnail = thumbnail;
     32   img.thumbnail_score = score;
     33 }
     34 
     35 Images* TopSitesCache::GetImage(const GURL& url) {
     36   return &images_[GetCanonicalURL(url)];
     37 }
     38 
     39 bool TopSitesCache::GetPageThumbnail(const GURL& url,
     40                                      scoped_refptr<RefCountedBytes>* bytes) {
     41   std::map<GURL, Images>::const_iterator found =
     42       images_.find(GetCanonicalURL(url));
     43   if (found != images_.end()) {
     44     *bytes = found->second.thumbnail.get();
     45     return true;
     46   }
     47   return false;
     48 }
     49 
     50 bool TopSitesCache::GetPageThumbnailScore(const GURL& url,
     51                                           ThumbnailScore* score) {
     52   std::map<GURL, Images>::const_iterator found =
     53       images_.find(GetCanonicalURL(url));
     54   if (found != images_.end()) {
     55     *score = found->second.thumbnail_score;
     56     return true;
     57   }
     58   return false;
     59 }
     60 
     61 GURL TopSitesCache::GetCanonicalURL(const GURL& url) {
     62   CanonicalURLs::iterator i = TopSitesCache::GetCanonicalURLsIterator(url);
     63   return i == canonical_urls_.end() ? url : i->first.first->url;
     64 }
     65 
     66 bool TopSitesCache::IsKnownURL(const GURL& url) {
     67   return GetCanonicalURLsIterator(url) != canonical_urls_.end();
     68 }
     69 
     70 size_t TopSitesCache::GetURLIndex(const GURL& url) {
     71   DCHECK(IsKnownURL(url));
     72   return GetCanonicalURLsIterator(url)->second;
     73 }
     74 
     75 void TopSitesCache::RemoveUnreferencedThumbnails() {
     76   for (URLToImagesMap::iterator i = images_.begin(); i != images_.end(); ) {
     77     if (IsKnownURL(i->first)) {
     78       ++i;
     79     } else {
     80       URLToImagesMap::iterator next_i = i;
     81       ++next_i;
     82       images_.erase(i);
     83       i = next_i;
     84     }
     85   }
     86 }
     87 
     88 void TopSitesCache::GenerateCanonicalURLs() {
     89   canonical_urls_.clear();
     90   for (size_t i = 0; i < top_sites_.size(); i++)
     91     StoreRedirectChain(top_sites_[i].redirects, i);
     92 }
     93 
     94 void TopSitesCache::StoreRedirectChain(const RedirectList& redirects,
     95                                        size_t destination) {
     96   // redirects is empty if the user pinned a site and there are not enough top
     97   // sites before the pinned site.
     98 
     99   // Map all the redirected URLs to the destination.
    100   for (size_t i = 0; i < redirects.size(); i++) {
    101     // If this redirect is already known, don't replace it with a new one.
    102     if (!IsKnownURL(redirects[i])) {
    103       CanonicalURLEntry entry;
    104       entry.first = &(top_sites_[destination]);
    105       entry.second = i;
    106       canonical_urls_[entry] = destination;
    107     }
    108   }
    109 }
    110 
    111 TopSitesCache::CanonicalURLs::iterator TopSitesCache::GetCanonicalURLsIterator(
    112     const GURL& url) {
    113   MostVisitedURL most_visited_url;
    114   most_visited_url.redirects.push_back(url);
    115   CanonicalURLEntry entry;
    116   entry.first = &most_visited_url;
    117   entry.second = 0u;
    118   return canonical_urls_.find(entry);
    119 }
    120 
    121 }  // namespace history
    122