Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1673)

Unified Diff: android_webview/browser/aw_form_database_service.cc

Issue 23803005: Fix threading issues in aw form database (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor comment update Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « android_webview/browser/aw_form_database_service.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..de6b9535bfc71b009df60cab282ccfa20d46b918 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,11 +25,8 @@ 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) {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
web_database_ = new WebDatabaseService(path.Append(kWebDataFilename),
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB));
@@ -42,30 +41,33 @@ 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);
@@ -73,35 +75,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();
+ 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();
+ result_map_.erase(h);
}
} // namespace android_webview
« no previous file with comments | « android_webview/browser/aw_form_database_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698