blob: d01af3cdb3e51427f597371d6daaffd55cafde9b [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_HISTORY_TOP_SITES_H_
#define CHROME_BROWSER_HISTORY_TOP_SITES_H_
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/common/cancelable_request.h"
#include "chrome/browser/history/history_service.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/common/thumbnail_score.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/image/image.h"
class GURL;
class Profile;
namespace base {
class FilePath;
class RefCountedBytes;
class RefCountedMemory;
}
namespace history {
class TopSitesCache;
// Interface for TopSites, which stores the data for the top "most visited"
// sites. This includes a cache of the most visited data from history, as well
// as the corresponding thumbnails of those sites.
//
// Some methods should only be called from the UI thread (see method
// descriptions below). All others are assumed to be threadsafe.
class TopSites
: public base::RefCountedThreadSafe<TopSites>,
public content::NotificationObserver {
public:
TopSites() {}
// Initializes TopSites.
static TopSites* Create(Profile* profile, const base::FilePath& db_name);
// Sets the given thumbnail for the given URL. Returns true if the thumbnail
// was updated. False means either the URL wasn't known to us, or we felt
// that our current thumbnail was superior to the given one. Should be called
// from the UI thread.
virtual bool SetPageThumbnail(const GURL& url,
const gfx::Image& thumbnail,
const ThumbnailScore& score) = 0;
// While testing the history system, we want to set the thumbnail to a piece
// of static memory.
virtual bool SetPageThumbnailToJPEGBytes(
const GURL& url,
const base::RefCountedMemory* memory,
const ThumbnailScore& score) = 0;
typedef base::Callback<void(const MostVisitedURLList&)>
GetMostVisitedURLsCallback;
// Returns a list of most visited URLs via a callback, if
// |include_forced_urls| is false includes only non-forced URLs. This may be
// invoked on any thread. NOTE: the callback is called immediately if we have
// the data cached. If data is not available yet, callback will later be
// posted to the thread called this function.
virtual void GetMostVisitedURLs(
const GetMostVisitedURLsCallback& callback,
bool include_forced_urls) = 0;
// Gets a thumbnail for a given page. Returns true iff we have the thumbnail.
// This may be invoked on any thread.
// If an exact thumbnail URL match fails, |prefix_match| specifies whether or
// not to try harder by matching the query thumbnail URL as URL prefix (as
// defined by UrlIsPrefix()).
// As this method may be invoked on any thread the ref count needs to be
// incremented before this method returns, so this takes a scoped_refptr*.
virtual bool GetPageThumbnail(
const GURL& url,
bool prefix_match,
scoped_refptr<base::RefCountedMemory>* bytes) = 0;
// Get a thumbnail score for a given page. Returns true iff we have the
// thumbnail score. This may be invoked on any thread. The score will
// be copied to |score|.
virtual bool GetPageThumbnailScore(const GURL& url,
ThumbnailScore* score) = 0;
// Get a temporary thumbnail score for a given page. Returns true iff we
// have the thumbnail score. Useful when checking if we should update a
// thumbnail for a given page. The score will be copied to |score|.
virtual bool GetTemporaryPageThumbnailScore(const GURL& url,
ThumbnailScore* score) = 0;
// Asks TopSites to refresh what it thinks the top sites are. This may do
// nothing. Should be called from the UI thread.
virtual void SyncWithHistory() = 0;
// Blacklisted URLs
// Returns true if there is at least one item in the blacklist.
virtual bool HasBlacklistedItems() const = 0;
// Add a URL to the blacklist. Should be called from the UI thread.
virtual void AddBlacklistedURL(const GURL& url) = 0;
// Removes a URL from the blacklist. Should be called from the UI thread.
virtual void RemoveBlacklistedURL(const GURL& url) = 0;
// Returns true if the URL is blacklisted. Should be called from the UI
// thread.
virtual bool IsBlacklisted(const GURL& url) = 0;
// Clear the blacklist. Should be called from the UI thread.
virtual void ClearBlacklistedURLs() = 0;
// Shuts down top sites.
virtual void Shutdown() = 0;
// Query history service for the list of available thumbnails. Returns the
// handle for the request, or NULL if a request could not be made.
// Public only for testing purposes.
virtual CancelableRequestProvider::Handle StartQueryForMostVisited() = 0;
// Returns true if the given URL is known to the top sites service.
// This function also returns false if TopSites isn't loaded yet.
virtual bool IsKnownURL(const GURL& url) = 0;
// Follows the cached redirect chain to convert any URL to its
// canonical version. If no redirect chain is known for the URL,
// return it without modification.
virtual const std::string& GetCanonicalURLString(const GURL& url) const = 0;
// Returns true if the top sites list of non-forced URLs is full (i.e. we
// already have the maximum number of non-forced top sites). This function
// also returns false if TopSites isn't loaded yet.
virtual bool IsNonForcedFull() = 0;
// Returns true if the top sites list of forced URLs is full (i.e. we already
// have the maximum number of forced top sites). This function also returns
// false if TopSites isn't loaded yet.
virtual bool IsForcedFull() = 0;
virtual bool loaded() const = 0;
// Returns the set of prepopulate pages.
virtual MostVisitedURLList GetPrepopulatePages() = 0;
// Adds or updates a |url| for which we should force the capture of a
// thumbnail next time it's visited. If there is already a non-forced URL
// matching this |url| this call has no effect. Indicate this URL was laste
// forced at |time| so we can evict the older URLs when needed. Should be
// called from the UI thread.
virtual bool AddForcedURL(const GURL& url, const base::Time& time) = 0;
struct PrepopulatedPage {
// The string resource for the url.
int url_id;
// The string resource for the page title.
int title_id;
// The raw data resource for the favicon.
int favicon_id;
// The raw data resource for the thumbnail.
int thumbnail_id;
// The best color to highlight the page (should roughly match favicon).
SkColor color;
};
protected:
virtual ~TopSites() {}
private:
friend class base::RefCountedThreadSafe<TopSites>;
};
#if defined(OS_ANDROID)
extern const TopSites::PrepopulatedPage kPrepopulatedPages[1];
#else
extern const TopSites::PrepopulatedPage kPrepopulatedPages[2];
#endif
} // namespace history
#endif // CHROME_BROWSER_HISTORY_TOP_SITES_H_