Home | History | Annotate | Download | only in history
      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 
     12 namespace history {
     13 
     14 TopSitesBackend::TopSitesBackend()
     15     : db_(new TopSitesDatabase()) {
     16 }
     17 
     18 void 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 
     25 void TopSitesBackend::Shutdown() {
     26   BrowserThread::PostTask(
     27       BrowserThread::DB, FROM_HERE, NewRunnableMethod(
     28           this, &TopSitesBackend::ShutdownDBOnDBThread));
     29 }
     30 
     31 TopSitesBackend::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 
     46 void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
     47   BrowserThread::PostTask(
     48       BrowserThread::DB, FROM_HERE, NewRunnableMethod(
     49           this, &TopSitesBackend::UpdateTopSitesOnDBThread, delta));
     50 }
     51 
     52 void 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 
     61 void TopSitesBackend::ResetDatabase() {
     62   BrowserThread::PostTask(
     63       BrowserThread::DB, FROM_HERE, NewRunnableMethod(
     64           this, &TopSitesBackend::ResetDatabaseOnDBThread, db_path_));
     65 }
     66 
     67 TopSitesBackend::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 
     80 TopSitesBackend::~TopSitesBackend() {
     81   DCHECK(!db_.get());  // Shutdown should have happened first (which results in
     82                        // nulling out db).
     83 }
     84 
     85 void 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 
     93 void TopSitesBackend::ShutdownDBOnDBThread() {
     94   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
     95   db_.reset();
     96 }
     97 
     98 void 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 
    117 void 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 
    131 void 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 
    140 void 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 
    148 void TopSitesBackend::DoEmptyRequestOnDBThread(
    149     scoped_refptr<EmptyRequestRequest> request) {
    150   request->ForwardResult(EmptyRequestRequest::TupleType(request->handle()));
    151 }
    152 
    153 }  // namespace history
    154