Index: trunk/src/android_webview/browser/aw_form_database_service.cc |
=================================================================== |
--- trunk/src/android_webview/browser/aw_form_database_service.cc (revision 221422) |
+++ trunk/src/android_webview/browser/aw_form_database_service.cc (working copy) |
@@ -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 @@ |
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() { |
+ 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 @@ |
} |
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(); |
+ 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; |
- } |
- *(it->second.result) = has_form_data; |
- it->second.completion->Signal(); |
- result_map_.erase(h); |
+ completion_.Signal(); |
} |
} // namespace android_webview |