summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browsing_data_indexed_db_helper.cc
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-10 15:27:55 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-10 15:27:55 +0000
commit0c7a6b2d0bc0ab111013601882cf4b8813d24f35 (patch)
treee763c887b93c6f35ca764a62f081889cd92b6c0c /chrome/browser/browsing_data_indexed_db_helper.cc
parent248ce19f35b73cdd48ba005c7e4e7b3bc34817fc (diff)
downloadchromium_src-0c7a6b2d0bc0ab111013601882cf4b8813d24f35.zip
chromium_src-0c7a6b2d0bc0ab111013601882cf4b8813d24f35.tar.gz
chromium_src-0c7a6b2d0bc0ab111013601882cf4b8813d24f35.tar.bz2
Only invoke WebKit methods in browsing data helpers on the WEBKIT thread.
BUG=71786 TEST=browser & unit tests Review URL: http://codereview.chromium.org/6246105 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74433 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browsing_data_indexed_db_helper.cc')
-rw-r--r--chrome/browser/browsing_data_indexed_db_helper.cc115
1 files changed, 87 insertions, 28 deletions
diff --git a/chrome/browser/browsing_data_indexed_db_helper.cc b/chrome/browser/browsing_data_indexed_db_helper.cc
index 6c02d213a..7afea58 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) {
+ completion_callback_->Run(indexed_db_info_);
+ completion_callback_.reset();
+ }
+ is_fetching_ = false;
+}