Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/browsing_data_database_helper.h" | 5 #include "chrome/browser/browsing_data_database_helper.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 | 36 |
| 37 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {} | 37 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {} |
| 38 | 38 |
| 39 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() { | 39 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() { |
| 40 return StartsWithASCII(origin_identifier, | 40 return StartsWithASCII(origin_identifier, |
| 41 std::string(chrome::kFileScheme), | 41 std::string(chrome::kFileScheme), |
| 42 true); | 42 true); |
| 43 } | 43 } |
| 44 | 44 |
| 45 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) | 45 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) |
| 46 : tracker_(profile->GetDatabaseTracker()), | 46 : completion_callback_(NULL), |
| 47 completion_callback_(NULL), | 47 is_fetching_(false), |
| 48 is_fetching_(false) { | 48 tracker_(profile->GetDatabaseTracker()) { |
| 49 } | 49 } |
| 50 | 50 |
| 51 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { | 51 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { |
| 52 } | 52 } |
| 53 | 53 |
| 54 void BrowsingDataDatabaseHelper::StartFetching( | 54 void BrowsingDataDatabaseHelper::StartFetching( |
| 55 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { | 55 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { |
| 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 57 DCHECK(!is_fetching_); | 57 DCHECK(!is_fetching_); |
| 58 DCHECK(callback); | 58 DCHECK(callback); |
| 59 is_fetching_ = true; | 59 is_fetching_ = true; |
| 60 database_info_.clear(); | 60 database_info_.clear(); |
| 61 completion_callback_.reset(callback); | 61 completion_callback_.reset(callback); |
| 62 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( | 62 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( |
| 63 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread)); | 63 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread)); |
| 64 } | 64 } |
| 65 | 65 |
| 66 void BrowsingDataDatabaseHelper::CancelNotification() { | 66 void BrowsingDataDatabaseHelper::CancelNotification() { |
| 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 68 completion_callback_.reset(NULL); | 68 completion_callback_.reset(NULL); |
| 69 } | 69 } |
| 70 | 70 |
| 71 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, | 71 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, |
| 72 const std::string& name) { | 72 const std::string& name) { |
| 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 74 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( | 74 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( |
| 75 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread, origin, | 75 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread, origin, |
| 76 name)); | 76 name)); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread() { | 79 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread() { |
| 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
| 81 std::vector<webkit_database::OriginInfo> origins_info; | 81 std::vector<webkit_database::OriginInfo> origins_info; |
| 82 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { | 82 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { |
| 83 for (std::vector<webkit_database::OriginInfo>::const_iterator ori = | 83 for (std::vector<webkit_database::OriginInfo>::const_iterator ori = |
| 84 origins_info.begin(); ori != origins_info.end(); ++ori) { | 84 origins_info.begin(); ori != origins_info.end(); ++ori) { |
| 85 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin())); | 85 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin())); |
| 86 if (StartsWithASCII(origin_identifier, | 86 if (StartsWithASCII(origin_identifier, |
| 87 std::string(chrome::kExtensionScheme), | 87 std::string(chrome::kExtensionScheme), |
| 88 true)) { | 88 true)) { |
| 89 // Extension state is not considered browsing data. | 89 // Extension state is not considered browsing data. |
| 90 continue; | 90 continue; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 // Note: completion_callback_ mutates only in the UI thread, so it's safe to | 122 // Note: completion_callback_ mutates only in the UI thread, so it's safe to |
| 123 // test it here. | 123 // test it here. |
| 124 if (completion_callback_ != NULL) { | 124 if (completion_callback_ != NULL) { |
| 125 completion_callback_->Run(database_info_); | 125 completion_callback_->Run(database_info_); |
| 126 completion_callback_.reset(); | 126 completion_callback_.reset(); |
| 127 } | 127 } |
| 128 is_fetching_ = false; | 128 is_fetching_ = false; |
| 129 database_info_.clear(); | 129 database_info_.clear(); |
| 130 } | 130 } |
| 131 | 131 |
| 132 void BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread( | 132 void BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread( |
| 133 const std::string& origin, | 133 const std::string& origin, |
| 134 const std::string& name) { | 134 const std::string& name) { |
| 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
| 136 if (!tracker_.get()) | 136 if (!tracker_.get()) |
| 137 return; | 137 return; |
| 138 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL); | 138 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL); |
| 139 } | 139 } |
| 140 | 140 |
| 141 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo() {} | |
| 142 | |
| 143 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo( | |
| 144 const GURL& origin, | |
| 145 const std::string& name, | |
| 146 const std::string& description) | |
| 147 : origin(origin), | |
| 148 name(name), | |
| 149 description(description) { | |
| 150 } | |
| 151 | |
| 152 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {} | |
| 153 | |
| 141 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( | 154 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( |
| 142 Profile* profile) | 155 Profile* profile) |
| 143 : BrowsingDataDatabaseHelper(profile) { | 156 : BrowsingDataDatabaseHelper(profile) { |
| 144 } | 157 } |
| 145 | 158 |
| 146 void CannedBrowsingDataDatabaseHelper::AddDatabase( | 159 void CannedBrowsingDataDatabaseHelper::AddDatabase( |
| 147 const GURL& origin, | 160 const GURL& origin, |
| 148 const std::string& name, | 161 const std::string& name, |
| 149 const std::string& description) { | 162 const std::string& description) { |
| 150 WebKit::WebSecurityOrigin web_security_origin = | 163 base::AutoLock auto_lock(lock_); |
| 151 WebKit::WebSecurityOrigin::createFromString( | 164 pending_database_info_.push_back(PendingDatabaseInfo( |
| 152 UTF8ToUTF16(origin.spec())); | 165 origin, name, description)); |
| 153 std::string origin_identifier = | |
| 154 web_security_origin.databaseIdentifier().utf8(); | |
| 155 | |
| 156 for (std::vector<DatabaseInfo>::iterator database = database_info_.begin(); | |
| 157 database != database_info_.end(); ++database) { | |
| 158 if (database->origin_identifier == origin_identifier && | |
| 159 database->database_name == name) | |
| 160 return; | |
| 161 } | |
| 162 | |
| 163 database_info_.push_back(DatabaseInfo( | |
| 164 web_security_origin.host().utf8(), | |
| 165 name, | |
| 166 origin_identifier, | |
| 167 description, | |
| 168 web_security_origin.toString().utf8(), | |
| 169 0, | |
| 170 base::Time())); | |
| 171 } | 166 } |
| 172 | 167 |
| 173 void CannedBrowsingDataDatabaseHelper::Reset() { | 168 void CannedBrowsingDataDatabaseHelper::Reset() { |
| 169 base::AutoLock auto_lock(lock_); | |
| 174 database_info_.clear(); | 170 database_info_.clear(); |
| 171 pending_database_info_.clear(); | |
| 175 } | 172 } |
| 176 | 173 |
| 177 bool CannedBrowsingDataDatabaseHelper::empty() const { | 174 bool CannedBrowsingDataDatabaseHelper::empty() const { |
| 178 return database_info_.empty(); | 175 base::AutoLock auto_lock(lock_); |
| 176 return database_info_.empty() && pending_database_info_.empty(); | |
| 179 } | 177 } |
| 180 | 178 |
| 181 void CannedBrowsingDataDatabaseHelper::StartFetching( | 179 void CannedBrowsingDataDatabaseHelper::StartFetching( |
| 182 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { | 180 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { |
| 183 callback->Run(database_info_); | 181 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 184 delete callback; | 182 DCHECK(!is_fetching_); |
| 183 DCHECK(callback); | |
| 184 is_fetching_ = true; | |
| 185 completion_callback_.reset(callback); | |
| 186 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( | |
| 187 this, &CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread)); | |
| 185 } | 188 } |
| 189 | |
| 190 void CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() { | |
| 191 base::AutoLock auto_lock(lock_); | |
| 192 for (std::vector<PendingDatabaseInfo>::const_iterator | |
| 193 info = pending_database_info_.begin(); | |
| 194 info != pending_database_info_.end(); ++info) { | |
| 195 WebKit::WebSecurityOrigin web_security_origin = | |
| 196 WebKit::WebSecurityOrigin::createFromString( | |
| 197 UTF8ToUTF16(info->origin.spec())); | |
| 198 std::string origin_identifier = | |
| 199 web_security_origin.databaseIdentifier().utf8(); | |
| 200 | |
| 201 bool duplicate = false; | |
| 202 for (std::vector<DatabaseInfo>::iterator database = database_info_.begin(); | |
| 203 database != database_info_.end(); ++database) { | |
| 204 if (database->origin_identifier == origin_identifier && | |
| 205 database->database_name == info->name) { | |
| 206 duplicate = true; | |
| 207 break; | |
| 208 } | |
| 209 } | |
| 210 if (duplicate) | |
| 211 continue; | |
| 212 | |
| 213 database_info_.push_back(DatabaseInfo( | |
| 214 web_security_origin.host().utf8(), | |
|
Bernhard Bauer
2011/02/08 10:49:08
Nit: Indent by two spaces less?
| |
| 215 info->name, | |
| 216 origin_identifier, | |
| 217 info->description, | |
| 218 web_security_origin.toString().utf8(), | |
| 219 0, | |
| 220 base::Time())); | |
| 221 } | |
| 222 pending_database_info_.clear(); | |
| 223 | |
| 224 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod( | |
| 225 this, &CannedBrowsingDataDatabaseHelper::NotifyInUIThread)); | |
| 226 } | |
| OLD | NEW |