172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_database_helper.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing WebKit::WebSecurityOrigin;
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo()
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : size(0) {
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo(
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& host,
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& database_name,
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& origin_identifier,
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& description,
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& origin,
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int64 size,
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    base::Time last_modified)
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : host(host),
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      database_name(database_name),
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      origin_identifier(origin_identifier),
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      description(description),
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      origin(origin),
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      size(size),
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      last_modified(last_modified) {
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {}
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() {
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return StartsWithASCII(origin_identifier,
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                         std::string(chrome::kFileScheme),
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                         true);
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile)
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : completion_callback_(NULL),
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_fetching_(false),
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tracker_(profile->GetDatabaseTracker()) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataDatabaseHelper::StartFetching(
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!is_fetching_);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(callback);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  is_fetching_ = true;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  database_info_.clear();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  completion_callback_.reset(callback);
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread));
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataDatabaseHelper::CancelNotification() {
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  completion_callback_.reset(NULL);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                const std::string& name) {
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this, &BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread, origin,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread() {
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<webkit_database::OriginInfo> origins_info;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (std::vector<webkit_database::OriginInfo>::const_iterator ori =
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         origins_info.begin(); ori != origins_info.end(); ++ori) {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin()));
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (StartsWithASCII(origin_identifier,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          std::string(chrome::kExtensionScheme),
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          true)) {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Extension state is not considered browsing data.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        continue;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      WebSecurityOrigin web_security_origin =
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          WebSecurityOrigin::createFromDatabaseIdentifier(
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              ori->GetOrigin());
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::vector<string16> databases;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ori->GetAllDatabaseNames(&databases);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      for (std::vector<string16>::const_iterator db = databases.begin();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           db != databases.end(); ++db) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        FilePath file_path = tracker_->GetFullDBFilePath(ori->GetOrigin(), *db);
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::PlatformFileInfo file_info;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (file_util::GetFileInfo(file_path, &file_info)) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          database_info_.push_back(DatabaseInfo(
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                web_security_origin.host().utf8(),
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                UTF16ToUTF8(*db),
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                origin_identifier,
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                UTF16ToUTF8(ori->GetDatabaseDescription(*db)),
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                web_security_origin.toString().utf8(),
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                file_info.size,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                file_info.last_modified));
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      this, &BrowsingDataDatabaseHelper::NotifyInUIThread));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataDatabaseHelper::NotifyInUIThread() {
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(is_fetching_);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note: completion_callback_ mutates only in the UI thread, so it's safe to
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // test it here.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (completion_callback_ != NULL) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    completion_callback_->Run(database_info_);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    completion_callback_.reset();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  is_fetching_ = false;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  database_info_.clear();
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread(
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& origin,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& name) {
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!tracker_.get())
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo() {}
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo(
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& origin,
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& name,
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& description)
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : origin(origin),
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      name(name),
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      description(description) {
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {}
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper(
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile)
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : BrowsingDataDatabaseHelper(profile),
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      profile_(profile) {
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCannedBrowsingDataDatabaseHelper* CannedBrowsingDataDatabaseHelper::Clone() {
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CannedBrowsingDataDatabaseHelper* clone =
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new CannedBrowsingDataDatabaseHelper(profile_);
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::AutoLock auto_lock(lock_);
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  clone->pending_database_info_ = pending_database_info_;
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  clone->database_info_ = database_info_;
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return clone;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataDatabaseHelper::AddDatabase(
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& origin,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& name,
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& description) {
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock auto_lock(lock_);
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pending_database_info_.push_back(PendingDatabaseInfo(
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        origin, name, description));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataDatabaseHelper::Reset() {
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock auto_lock(lock_);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  database_info_.clear();
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pending_database_info_.clear();
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CannedBrowsingDataDatabaseHelper::empty() const {
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock auto_lock(lock_);
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return database_info_.empty() && pending_database_info_.empty();
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataDatabaseHelper::StartFetching(
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(!is_fetching_);
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(callback);
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  is_fetching_ = true;
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  completion_callback_.reset(callback);
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this, &CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread));
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCannedBrowsingDataDatabaseHelper::~CannedBrowsingDataDatabaseHelper() {}
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() {
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock auto_lock(lock_);
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (std::vector<PendingDatabaseInfo>::const_iterator
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       info = pending_database_info_.begin();
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       info != pending_database_info_.end(); ++info) {
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    WebSecurityOrigin web_security_origin =
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        WebSecurityOrigin::createFromString(
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            UTF8ToUTF16(info->origin.spec()));
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string origin_identifier =
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        web_security_origin.databaseIdentifier().utf8();
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool duplicate = false;
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (std::vector<DatabaseInfo>::iterator database = database_info_.begin();
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         database != database_info_.end(); ++database) {
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (database->origin_identifier == origin_identifier &&
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          database->database_name == info->name) {
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        duplicate = true;
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        break;
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (duplicate)
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      continue;
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    database_info_.push_back(DatabaseInfo(
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        web_security_origin.host().utf8(),
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        info->name,
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        origin_identifier,
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        info->description,
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        web_security_origin.toString().utf8(),
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        0,
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        base::Time()));
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pending_database_info_.clear();
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this, &CannedBrowsingDataDatabaseHelper::NotifyInUIThread));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
245