Chromium Code Reviews| Index: chrome/browser/browsing_data_indexed_db_helper.cc |
| diff --git a/chrome/browser/browsing_data_indexed_db_helper.cc b/chrome/browser/browsing_data_indexed_db_helper.cc |
| index 6c02d213a7fb4151da4e41d9709813f93d082f14..7afea585b8713b6e76b9932fe4a82beac6e0b8d0 100644 |
| --- a/chrome/browser/browsing_data_indexed_db_helper.cc |
| +++ b/chrome/browser/browsing_data_indexed_db_helper.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -109,7 +109,7 @@ void BrowsingDataIndexedDBHelperImpl::FetchIndexedDBInfoInWebKitThread() { |
| file_path = file_enumerator.Next()) { |
| if (file_path.Extension() == IndexedDBContext::kIndexedDBExtension) { |
| WebSecurityOrigin web_security_origin = |
| - WebKit::WebSecurityOrigin::createFromDatabaseIdentifier( |
| + WebSecurityOrigin::createFromDatabaseIdentifier( |
| webkit_glue::FilePathToWebString(file_path.BaseName())); |
| if (EqualsASCII(web_security_origin.protocol(), |
| chrome::kExtensionScheme)) { |
| @@ -185,50 +185,109 @@ BrowsingDataIndexedDBHelper* BrowsingDataIndexedDBHelper::Create( |
| return new BrowsingDataIndexedDBHelperImpl(profile); |
| } |
| +CannedBrowsingDataIndexedDBHelper:: |
| +PendingIndexedDBInfo::PendingIndexedDBInfo() { |
| +} |
| + |
| +CannedBrowsingDataIndexedDBHelper:: |
| +PendingIndexedDBInfo::PendingIndexedDBInfo(const GURL& origin, |
| + const string16& description) |
| + : origin(origin), |
| + description(description) { |
| +} |
| + |
| +CannedBrowsingDataIndexedDBHelper:: |
| +PendingIndexedDBInfo::~PendingIndexedDBInfo() { |
| +} |
| + |
| CannedBrowsingDataIndexedDBHelper::CannedBrowsingDataIndexedDBHelper( |
| Profile* profile) |
| - : profile_(profile) { |
| + : profile_(profile), |
| + completion_callback_(NULL), |
| + is_fetching_(false) { |
| DCHECK(profile); |
| } |
| void CannedBrowsingDataIndexedDBHelper::AddIndexedDB( |
| const GURL& origin, const string16& description) { |
| - WebSecurityOrigin web_security_origin = |
| - WebSecurityOrigin::createFromString( |
| - UTF8ToUTF16(origin.spec())); |
| - std::string security_origin(web_security_origin.toString().utf8()); |
| - |
| - for (std::vector<IndexedDBInfo>::iterator |
| - indexed_db = indexed_db_info_.begin(); |
| - indexed_db != indexed_db_info_.end(); ++indexed_db) { |
| - if (indexed_db->origin == security_origin) |
| - return; |
| - } |
| - |
| - indexed_db_info_.push_back(IndexedDBInfo( |
| - web_security_origin.protocol().utf8(), |
| - web_security_origin.host().utf8(), |
| - web_security_origin.port(), |
| - web_security_origin.databaseIdentifier().utf8(), |
| - security_origin, |
| - profile_->GetWebKitContext()->indexed_db_context()-> |
| - GetIndexedDBFilePath(web_security_origin.databaseIdentifier()), |
| - 0, |
| - base::Time())); |
| + base::AutoLock auto_lock(lock_); |
| + pending_indexed_db_info_.push_back(PendingIndexedDBInfo(origin, description)); |
| } |
| void CannedBrowsingDataIndexedDBHelper::Reset() { |
| + base::AutoLock auto_lock(lock_); |
| indexed_db_info_.clear(); |
| + pending_indexed_db_info_.clear(); |
| } |
| bool CannedBrowsingDataIndexedDBHelper::empty() const { |
| - return indexed_db_info_.empty(); |
| + base::AutoLock auto_lock(lock_); |
| + return indexed_db_info_.empty() && pending_indexed_db_info_.empty(); |
| } |
| void CannedBrowsingDataIndexedDBHelper::StartFetching( |
| Callback1<const std::vector<IndexedDBInfo>& >::Type* callback) { |
| - callback->Run(indexed_db_info_); |
| - delete callback; |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(!is_fetching_); |
| + DCHECK(callback); |
| + is_fetching_ = true; |
| + completion_callback_.reset(callback); |
| + BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( |
| + this, |
| + &CannedBrowsingDataIndexedDBHelper::ConvertPendingInfoInWebKitThread)); |
| } |
| CannedBrowsingDataIndexedDBHelper::~CannedBrowsingDataIndexedDBHelper() {} |
| + |
| +void CannedBrowsingDataIndexedDBHelper::ConvertPendingInfoInWebKitThread() { |
| + base::AutoLock auto_lock(lock_); |
| + for (std::vector<PendingIndexedDBInfo>::const_iterator |
| + info = pending_indexed_db_info_.begin(); |
| + info != pending_indexed_db_info_.end(); ++info) { |
| + WebSecurityOrigin web_security_origin = |
| + WebSecurityOrigin::createFromString( |
| + UTF8ToUTF16(info->origin.spec())); |
| + std::string security_origin(web_security_origin.toString().utf8()); |
| + |
| + bool duplicate = false; |
| + for (std::vector<IndexedDBInfo>::iterator |
| + indexed_db = indexed_db_info_.begin(); |
| + indexed_db != indexed_db_info_.end(); ++indexed_db) { |
| + if (indexed_db->origin == security_origin) { |
| + duplicate = true; |
| + break; |
| + } |
| + } |
| + if (duplicate) |
| + continue; |
| + |
| + indexed_db_info_.push_back(IndexedDBInfo( |
| + web_security_origin.protocol().utf8(), |
| + web_security_origin.host().utf8(), |
| + web_security_origin.port(), |
| + web_security_origin.databaseIdentifier().utf8(), |
| + security_origin, |
| + profile_->GetWebKitContext()->indexed_db_context()-> |
| + GetIndexedDBFilePath(web_security_origin.databaseIdentifier()), |
| + 0, |
| + base::Time())); |
| + } |
| + pending_indexed_db_info_.clear(); |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + NewRunnableMethod( |
| + this, &CannedBrowsingDataIndexedDBHelper::NotifyInUIThread)); |
| +} |
| + |
| +void CannedBrowsingDataIndexedDBHelper::NotifyInUIThread() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(is_fetching_); |
| + // Note: completion_callback_ mutates only in the UI thread, so it's safe to |
| + // test it here. |
| + if (completion_callback_ != NULL) { |
|
bulach
2011/02/22 22:34:01
oh, I think we can change both here (and the origi
|
| + completion_callback_->Run(indexed_db_info_); |
| + completion_callback_.reset(); |
| + } |
| + is_fetching_ = false; |
| +} |