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