diff options
Diffstat (limited to 'android_webview/browser/aw_form_database_service.cc')
-rw-r--r-- | android_webview/browser/aw_form_database_service.cc | 71 |
1 files changed, 27 insertions, 44 deletions
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 |