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