15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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/browsing_data/browsing_data_database_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/database/database_identifier.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::DatabaseIdentifier;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo(
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DatabaseIdentifier& identifier,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& database_name,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& description,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 size,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time last_modified)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : identifier(identifier),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      database_name(database_name),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      description(description),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size(size),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_modified(last_modified) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : is_fetching_(false),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracker_(BrowserContext::
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GetDefaultStoragePartition(profile)->GetDatabaseTracker()) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataDatabaseHelper::StartFetching(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(const std::list<DatabaseInfo>&)>& callback) {
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!is_fetching_);
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!callback.is_null());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = true;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  database_info_.clear();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_ = callback;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataDatabaseHelper::FetchDatabaseInfoOnFileThread,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 this));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const std::string& name) {
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataDatabaseHelper::DeleteDatabaseOnFileThread, this,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 origin, name));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataDatabaseHelper::FetchDatabaseInfoOnFileThread() {
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::OriginInfo> origins_info;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) {
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    for (std::vector<storage::OriginInfo>::const_iterator ori =
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)             origins_info.begin();
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         ori != origins_info.end();
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         ++ori) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DatabaseIdentifier identifier =
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          DatabaseIdentifier::Parse(ori->GetOriginIdentifier());
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (!BrowsingDataHelper::HasWebScheme(identifier.ToOrigin())) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Non-websafe state is not considered browsing data.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::vector<base::string16> databases;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ori->GetAllDatabaseNames(&databases);
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (std::vector<base::string16>::const_iterator db = databases.begin();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           db != databases.end(); ++db) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath file_path =
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            tracker_->GetFullDBFilePath(ori->GetOriginIdentifier(), *db);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::File::Info file_info;
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (base::GetFileInfo(file_path, &file_info)) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          database_info_.push_back(DatabaseInfo(
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                identifier,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF16ToUTF8(*db),
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF16ToUTF8(ori->GetDatabaseDescription(*db)),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file_info.size,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file_info.last_modified));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataDatabaseHelper::NotifyInUIThread, this));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataDatabaseHelper::NotifyInUIThread() {
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_fetching_);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Run(database_info_);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Reset();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = false;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  database_info_.clear();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataDatabaseHelper::DeleteDatabaseOnFileThread(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& origin,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name) {
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!tracker_.get())
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tracker_->DeleteDatabase(origin, base::UTF8ToUTF16(name),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           net::CompletionCallback());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& description)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : origin(origin),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name(name),
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      description(description) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::operator<(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PendingDatabaseInfo& other) const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin == other.origin)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return name < other.name;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return origin < other.origin;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile)
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : BrowsingDataDatabaseHelper(profile) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataDatabaseHelper::AddDatabase(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& description) {
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowsingDataHelper::HasWebScheme(origin)) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_database_info_.insert(PendingDatabaseInfo(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          origin, name, description));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataDatabaseHelper::Reset() {
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_database_info_.clear();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataDatabaseHelper::empty() const {
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pending_database_info_.empty();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t CannedBrowsingDataDatabaseHelper::GetDatabaseCount() const {
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pending_database_info_.size();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::set<CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo>&
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataDatabaseHelper::GetPendingDatabaseInfo() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pending_database_info_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataDatabaseHelper::StartFetching(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(const std::list<DatabaseInfo>&)>& callback) {
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!callback.is_null());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::list<DatabaseInfo> result;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<PendingDatabaseInfo>::const_iterator
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       info = pending_database_info_.begin();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       info != pending_database_info_.end(); ++info) {
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DatabaseIdentifier identifier =
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        DatabaseIdentifier::CreateFromOrigin(info->origin);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result.push_back(DatabaseInfo(
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        identifier,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        info->name,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        info->description,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Time()));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserThread::UI, FROM_HERE, base::Bind(callback, result));
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CannedBrowsingDataDatabaseHelper::DeleteDatabase(
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& origin_identifier,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& name) {
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL origin =
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::DatabaseIdentifier::Parse(origin_identifier).ToOrigin();
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (std::set<PendingDatabaseInfo>::iterator it =
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           pending_database_info_.begin();
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != pending_database_info_.end();
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (it->origin == origin && it->name == name) {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pending_database_info_.erase(it);
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowsingDataDatabaseHelper::DeleteDatabase(origin_identifier, name);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCannedBrowsingDataDatabaseHelper::~CannedBrowsingDataDatabaseHelper() {}
226