Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Unified Diff: chrome/browser/browsing_data_local_storage_helper.cc

Issue 6246105: Only invoke WebKit methods in browsing data helpers on the WEBKIT thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..e16f24d9646e2b6f9d0432bb7920dd289bed16be 100644
--- a/chrome/browser/browsing_data_local_storage_helper.cc
+++ b/chrome/browser/browsing_data_local_storage_helper.cc
@@ -16,6 +16,8 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "webkit/glue/webkit_glue.h"
+using WebKit::WebSecurityOrigin;
+
BrowsingDataLocalStorageHelper::LocalStorageInfo::LocalStorageInfo() {}
BrowsingDataLocalStorageHelper::LocalStorageInfo::LocalStorageInfo(
@@ -91,8 +93,8 @@ void BrowsingDataLocalStorageHelper::FetchLocalStorageInfoInWebKitThread() {
for (FilePath file_path = file_enumerator.Next(); !file_path.empty();
file_path = file_enumerator.Next()) {
if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) {
- WebKit::WebSecurityOrigin web_security_origin =
- WebKit::WebSecurityOrigin::createFromDatabaseIdentifier(
+ WebSecurityOrigin web_security_origin =
+ WebSecurityOrigin::createFromDatabaseIdentifier(
webkit_glue::FilePathToWebString(file_path.BaseName()));
if (EqualsASCII(web_security_origin.protocol(),
chrome::kExtensionScheme)) {
@@ -147,40 +149,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) {
+ WebSecurityOrigin web_security_origin =
+ 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));
}

Powered by Google App Engine
This is Rietveld 408576698