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