Index: chrome/browser/browsing_data_local_storage_helper.cc |
diff --git a/chrome/browser/browsing_data_local_storage_helper.cc b/chrome/browser/browsing_data_local_storage_helper.cc |
index 4a035d5ff03a43407febfcd392135e683fa0b857..0cb24c2f0d782794f819cfadb9f4007d2db05878 100644 |
--- a/chrome/browser/browsing_data_local_storage_helper.cc |
+++ b/chrome/browser/browsing_data_local_storage_helper.cc |
@@ -147,40 +147,72 @@ CannedBrowsingDataLocalStorageHelper::CannedBrowsingDataLocalStorageHelper( |
void CannedBrowsingDataLocalStorageHelper::AddLocalStorage( |
const GURL& origin) { |
- WebKit::WebSecurityOrigin web_security_origin = |
- WebKit::WebSecurityOrigin::createFromString( |
- UTF8ToUTF16(origin.spec())); |
- std::string security_origin(web_security_origin.toString().utf8()); |
- |
- for (std::vector<LocalStorageInfo>::iterator |
- local_storage = local_storage_info_.begin(); |
- local_storage != local_storage_info_.end(); ++local_storage) { |
- if (local_storage->origin == security_origin) |
- return; |
- } |
- |
- local_storage_info_.push_back(LocalStorageInfo( |
- web_security_origin.protocol().utf8(), |
- web_security_origin.host().utf8(), |
- web_security_origin.port(), |
- web_security_origin.databaseIdentifier().utf8(), |
- security_origin, |
- profile_->GetWebKitContext()->dom_storage_context()-> |
- GetLocalStorageFilePath(web_security_origin.databaseIdentifier()), |
- 0, |
- base::Time())); |
+ base::AutoLock auto_lock(lock_); |
+ pending_local_storage_info_.push_back(origin); |
} |
void CannedBrowsingDataLocalStorageHelper::Reset() { |
+ base::AutoLock auto_lock(lock_); |
local_storage_info_.clear(); |
+ pending_local_storage_info_.clear(); |
} |
bool CannedBrowsingDataLocalStorageHelper::empty() const { |
- return local_storage_info_.empty(); |
+ base::AutoLock auto_lock(lock_); |
+ return local_storage_info_.empty() && pending_local_storage_info_.empty(); |
} |
void CannedBrowsingDataLocalStorageHelper::StartFetching( |
Callback1<const std::vector<LocalStorageInfo>& >::Type* callback) { |
- callback->Run(local_storage_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, |
+ &CannedBrowsingDataLocalStorageHelper:: |
+ ConvertPendingInfoInWebKitThread)); |
+} |
+ |
+void CannedBrowsingDataLocalStorageHelper::ConvertPendingInfoInWebKitThread() { |
+ base::AutoLock auto_lock(lock_); |
+ for (std::vector<GURL>::iterator info = pending_local_storage_info_.begin(); |
+ info != pending_local_storage_info_.end(); ++info) { |
+ WebKit::WebSecurityOrigin web_security_origin = |
+ WebKit::WebSecurityOrigin::createFromString( |
+ UTF8ToUTF16(info->spec())); |
+ std::string security_origin(web_security_origin.toString().utf8()); |
+ |
+ bool duplicate = false; |
+ for (std::vector<LocalStorageInfo>::iterator |
+ local_storage = local_storage_info_.begin(); |
+ local_storage != local_storage_info_.end(); ++local_storage) { |
+ if (local_storage->origin == security_origin) { |
+ duplicate = true; |
+ break; |
+ } |
+ } |
+ if (duplicate) |
+ continue; |
+ |
+ local_storage_info_.push_back(LocalStorageInfo( |
+ web_security_origin.protocol().utf8(), |
+ web_security_origin.host().utf8(), |
+ web_security_origin.port(), |
+ web_security_origin.databaseIdentifier().utf8(), |
+ security_origin, |
+ profile_->GetWebKitContext()->dom_storage_context()-> |
+ GetLocalStorageFilePath(web_security_origin.databaseIdentifier()), |
+ 0, |
+ base::Time())); |
+ } |
+ pending_local_storage_info_.clear(); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ NewRunnableMethod( |
+ this, &CannedBrowsingDataLocalStorageHelper::NotifyInUIThread)); |
} |