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