diff options
author | pneubeck@chromium.org <pneubeck@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-05 14:46:12 +0000 |
---|---|---|
committer | pneubeck@chromium.org <pneubeck@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-05 14:46:12 +0000 |
commit | 31dce876839d7a68f3b4c6ae94a13f9a254c87f5 (patch) | |
tree | 180f796c8f8c7544134d5ef286bf34b65c967c8b /android_webview | |
parent | ccd2f30fc20902fe7323a340df800248fa6a32c1 (diff) | |
download | chromium_src-31dce876839d7a68f3b4c6ae94a13f9a254c87f5.zip chromium_src-31dce876839d7a68f3b4c6ae94a13f9a254c87f5.tar.gz chromium_src-31dce876839d7a68f3b4c6ae94a13f9a254c87f5.tar.bz2 |
Revert 221409 "Fix threading issues in aw form database"
Broke Android Tests:
http://build.chromium.org/p/chromium.linux/buildstatus?builder=Android%20Tests%20%28dbg%29&number=14173
> Fix threading issues in aw form database
>
> BUG=285584
>
> Review URL: https://chromiumcodereview.appspot.com/23803005
TBR=sgurun@chromium.org
Review URL: https://codereview.chromium.org/23679005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221423 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/browser/aw_browser_context.cc | 13 | ||||
-rw-r--r-- | android_webview/browser/aw_form_database_service.cc | 71 | ||||
-rw-r--r-- | android_webview/browser/aw_form_database_service.h | 20 |
3 files changed, 41 insertions, 63 deletions
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc index 8551e3f..17be0e3 100644 --- a/android_webview/browser/aw_browser_context.cc +++ b/android_webview/browser/aw_browser_context.cc @@ -23,8 +23,6 @@ #include "content/public/browser/web_contents.h" #include "net/url_request/url_request_context.h" -using content::BrowserThread; - namespace android_webview { namespace { @@ -43,11 +41,11 @@ class AwResourceContext : public content::ResourceContext { // content::ResourceContext implementation. virtual net::HostResolver* GetHostResolver() OVERRIDE { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); return getter_->GetURLRequestContext()->host_resolver(); } virtual net::URLRequestContext* GetRequestContext() OVERRIDE { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); return getter_->GetURLRequestContext(); } virtual bool AllowMicAccess(const GURL& origin) OVERRIDE { @@ -75,9 +73,6 @@ AwBrowserContext::AwBrowserContext( user_pref_service_ready_(false) { DCHECK(g_browser_context == NULL); g_browser_context = this; - - form_database_service_.reset( - new AwFormDatabaseService(context_storage_path_)); } AwBrowserContext::~AwBrowserContext() { @@ -151,6 +146,10 @@ AwQuotaManagerBridge* AwBrowserContext::GetQuotaManagerBridge() { } AwFormDatabaseService* AwBrowserContext::GetFormDatabaseService() { + if (!form_database_service_) { + form_database_service_.reset( + new AwFormDatabaseService(context_storage_path_)); + } return form_database_service_.get(); } diff --git a/android_webview/browser/aw_form_database_service.cc b/android_webview/browser/aw_form_database_service.cc index 54db3c9..2b168de 100644 --- a/android_webview/browser/aw_form_database_service.cc +++ b/android_webview/browser/aw_form_database_service.cc @@ -4,13 +4,11 @@ #include "android_webview/browser/aw_form_database_service.h" #include "base/logging.h" -#include "base/synchronization/waitable_event.h" #include "components/autofill/core/browser/webdata/autofill_table.h" #include "components/webdata/common/webdata_constants.h" #include "content/public/browser/browser_thread.h" #include "ui/base/l10n/l10n_util_android.h" -using base::WaitableEvent; using content::BrowserThread; namespace { @@ -25,7 +23,10 @@ void DatabaseErrorCallback(sql::InitStatus status) { namespace android_webview { -AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) { +AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) + : pending_query_handle_(0), + has_form_data_(false), + completion_(false, false) { web_database_ = new WebDatabaseService(path.Append(kWebDataFilename), BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), @@ -41,33 +42,30 @@ AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) { } AwFormDatabaseService::~AwFormDatabaseService() { + CancelPendingQuery(); Shutdown(); } void AwFormDatabaseService::Shutdown() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(result_map_.empty()); - // TODO(sgurun) we don't run into this logic right now, - // but if we do, then we need to implement cancellation - // of pending queries. autofill_data_->ShutdownOnUIThread(); web_database_->ShutdownDatabase(); } +void AwFormDatabaseService::CancelPendingQuery() { + if (pending_query_handle_) { + if (autofill_data_.get()) + autofill_data_->CancelRequest(pending_query_handle_); + pending_query_handle_ = 0; + } +} + scoped_refptr<autofill::AutofillWebDataService> AwFormDatabaseService::get_autofill_webdata_service() { return autofill_data_; } void AwFormDatabaseService::ClearFormData() { - BrowserThread::PostTask( - BrowserThread::DB, - FROM_HERE, - base::Bind(&AwFormDatabaseService::ClearFormDataImpl, - base::Unretained(this))); -} - -void AwFormDatabaseService::ClearFormDataImpl() { base::Time begin; base::Time end = base::Time::Max(); autofill_data_->RemoveFormElementsAddedBetween(begin, end); @@ -75,50 +73,35 @@ void AwFormDatabaseService::ClearFormDataImpl() { } bool AwFormDatabaseService::HasFormData() { - WaitableEvent completion(false, false); - bool result = false; - BrowserThread::PostTask( - BrowserThread::DB, - FROM_HERE, + BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, base::Bind(&AwFormDatabaseService::HasFormDataImpl, - base::Unretained(this), - &completion, - &result)); - completion.Wait(); - return result; + base::Unretained(this))); + completion_.Wait(); + return has_form_data_; } -void AwFormDatabaseService::HasFormDataImpl( - WaitableEvent* completion, - bool* result) { - WebDataServiceBase::Handle pending_query_handle = - autofill_data_->HasFormElements(this); - PendingQuery query; - query.result = result; - query.completion = completion; - result_map_[pending_query_handle] = query; +void AwFormDatabaseService::HasFormDataImpl() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); + pending_query_handle_ = autofill_data_->HasFormElements(this); } + void AwFormDatabaseService::OnWebDataServiceRequestDone( WebDataServiceBase::Handle h, const WDTypedResult* result) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); - bool has_form_data = false; + DCHECK_EQ(pending_query_handle_, h); + pending_query_handle_ = 0; + has_form_data_ = false; + if (result) { DCHECK_EQ(AUTOFILL_VALUE_RESULT, result->GetType()); const WDResult<bool>* autofill_result = static_cast<const WDResult<bool>*>(result); - has_form_data = autofill_result->GetValue(); - } - QueryMap::const_iterator it = result_map_.find(h); - if (it == result_map_.end()) { - LOG(WARNING) << "Received unexpected callback from web data service"; - return; + has_form_data_ = autofill_result->GetValue(); } - *(it->second.result) = has_form_data; - it->second.completion->Signal(); - result_map_.erase(h); + completion_.Signal(); } } // namespace android_webview diff --git a/android_webview/browser/aw_form_database_service.h b/android_webview/browser/aw_form_database_service.h index d0b7b48..c1cbc37 100644 --- a/android_webview/browser/aw_form_database_service.h +++ b/android_webview/browser/aw_form_database_service.h @@ -7,14 +7,11 @@ #include "base/basictypes.h" #include "base/files/file_path.h" +#include "base/synchronization/waitable_event.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/webdata/common/web_data_service_consumer.h" #include "components/webdata/common/web_database_service.h" -namespace base { -class WaitableEvent; -}; - namespace android_webview { // Handles the database operations necessary to implement the autocomplete @@ -45,16 +42,15 @@ class AwFormDatabaseService : public WebDataServiceConsumer { const WDTypedResult* result) OVERRIDE; private: - struct PendingQuery { - bool* result; - base::WaitableEvent* completion; - }; - typedef std::map<WebDataServiceBase::Handle, PendingQuery> QueryMap; + // Cancels the currently pending WebDataService query, if there is one. + void CancelPendingQuery(); - void ClearFormDataImpl(); - void HasFormDataImpl(base::WaitableEvent* completion, bool* result); + void HasFormDataImpl(); - QueryMap result_map_; + // Stores the query handle when an async database query is executed. + WebDataServiceBase::Handle pending_query_handle_; + bool has_form_data_; + base::WaitableEvent completion_; scoped_refptr<autofill::AutofillWebDataService> autofill_data_; scoped_refptr<WebDatabaseService> web_database_; |