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"
15 using content::BrowserThread;
19 TopSitesBackend::TopSitesBackend()
20 : db_(new TopSitesDatabase()) {
23 void TopSitesBackend::Init(const base::FilePath& path) {
25 BrowserThread::PostTask(
26 BrowserThread::DB, FROM_HERE,
27 base::Bind(&TopSitesBackend::InitDBOnDBThread, this, path));
30 void TopSitesBackend::Shutdown() {
31 BrowserThread::PostTask(
32 BrowserThread::DB, FROM_HERE,
33 base::Bind(&TopSitesBackend::ShutdownDBOnDBThread, this));
36 void TopSitesBackend::GetMostVisitedThumbnails(
37 const GetMostVisitedThumbnailsCallback& callback,
38 base::CancelableTaskTracker* tracker) {
39 scoped_refptr<MostVisitedThumbnails> thumbnails = new MostVisitedThumbnails();
41 tracker->PostTaskAndReply(
42 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
44 base::Bind(&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
47 base::Bind(callback, thumbnails));
50 void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
51 BrowserThread::PostTask(
52 BrowserThread::DB, FROM_HERE,
53 base::Bind(&TopSitesBackend::UpdateTopSitesOnDBThread, this, delta));
56 void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
58 const Images& thumbnail) {
59 BrowserThread::PostTask(
60 BrowserThread::DB, FROM_HERE,
61 base::Bind(&TopSitesBackend::SetPageThumbnailOnDBThread, this, url,
62 url_rank, thumbnail));
65 void TopSitesBackend::ResetDatabase() {
66 BrowserThread::PostTask(
67 BrowserThread::DB, FROM_HERE,
68 base::Bind(&TopSitesBackend::ResetDatabaseOnDBThread, this, db_path_));
71 void TopSitesBackend::DoEmptyRequest(const base::Closure& reply,
72 base::CancelableTaskTracker* tracker) {
73 tracker->PostTaskAndReply(
74 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
76 base::Bind(&base::DoNothing),
80 TopSitesBackend::~TopSitesBackend() {
81 DCHECK(!db_); // Shutdown should have happened first (which results in
85 void TopSitesBackend::InitDBOnDBThread(const base::FilePath& path) {
86 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
87 if (!db_->Init(path)) {
88 LOG(ERROR) << "Failed to initialize database.";
93 void TopSitesBackend::ShutdownDBOnDBThread() {
94 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
98 void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
99 scoped_refptr<MostVisitedThumbnails> thumbnails) {
100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
103 db_->GetPageThumbnails(&(thumbnails->most_visited),
104 &(thumbnails->url_to_images_map));
108 void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
112 for (size_t i = 0; i < delta.deleted.size(); ++i)
113 db_->RemoveURL(delta.deleted[i]);
115 for (size_t i = 0; i < delta.added.size(); ++i)
116 db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
118 for (size_t i = 0; i < delta.moved.size(); ++i)
119 db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
122 void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
124 const Images& thumbnail) {
128 db_->SetPageThumbnail(url, url_rank, thumbnail);
131 void TopSitesBackend::ResetDatabaseOnDBThread(const base::FilePath& file_path) {
132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
134 sql::Connection::Delete(db_path_);
135 db_.reset(new TopSitesDatabase());
136 InitDBOnDBThread(db_path_);
139 } // namespace history