Chromium Code Reviews| Index: android_webview/browser/aw_form_database_service.cc |
| diff --git a/android_webview/browser/aw_form_database_service.cc b/android_webview/browser/aw_form_database_service.cc |
| index 2b168deba9ebd9aa0fd9dbc7d9d3b679b7cc33df..5c3e0791f1c7a2216c853f14b96ed10ba731714c 100644 |
| --- a/android_webview/browser/aw_form_database_service.cc |
| +++ b/android_webview/browser/aw_form_database_service.cc |
| @@ -4,11 +4,13 @@ |
| #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 { |
| @@ -23,10 +25,7 @@ void DatabaseErrorCallback(sql::InitStatus status) { |
| namespace android_webview { |
| -AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) |
| - : pending_query_handle_(0), |
| - has_form_data_(false), |
| - completion_(false, false) { |
| +AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) { |
| web_database_ = new WebDatabaseService(path.Append(kWebDataFilename), |
| BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
| @@ -42,30 +41,32 @@ AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path) |
| } |
| AwFormDatabaseService::~AwFormDatabaseService() { |
| - CancelPendingQuery(); |
| Shutdown(); |
| } |
| void AwFormDatabaseService::Shutdown() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + // TODO(sgurun) we don't run into this logic right now, |
| + // but if we do, then we need to implement cancellation |
| + // of pending queries. |
|
joth
2013/09/05 03:03:44
DCHECK(result_map_.empty()) ?
sgurun-gerrit only
2013/09/05 03:17:17
Done.
|
| 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); |
| @@ -73,35 +74,50 @@ void AwFormDatabaseService::ClearFormData() { |
| } |
| bool AwFormDatabaseService::HasFormData() { |
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| + WaitableEvent completion(false, false); |
| + bool result = false; |
| + BrowserThread::PostTask( |
| + BrowserThread::DB, |
| + FROM_HERE, |
| base::Bind(&AwFormDatabaseService::HasFormDataImpl, |
| - base::Unretained(this))); |
| - completion_.Wait(); |
| - return has_form_data_; |
| + base::Unretained(this), |
| + &completion, |
| + &result)); |
| + completion.Wait(); |
| + // TODO(sgurun) we need to erase this entry |
| + return result; |
| } |
| -void AwFormDatabaseService::HasFormDataImpl() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| - pending_query_handle_ = autofill_data_->HasFormElements(this); |
| +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::OnWebDataServiceRequestDone( |
| WebDataServiceBase::Handle h, |
| const WDTypedResult* result) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| - DCHECK_EQ(pending_query_handle_, h); |
| - pending_query_handle_ = 0; |
| - has_form_data_ = false; |
| - |
| + bool 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(); |
| + 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; |
| } |
| - completion_.Signal(); |
| + *(it->second.result) = has_form_data; |
| + it->second.completion->Signal(); |
|
joth
2013/09/05 03:03:44
result_map_.erase(it)
sgurun-gerrit only
2013/09/05 03:17:17
Done.
|
| } |
| } // namespace android_webview |