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