1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "android_webview/browser/aw_form_database_service.h"
7 #include "base/logging.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "components/autofill/core/browser/webdata/autofill_table.h"
10 #include "components/webdata/common/webdata_constants.h"
11 #include "content/public/browser/browser_thread.h"
13 using base::WaitableEvent
;
14 using content::BrowserThread
;
18 // Callback to handle database error. It seems chrome uses this to
19 // display an error dialog box only.
20 void DatabaseErrorCallback(sql::InitStatus status
) {
21 LOG(WARNING
) << "initializing autocomplete database failed";
26 namespace android_webview
{
28 AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path
) {
29 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
30 web_database_
= new WebDatabaseService(path
.Append(kWebDataFilename
),
31 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI
),
32 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB
));
33 web_database_
->AddTable(make_scoped_ptr(new autofill::AutofillTable
));
34 web_database_
->LoadDatabase();
36 autofill_data_
= new autofill::AutofillWebDataService(
38 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI
),
39 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB
),
40 base::Bind(&DatabaseErrorCallback
));
41 autofill_data_
->Init();
44 AwFormDatabaseService::~AwFormDatabaseService() {
48 void AwFormDatabaseService::Shutdown() {
49 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
50 DCHECK(result_map_
.empty());
51 // TODO(sgurun) we don't run into this logic right now,
52 // but if we do, then we need to implement cancellation
53 // of pending queries.
54 autofill_data_
->ShutdownOnUIThread();
55 web_database_
->ShutdownDatabase();
58 scoped_refptr
<autofill::AutofillWebDataService
>
59 AwFormDatabaseService::get_autofill_webdata_service() {
60 return autofill_data_
;
63 void AwFormDatabaseService::ClearFormData() {
64 BrowserThread::PostTask(
67 base::Bind(&AwFormDatabaseService::ClearFormDataImpl
,
68 base::Unretained(this)));
71 void AwFormDatabaseService::ClearFormDataImpl() {
73 base::Time end
= base::Time::Max();
74 autofill_data_
->RemoveFormElementsAddedBetween(begin
, end
);
75 autofill_data_
->RemoveAutofillDataModifiedBetween(begin
, end
);
78 bool AwFormDatabaseService::HasFormData() {
79 WaitableEvent
completion(false, false);
81 BrowserThread::PostTask(
84 base::Bind(&AwFormDatabaseService::HasFormDataImpl
,
85 base::Unretained(this),
92 void AwFormDatabaseService::HasFormDataImpl(
93 WaitableEvent
* completion
,
95 WebDataServiceBase::Handle pending_query_handle
=
96 autofill_data_
->HasFormElements(this);
98 query
.result
= result
;
99 query
.completion
= completion
;
100 result_map_
[pending_query_handle
] = query
;
103 void AwFormDatabaseService::OnWebDataServiceRequestDone(
104 WebDataServiceBase::Handle h
,
105 const WDTypedResult
* result
) {
107 DCHECK_CURRENTLY_ON(BrowserThread::DB
);
108 bool has_form_data
= false;
110 DCHECK_EQ(AUTOFILL_VALUE_RESULT
, result
->GetType());
111 const WDResult
<bool>* autofill_result
=
112 static_cast<const WDResult
<bool>*>(result
);
113 has_form_data
= autofill_result
->GetValue();
115 QueryMap::const_iterator it
= result_map_
.find(h
);
116 if (it
== result_map_
.end()) {
117 LOG(WARNING
) << "Received unexpected callback from web data service";
120 *(it
->second
.result
) = has_form_data
;
121 it
->second
.completion
->Signal();
122 result_map_
.erase(h
);
125 } // namespace android_webview