15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_backend.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_database.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sql/connection.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TopSitesBackend::TopSitesBackend()
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : db_(new TopSitesDatabase()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::Init(const base::FilePath& path) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_path_ = path;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::InitDBOnDBThread, this, path));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::Shutdown() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::ShutdownDBOnDBThread, this));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::GetMostVisitedThumbnails(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GetMostVisitedThumbnailsCallback& callback,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::CancelableTaskTracker* tracker) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MostVisitedThumbnails> thumbnails = new MostVisitedThumbnails();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker->PostTaskAndReply(
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 this,
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 thumbnails),
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(callback, thumbnails));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::UpdateTopSitesOnDBThread, this, delta));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int url_rank,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const Images& thumbnail) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::SetPageThumbnailOnDBThread, this, url,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 url_rank, thumbnail));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::ResetDatabase() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::ResetDatabaseOnDBThread, this, db_path_));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::DoEmptyRequest(const base::Closure& reply,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::CancelableTaskTracker* tracker) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker->PostTaskAndReply(
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DoNothing),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TopSitesBackend::~TopSitesBackend() {
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DCHECK(!db_);  // Shutdown should have happened first (which results in
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 // nulling out db).
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::InitDBOnDBThread(const base::FilePath& path) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!db_->Init(path)) {
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    LOG(ERROR) << "Failed to initialize database.";
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_.reset();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::ShutdownDBOnDBThread() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_refptr<MostVisitedThumbnails> thumbnails) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (db_) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->GetPageThumbnails(&(thumbnails->most_visited),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           &(thumbnails->url_to_images_map));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!db_)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.deleted.size(); ++i)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->RemoveURL(delta.deleted[i]);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.added.size(); ++i)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.moved.size(); ++i)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int url_rank,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const Images& thumbnail) {
126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!db_)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_->SetPageThumbnail(url, url_rank, thumbnail);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::ResetDatabaseOnDBThread(const base::FilePath& file_path) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset(NULL);
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sql::Connection::Delete(db_path_);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset(new TopSitesDatabase());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitDBOnDBThread(db_path_);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
141