top_sites_backend.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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.
4
5#include "chrome/browser/history/top_sites_backend.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/files/file_path.h"
10#include "base/memory/ref_counted.h"
11#include "chrome/browser/history/top_sites_database.h"
12#include "chrome/common/cancelable_task_tracker.h"
13#include "content/public/browser/browser_thread.h"
14
15using content::BrowserThread;
16
17namespace history {
18
19TopSitesBackend::TopSitesBackend()
20    : db_(new TopSitesDatabase()) {
21}
22
23void TopSitesBackend::Init(const base::FilePath& path) {
24  db_path_ = path;
25  BrowserThread::PostTask(
26      BrowserThread::DB, FROM_HERE,
27      base::Bind(&TopSitesBackend::InitDBOnDBThread, this, path));
28}
29
30void TopSitesBackend::Shutdown() {
31  BrowserThread::PostTask(
32      BrowserThread::DB, FROM_HERE,
33      base::Bind(&TopSitesBackend::ShutdownDBOnDBThread, this));
34}
35
36void TopSitesBackend::GetMostVisitedThumbnails(
37      const GetMostVisitedThumbnailsCallback& callback,
38      CancelableTaskTracker* tracker) {
39  scoped_refptr<MostVisitedThumbnails> thumbnails = new MostVisitedThumbnails();
40  bool* need_history_migration = new bool(false);
41
42  tracker->PostTaskAndReply(
43      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
44      FROM_HERE,
45      base::Bind(&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
46                 this,
47                 thumbnails,
48                 need_history_migration),
49      base::Bind(callback, thumbnails, base::Owned(need_history_migration)));
50}
51
52void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
53  BrowserThread::PostTask(
54      BrowserThread::DB, FROM_HERE,
55      base::Bind(&TopSitesBackend::UpdateTopSitesOnDBThread, this, delta));
56}
57
58void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
59                                       int url_rank,
60                                       const Images& thumbnail) {
61  BrowserThread::PostTask(
62      BrowserThread::DB, FROM_HERE,
63      base::Bind(&TopSitesBackend::SetPageThumbnailOnDBThread, this, url,
64                 url_rank, thumbnail));
65}
66
67void TopSitesBackend::ResetDatabase() {
68  BrowserThread::PostTask(
69      BrowserThread::DB, FROM_HERE,
70      base::Bind(&TopSitesBackend::ResetDatabaseOnDBThread, this, db_path_));
71}
72
73void TopSitesBackend::DoEmptyRequest(const base::Closure& reply,
74                                     CancelableTaskTracker* tracker) {
75  tracker->PostTaskAndReply(
76      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
77      FROM_HERE,
78      base::Bind(&base::DoNothing),
79      reply);
80}
81
82TopSitesBackend::~TopSitesBackend() {
83  DCHECK(!db_);  // Shutdown should have happened first (which results in
84                 // nulling out db).
85}
86
87void TopSitesBackend::InitDBOnDBThread(const base::FilePath& path) {
88  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
89  if (!db_->Init(path)) {
90    NOTREACHED() << "Failed to initialize database.";
91    db_.reset();
92  }
93}
94
95void TopSitesBackend::ShutdownDBOnDBThread() {
96  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
97  db_.reset();
98}
99
100void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
101    scoped_refptr<MostVisitedThumbnails> thumbnails,
102    bool* need_history_migration) {
103  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
104
105  *need_history_migration = false;
106  if (db_) {
107    db_->GetPageThumbnails(&(thumbnails->most_visited),
108                           &(thumbnails->url_to_images_map));
109    *need_history_migration = db_->may_need_history_migration();
110  }
111}
112
113void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
114  if (!db_)
115    return;
116
117  for (size_t i = 0; i < delta.deleted.size(); ++i)
118    db_->RemoveURL(delta.deleted[i]);
119
120  for (size_t i = 0; i < delta.added.size(); ++i)
121    db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
122
123  for (size_t i = 0; i < delta.moved.size(); ++i)
124    db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
125}
126
127void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
128                                                 int url_rank,
129                                                 const Images& thumbnail) {
130  if (!db_)
131    return;
132
133  db_->SetPageThumbnail(url, url_rank, thumbnail);
134}
135
136void TopSitesBackend::ResetDatabaseOnDBThread(const base::FilePath& file_path) {
137  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
138  db_.reset(NULL);
139  sql::Connection::Delete(db_path_);
140  db_.reset(new TopSitesDatabase());
141  InitDBOnDBThread(db_path_);
142}
143
144}  // namespace history
145