diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-10 15:27:55 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-10 15:27:55 +0000 |
commit | 0c7a6b2d0bc0ab111013601882cf4b8813d24f35 (patch) | |
tree | e763c887b93c6f35ca764a62f081889cd92b6c0c /chrome/browser/browsing_data_database_helper.cc | |
parent | 248ce19f35b73cdd48ba005c7e4e7b3bc34817fc (diff) | |
download | chromium_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_database_helper.cc')
-rw-r--r-- | chrome/browser/browsing_data_database_helper.cc | 119 |
1 files changed, 81 insertions, 38 deletions
diff --git a/chrome/browser/browsing_data_database_helper.cc b/chrome/browser/browsing_data_database_helper.cc index 338e58c..c302b57 100644 --- a/chrome/browser/browsing_data_database_helper.cc +++ b/chrome/browser/browsing_data_database_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. @@ -15,6 +15,8 @@ #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" +using WebKit::WebSecurityOrigin; + BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo() {} BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo( @@ -43,9 +45,9 @@ bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() { } BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) - : tracker_(profile->GetDatabaseTracker()), - completion_callback_(NULL), - is_fetching_(false) { + : completion_callback_(NULL), + is_fetching_(false), + tracker_(profile->GetDatabaseTracker()) { } BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { @@ -59,8 +61,8 @@ void BrowsingDataDatabaseHelper::StartFetching( is_fetching_ = true; database_info_.clear(); completion_callback_.reset(callback); - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( - this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread)); + BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( + this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread)); } void BrowsingDataDatabaseHelper::CancelNotification() { @@ -71,13 +73,13 @@ void BrowsingDataDatabaseHelper::CancelNotification() { void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, const std::string& name) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( - this, &BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread, origin, + BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( + this, &BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread, origin, name)); } -void BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); +void BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); std::vector<webkit_database::OriginInfo> origins_info; if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { for (std::vector<webkit_database::OriginInfo>::const_iterator ori = @@ -89,8 +91,8 @@ void BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread() { // Extension state is not considered browsing data. continue; } - WebKit::WebSecurityOrigin web_security_origin = - WebKit::WebSecurityOrigin::createFromDatabaseIdentifier( + WebSecurityOrigin web_security_origin = + WebSecurityOrigin::createFromDatabaseIdentifier( ori->GetOrigin()); std::vector<string16> databases; ori->GetAllDatabaseNames(&databases); @@ -129,15 +131,28 @@ void BrowsingDataDatabaseHelper::NotifyInUIThread() { database_info_.clear(); } -void BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread( +void BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread( const std::string& origin, const std::string& name) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); if (!tracker_.get()) return; tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL); } +CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo() {} + +CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo( + const GURL& origin, + const std::string& name, + const std::string& description) + : origin(origin), + name(name), + description(description) { +} + +CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {} + CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( Profile* profile) : BrowsingDataDatabaseHelper(profile) { @@ -147,39 +162,67 @@ void CannedBrowsingDataDatabaseHelper::AddDatabase( const GURL& origin, const std::string& name, const std::string& description) { - WebKit::WebSecurityOrigin web_security_origin = - WebKit::WebSecurityOrigin::createFromString( - UTF8ToUTF16(origin.spec())); - std::string origin_identifier = - web_security_origin.databaseIdentifier().utf8(); - - for (std::vector<DatabaseInfo>::iterator database = database_info_.begin(); - database != database_info_.end(); ++database) { - if (database->origin_identifier == origin_identifier && - database->database_name == name) - return; - } - - database_info_.push_back(DatabaseInfo( - web_security_origin.host().utf8(), - name, - origin_identifier, - description, - web_security_origin.toString().utf8(), - 0, - base::Time())); + base::AutoLock auto_lock(lock_); + pending_database_info_.push_back(PendingDatabaseInfo( + origin, name, description)); } void CannedBrowsingDataDatabaseHelper::Reset() { + base::AutoLock auto_lock(lock_); database_info_.clear(); + pending_database_info_.clear(); } bool CannedBrowsingDataDatabaseHelper::empty() const { - return database_info_.empty(); + base::AutoLock auto_lock(lock_); + return database_info_.empty() && pending_database_info_.empty(); } void CannedBrowsingDataDatabaseHelper::StartFetching( Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { - callback->Run(database_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, &CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread)); +} + +void CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() { + base::AutoLock auto_lock(lock_); + for (std::vector<PendingDatabaseInfo>::const_iterator + info = pending_database_info_.begin(); + info != pending_database_info_.end(); ++info) { + WebSecurityOrigin web_security_origin = + WebSecurityOrigin::createFromString( + UTF8ToUTF16(info->origin.spec())); + std::string origin_identifier = + web_security_origin.databaseIdentifier().utf8(); + + bool duplicate = false; + for (std::vector<DatabaseInfo>::iterator database = database_info_.begin(); + database != database_info_.end(); ++database) { + if (database->origin_identifier == origin_identifier && + database->database_name == info->name) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + + database_info_.push_back(DatabaseInfo( + web_security_origin.host().utf8(), + info->name, + origin_identifier, + info->description, + web_security_origin.toString().utf8(), + 0, + base::Time())); + } + pending_database_info_.clear(); + + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod( + this, &CannedBrowsingDataDatabaseHelper::NotifyInUIThread)); } |