1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_TOP_SITES_IMPL_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_HISTORY_TOP_SITES_IMPL_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <list>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <utility>
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/gtest_prod_util.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/synchronization/lock.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites_backend.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h"
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/history/core/browser/page_usage_data.h"
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/history/core/common/thumbnail_score.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/image/image.h"
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FilePath;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RefCountedBytes;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RefCountedMemory;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace history {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesCache;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesImplTest;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class allows requests for most visited urls and thumbnails on any
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// thread. All other methods must be invoked on the UI thread. All mutations
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to internal state happen on the UI thread and are scheduled to update the
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// db using TopSitesBackend.
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesImpl : public TopSites {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit TopSitesImpl(Profile* profile);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Initializes TopSitesImpl.
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Init(const base::FilePath& db_name);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetPageThumbnail(const GURL& url,
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                const gfx::Image& thumbnail,
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                const ThumbnailScore& score) OVERRIDE;
59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual bool SetPageThumbnailToJPEGBytes(
60a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const GURL& url,
61a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const base::RefCountedMemory* memory,
62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ThumbnailScore& score) OVERRIDE;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetMostVisitedURLs(
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GetMostVisitedURLsCallback& callback,
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bool include_forced_urls) OVERRIDE;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool GetPageThumbnail(
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const GURL& url,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      bool prefix_match,
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      scoped_refptr<base::RefCountedMemory>* bytes) OVERRIDE;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool GetPageThumbnailScore(const GURL& url,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     ThumbnailScore* score) OVERRIDE;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool GetTemporaryPageThumbnailScore(const GURL& url,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              ThumbnailScore* score) OVERRIDE;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SyncWithHistory() OVERRIDE;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool HasBlacklistedItems() const OVERRIDE;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AddBlacklistedURL(const GURL& url) OVERRIDE;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void RemoveBlacklistedURL(const GURL& url) OVERRIDE;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsBlacklisted(const GURL& url) OVERRIDE;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ClearBlacklistedURLs() OVERRIDE;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual base::CancelableTaskTracker::TaskId StartQueryForMostVisited()
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      OVERRIDE;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsKnownURL(const GURL& url) OVERRIDE;
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual const std::string& GetCanonicalURLString(
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& url) const OVERRIDE;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsNonForcedFull() OVERRIDE;
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsForcedFull() OVERRIDE;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual MostVisitedURLList GetPrepopulatePages() OVERRIDE;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool loaded() const OVERRIDE;
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool AddForcedURL(const GURL& url, const base::Time& time) OVERRIDE;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TopSitesImpl();
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class TopSitesImplTest;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisited);
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisitedWithForced);
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef base::Callback<void(const MostVisitedURLList&,
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              const MostVisitedURLList&)> PendingCallback;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::pair<GURL, Images> TempImage;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::list<TempImage> TempImages;
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::vector<PendingCallback> PendingCallbacks;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Generates the diff of things that happened between "old" and "new."
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This treats forced URLs separately than non-forced URLs.
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  //
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The URLs that are in "new" but not "old" will be have their index into
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // "new" put in |added_urls|. The non-forced URLs that are in "old" but not
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // "new" will have their index into "old" put into |deleted_urls|.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // URLs appearing in both old and new lists but having different indices will
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // have their index into "new" be put into |moved_urls|.
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void DiffMostVisited(const MostVisitedURLList& old_list,
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const MostVisitedURLList& new_list,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              TopSitesDelta* delta);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Sets the thumbnail without writing to the database. Useful when
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // reading last known top sites from the DB.
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if the thumbnail was set, false if the existing one is better.
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool SetPageThumbnailNoDB(const GURL& url,
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                            const base::RefCountedMemory* thumbnail_data,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const ThumbnailScore& score);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A version of SetPageThumbnail that takes RefCountedBytes as
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // returned by HistoryService.
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool SetPageThumbnailEncoded(const GURL& url,
131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                               const base::RefCountedMemory* thumbnail,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const ThumbnailScore& score);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Encodes the bitmap to bytes for storage to the db. Returns true if the
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // bitmap was successfully encoded.
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool EncodeBitmap(const gfx::Image& bitmap,
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           scoped_refptr<base::RefCountedBytes>* bytes);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Removes the cached thumbnail for url. Does nothing if |url| if not cached
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // in |temp_images_|.
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemoveTemporaryThumbnailByURL(const GURL& url);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a thumbnail for an unknown url. See temp_thumbnails_map_.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddTemporaryThumbnail(const GURL& url,
145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                             const base::RefCountedMemory* thumbnail,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const ThumbnailScore& score);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called by our timer. Starts the query for the most visited sites.
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TimerFired();
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Finds the given URL in the redirect chain for the given TopSite, and
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // returns the distance from the destination in hops that the given URL is.
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The URL is assumed to be in the list. The destination is 0.
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static int GetRedirectDistanceForURL(const MostVisitedURL& most_visited,
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const GURL& url);
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add prepopulated pages: 'welcome to Chrome' and themes gallery to |urls|.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if any pages were added.
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool AddPrepopulatedPages(MostVisitedURLList* urls,
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            size_t num_forced_urls);
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add all the forced URLs from |cache_| into |new_list|, making sure not to
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // add any URL that's already in |new_list|'s non-forced URLs. The forced URLs
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // in |cache_| and |new_list| are assumed to appear at the front of the list
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and be sorted in increasing |last_forced_time|. This will still be true
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // after the call. If the list of forced URLs overflows the older ones are
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // dropped. Returns the number of forced URLs after the merge.
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t MergeCachedForcedURLs(MostVisitedURLList* new_list);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Takes |urls|, produces it's copy in |out| after removing blacklisted URLs.
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Also ensures we respect the maximum number of forced URLs and non-forced
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // URLs.
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ApplyBlacklist(const MostVisitedURLList& urls, MostVisitedURLList* out);
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an MD5 hash of the URL. Hashing is required for blacklisted URLs.
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string GetURLHash(const GURL& url);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns the delay until the next update of history is needed.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Uses num_urls_changed
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeDelta GetUpdateDelay();
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Implementation of content::NotificationObserver.
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Observe(int type,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationSource& source,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Updates URLs in |cache_| and the db (in the background).
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The non-forced URLs in |new_top_sites| replace those in |cache_|.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The forced URLs of |new_top_sites| are merged with those in |cache_|,
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // if the list of forced URLs overflows, the oldest ones are dropped.
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // All mutations to cache_ *must* go through this. Should
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // be called from the UI thread.
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetTopSites(const MostVisitedURLList& new_top_sites);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the number of most visited results to request from history. This
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // changes depending upon how many urls have been blacklisted. Should be
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // called from the UI thread.
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_results_to_request_from_history() const;
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Invoked when transitioning to LOADED. Notifies any queued up callbacks.
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Should be called from the UI thread.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MoveStateToLoaded();
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetThreadSafeCache();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetThreadSafeImageCache();
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stops and starts timer with a delay of |delta|.
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RestartQueryForTopSitesTimer(base::TimeDelta delta);
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback from TopSites with the top sites/thumbnails. Should be called
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // from the UI thread.
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnGotMostVisitedThumbnails(
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const scoped_refptr<MostVisitedThumbnails>& thumbnails);
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called when history service returns a list of top URLs.
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnTopSitesAvailableFromHistory(const MostVisitedURLList* data);
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<TopSitesBackend> backend_;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The top sites data.
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TopSitesCache> cache_;
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Copy of the top sites data that may be accessed on any thread (assuming
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // you hold |lock_|). The data in |thread_safe_cache_| has blacklisted and
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pinned urls applied (|cache_| does not).
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TopSitesCache> thread_safe_cache_;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile_;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Lock used to access |thread_safe_cache_|.
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mutable base::Lock lock_;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Task tracker for history and backend requests.
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker cancelable_task_tracker_;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Timer that asks history for the top sites. This is used to make sure our
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // data stays in sync with history.
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::OneShotTimer<TopSitesImpl> timer_;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The time we started |timer_| at. Only valid if |timer_| is running.
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks timer_start_time_;
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::NotificationRegistrar registrar_;
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The number of URLs changed on the last update.
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t last_num_urls_changed_;
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The pending requests for the top sites list. Can only be non-empty at
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // startup. After we read the top sites from the DB, we'll always have a
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // cached list and be able to run callbacks immediately.
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PendingCallbacks pending_callbacks_;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stores thumbnails for unknown pages. When SetPageThumbnail is
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // called, if we don't know about that URL yet and we don't have
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // enough Top Sites (new profile), we store it until the next
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // SetNonForcedTopSites call.
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TempImages temp_images_;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // URL List of prepopulated page.
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<GURL> prepopulated_page_urls_;
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Are we loaded?
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool loaded_;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesImpl);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace history
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_HISTORY_TOP_SITES_IMPL_H_
272