1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/history/top_sites_backend.h"
8 #include "base/bind_helpers.h"
9 #include "base/files/file_path.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/task/cancelable_task_tracker.h"
12 #include "chrome/browser/history/top_sites_database.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "sql/connection.h"
16 using content::BrowserThread;
20 TopSitesBackend::TopSitesBackend()
21 : db_(new TopSitesDatabase()) {
24 void TopSitesBackend::Init(const base::FilePath& path) {
26 BrowserThread::PostTask(
27 BrowserThread::DB, FROM_HERE,
28 base::Bind(&TopSitesBackend::InitDBOnDBThread, this, path));
31 void TopSitesBackend::Shutdown() {
32 BrowserThread::PostTask(
33 BrowserThread::DB, FROM_HERE,
34 base::Bind(&TopSitesBackend::ShutdownDBOnDBThread, this));
37 void TopSitesBackend::GetMostVisitedThumbnails(
38 const GetMostVisitedThumbnailsCallback& callback,
39 base::CancelableTaskTracker* tracker) {
40 scoped_refptr<MostVisitedThumbnails> thumbnails = new MostVisitedThumbnails();
42 tracker->PostTaskAndReply(
43 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
45 base::Bind(&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
48 base::Bind(callback, thumbnails));
51 void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
52 BrowserThread::PostTask(
53 BrowserThread::DB, FROM_HERE,
54 base::Bind(&TopSitesBackend::UpdateTopSitesOnDBThread, this, delta));
57 void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
59 const Images& thumbnail) {
60 BrowserThread::PostTask(
61 BrowserThread::DB, FROM_HERE,
62 base::Bind(&TopSitesBackend::SetPageThumbnailOnDBThread, this, url,
63 url_rank, thumbnail));
66 void TopSitesBackend::ResetDatabase() {
67 BrowserThread::PostTask(
68 BrowserThread::DB, FROM_HERE,
69 base::Bind(&TopSitesBackend::ResetDatabaseOnDBThread, this, db_path_));
72 void TopSitesBackend::DoEmptyRequest(const base::Closure& reply,
73 base::CancelableTaskTracker* tracker) {
74 tracker->PostTaskAndReply(
75 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
77 base::Bind(&base::DoNothing),
81 TopSitesBackend::~TopSitesBackend() {
82 DCHECK(!db_); // Shutdown should have happened first (which results in
86 void TopSitesBackend::InitDBOnDBThread(const base::FilePath& path) {
87 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
88 if (!db_->Init(path)) {
89 LOG(ERROR) << "Failed to initialize database.";
94 void TopSitesBackend::ShutdownDBOnDBThread() {
95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
99 void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
100 scoped_refptr<MostVisitedThumbnails> thumbnails) {
101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
104 db_->GetPageThumbnails(&(thumbnails->most_visited),
105 &(thumbnails->url_to_images_map));
109 void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
113 for (size_t i = 0; i < delta.deleted.size(); ++i)
114 db_->RemoveURL(delta.deleted[i]);
116 for (size_t i = 0; i < delta.added.size(); ++i)
117 db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
119 for (size_t i = 0; i < delta.moved.size(); ++i)
120 db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
123 void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
125 const Images& thumbnail) {
129 db_->SetPageThumbnail(url, url_rank, thumbnail);
132 void TopSitesBackend::ResetDatabaseOnDBThread(const base::FilePath& file_path) {
133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
135 sql::Connection::Delete(db_path_);
136 db_.reset(new TopSitesDatabase());
137 InitDBOnDBThread(db_path_);
140 } // namespace history