1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_HISTORY_TOP_SITES_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_HISTORY_TOP_SITES_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <list> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <utility> 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted_memory.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h" 19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/time.h" 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/timer.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/page_usage_data.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/thumbnail_score.h" 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DictionaryValue; 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass FilePath; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TopSitesCache; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TopSitesBackend; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TopSitesTest; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Stores the data for the top "most visited" sites. This includes a cache of 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the most visited data from history, as well as the corresponding thumbnails 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of those sites. 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This class allows requests for most visited urls and thumbnails on any 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// thread. All other methods must be invoked on the UI thread. All mutations 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// to internal state happen on the UI thread and are scheduled to update the 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// db using TopSitesBackend. 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TopSites 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : public base::RefCountedThreadSafe<TopSites>, 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public NotificationObserver, 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public CancelableRequestProvider { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit TopSites(Profile* profile); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initializes TopSites. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Init(const FilePath& db_name); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the given thumbnail for the given URL. Returns true if the thumbnail 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // was updated. False means either the URL wasn't known to us, or we felt 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that our current thumbnail was superior to the given one. 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SetPageThumbnail(const GURL& url, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap& thumbnail, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ThumbnailScore& score); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback for GetMostVisitedURLs. 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef Callback1<const MostVisitedURLList&>::Type GetTopSitesCallback; 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick typedef std::set<scoped_refptr<CancelableRequest<GetTopSitesCallback> > > 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PendingCallbackSet; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns a list of most visited URLs via a callback. 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This may be invoked on any thread. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE: the callback may be called immediately if we have the data cached. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetMostVisitedURLs(CancelableRequestConsumer* consumer, 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetTopSitesCallback* callback); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get a thumbnail for a given page. Returns true iff we have the thumbnail. 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This may be invoked on any thread. 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // As this method may be invoked on any thread the ref count needs to be 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // upped before this method returns, so this takes a scoped_refptr*. 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool GetPageThumbnail(const GURL& url, 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<RefCountedBytes>* bytes); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Get a thumbnail score for a given page. Returns true iff we have the 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // thumbnail score. This may be invoked on any thread. The score will 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // be copied to |score|. 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool GetPageThumbnailScore(const GURL& url, ThumbnailScore* score); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get a temporary thumbnail score for a given page. Returns true iff we 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // have the thumbnail score. Useful when checking if we should update a 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // thumbnail for a given page. The score will be copied to |score|. 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool GetTemporaryPageThumbnailScore(const GURL& url, ThumbnailScore* score); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Invoked from History if migration is needed. If this is invoked it will 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // be before HistoryLoaded is invoked. 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MigrateFromHistory(); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Invoked with data from migrating thumbnails out of history. 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void FinishHistoryMigration(const ThumbnailMigration& data); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Invoked from history when it finishes loading. If MigrateFromHistory was 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // not invoked at this point then we load from the top sites service. 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void HistoryLoaded(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Blacklisted URLs 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns true if there is at least one item in the blacklist. 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool HasBlacklistedItems() const; 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Add a URL to the blacklist. 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AddBlacklistedURL(const GURL& url); 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Removes a URL from the blacklist. 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void RemoveBlacklistedURL(const GURL& url); 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if the URL is blacklisted. 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsBlacklisted(const GURL& url); 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Clear the blacklist. 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void ClearBlacklistedURLs(); 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Pinned URLs 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Pin a URL at |index|. 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AddPinnedURL(const GURL& url, size_t index); 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns true if a URL is pinned. 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool IsURLPinned(const GURL& url); 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Unpin a URL. 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void RemovePinnedURL(const GURL& url); 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Return a URL pinned at |index| via |out|. Returns true if there 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // is a URL pinned at |index|. 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool GetPinnedURLAtIndex(size_t index, GURL* out); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Shuts down top sites. 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void Shutdown(); 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Generates the diff of things that happened between "old" and "new." 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The URLs that are in "new" but not "old" will be have their index into 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // "new" put in |added_urls|. The URLs that are in "old" but not "new" will 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // have their index into "old" put into |deleted_urls|. 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // URLs appearing in both old and new lists but having different indices will 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // have their index into "new" be put into |moved_urls|. 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void DiffMostVisited(const MostVisitedURLList& old_list, 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const MostVisitedURLList& new_list, 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TopSitesDelta* delta); 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Query history service for the list of available thumbnails. Returns the 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // handle for the request, or NULL if a request could not be made. 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Public only for testing purposes. 153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CancelableRequestProvider::Handle StartQueryForMostVisited(); 154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool loaded() const { return loaded_; } 156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returns true if the given URL is known to the top sites service. 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This function also returns false if TopSites isn't loaded yet. 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool IsKnownURL(const GURL& url); 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returns true if the top sites list is full (i.e. we already have the 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // maximum number of top sites). This function also returns false if 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TopSites isn't loaded yet. 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool IsFull(); 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For allowing inheritance. 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual ~TopSites(); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend class base::RefCountedThreadSafe<TopSites>; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class TopSitesTest; 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::pair<GURL, Images> TempImage; 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::list<TempImage> TempImages; 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Enumeration of the possible states history can be in. 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum HistoryLoadState { 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // We're waiting for history to finish loading. 180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HISTORY_LOADING, 181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // History finished loading and we need to migrate top sites out of history. 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HISTORY_MIGRATING, 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // History is loaded. 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HISTORY_LOADED 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Enumeration of possible states the top sites backend can be in. 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum TopSitesLoadState { 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // We're waiting for the backend to finish loading. 192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TOP_SITES_LOADING, 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The backend finished loading, but we may need to migrate. This is true if 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the top sites db didn't exist, or if the db existed but is from an old 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // version. 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TOP_SITES_LOADED_WAITING_FOR_HISTORY, 198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Top sites is loaded. 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TOP_SITES_LOADED 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the thumbnail without writing to the database. Useful when 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reading last known top sites from the DB. 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the thumbnail was set, false if the existing one is better. 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SetPageThumbnailNoDB(const GURL& url, 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RefCountedBytes* thumbnail_data, 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ThumbnailScore& score); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A version of SetPageThumbnail that takes RefCountedBytes as 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returned by HistoryService. 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool SetPageThumbnailEncoded(const GURL& url, 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const RefCountedBytes* thumbnail, 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ThumbnailScore& score); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Encodes the bitmap to bytes for storage to the db. Returns true if the 217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // bitmap was successfully encoded. 218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool EncodeBitmap(const SkBitmap& bitmap, 219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<RefCountedBytes>* bytes); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Removes the cached thumbnail for url. Does nothing if |url| if not cached 222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // in |temp_images_|. 223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void RemoveTemporaryThumbnailByURL(const GURL& url); 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Add a thumbnail for an unknown url. See temp_thumbnails_map_. 226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void AddTemporaryThumbnail(const GURL& url, 227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const RefCountedBytes* thumbnail, 228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ThumbnailScore& score); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Called by our timer. Starts the query for the most visited sites. 231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void TimerFired(); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Finds the given URL in the redirect chain for the given TopSite, and 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns the distance from the destination in hops that the given URL is. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The URL is assumed to be in the list. The destination is 0. 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int GetRedirectDistanceForURL(const MostVisitedURL& most_visited, 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the set of prepopulate pages. 240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static MostVisitedURLList GetPrepopulatePages(); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Add prepopulated pages: 'welcome to Chrome' and themes gallery to |urls|. 243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if any pages were added. 244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool AddPrepopulatedPages(MostVisitedURLList* urls); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Convert pinned_urls_ dictionary to the new format. Use URLs as 247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // dictionary keys. 248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MigratePinnedURLs(); 249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Takes |urls|, produces it's copy in |out| after removing 251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // blacklisted URLs and reordering pinned URLs. 252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ApplyBlacklistAndPinnedURLs(const MostVisitedURLList& urls, 253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MostVisitedURLList* out); 2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Converts a url into a canonical string representation. 256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string GetURLString(const GURL& url); 257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns an MD5 hash of the URL. Hashing is required for blacklisted URLs. 259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string GetURLHash(const GURL& url); 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the delay until the next update of history is needed. 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Uses num_urls_changed 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta GetUpdateDelay(); 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Executes all of the callbacks in |pending_callbacks|. This is used after 266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // we finish loading if any requests came in before we loaded. 267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void ProcessPendingCallbacks( 268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const PendingCallbackSet& pending_callbacks, 269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const MostVisitedURLList& urls); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Implementation of NotificationObserver. 272513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void Observe(NotificationType type, 273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const NotificationSource& source, 274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const NotificationDetails& details); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Resets top_sites_ and updates the db (in the background). All mutations to 277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // top_sites_ *must* go through this. 278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SetTopSites(const MostVisitedURLList& new_top_sites); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the number of most visted results to request from history. This 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // changes depending upon how many urls have been blacklisted. 282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int num_results_to_request_from_history() const; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Invoked when transitioning to LOADED. Notifies any queued up callbacks. 285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MoveStateToLoaded(); 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ResetThreadSafeCache(); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ResetThreadSafeImageCache(); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Stops and starts timer with a delay of |delta|. 292513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void RestartQueryForTopSitesTimer(base::TimeDelta delta); 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Callback after TopSitesBackend has finished migration. This tells history 295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // to finish it's side of migration (nuking thumbnails on disk). 296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void OnHistoryMigrationWrittenToDisk( 297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CancelableRequestProvider::Handle handle); 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Callback from TopSites with the top sites/thumbnails. 300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void OnGotMostVisitedThumbnails(CancelableRequestProvider::Handle handle, 301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<MostVisitedThumbnails> data, 302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool may_need_history_migration); 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called when history service returns a list of top URLs. 305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void OnTopSitesAvailableFromHistory(CancelableRequestProvider::Handle handle, 306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MostVisitedURLList data); 3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<TopSitesBackend> backend_; 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The top sites data. 311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TopSitesCache> cache_; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Copy of the top sites data that may be accessed on any thread (assuming 314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // you hold |lock_|). The data in |thread_safe_cache_| has blacklisted and 315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // pinned urls applied (|cache_| does not). 316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TopSitesCache> thread_safe_cache_; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile_; 319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 320513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Lock used to access |thread_safe_cache_|. 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mutable base::Lock lock_; 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CancelableRequestConsumer cancelable_consumer_; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Timer that asks history for the top sites. This is used to make sure our 326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // data stays in sync with history. 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::OneShotTimer<TopSites> timer_; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The time we started |timer_| at. Only valid if |timer_| is running. 330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::TimeTicks timer_start_time_; 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The number of URLs changed on the last update. 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t last_num_urls_changed_; 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The map of requests for the top sites list. Can only be 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // non-empty at startup. After we read the top sites from the DB, we'll 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // always have a cached list. 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingCallbackSet pending_callbacks_; 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Stores thumbnails for unknown pages. When SetPageThumbnail is 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // called, if we don't know about that URL yet and we don't have 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // enough Top Sites (new profile), we store it until the next 345513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // SetTopSites call. 346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TempImages temp_images_; 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Blacklisted and pinned URLs are stored in Preferences. 3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Blacklisted URLs. They are filtered out from the list of Top 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Sites when GetMostVisitedURLs is called. Note that we are still 3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // storing all URLs, but filtering on access. It is a dictionary, 3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // key is the URL, value is a dummy value. This is owned by the 3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // PrefService. 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const DictionaryValue* blacklist_; 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This is a dictionary for the pinned URLs for the the most visited part of 358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the new tab page. Key is the URL, value is index where it is pinned at (may 359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // be the same as key). This is owned by the PrefService. 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const DictionaryValue* pinned_urls_; 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 362513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // See description above HistoryLoadState. 363513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HistoryLoadState history_state_; 364513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 365513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // See description above TopSitesLoadState. 366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TopSitesLoadState top_sites_state_; 367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Are we loaded? 369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool loaded_; 370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(TopSites); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace history 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_HISTORY_TOP_SITES_H_ 377