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