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