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