autofill_webdata_service.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 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.
4
5#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
6
7#include "base/bind.h"
8#include "base/logging.h"
9#include "base/message_loop/message_loop_proxy.h"
10#include "base/stl_util.h"
11#include "components/autofill/core/browser/autofill_country.h"
12#include "components/autofill/core/browser/autofill_profile.h"
13#include "components/autofill/core/browser/credit_card.h"
14#include "components/autofill/core/browser/webdata/autofill_change.h"
15#include "components/autofill/core/browser/webdata/autofill_entry.h"
16#include "components/autofill/core/browser/webdata/autofill_table.h"
17#include "components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h"
18#include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
19#include "components/autofill/core/common/form_field_data.h"
20#include "components/webdata/common/web_data_service_backend.h"
21#include "components/webdata/common/web_database_service.h"
22
23using base::Bind;
24using base::Time;
25
26namespace autofill {
27
28AutofillWebDataService::AutofillWebDataService(
29    scoped_refptr<WebDatabaseService> wdbs,
30    scoped_refptr<base::MessageLoopProxy> ui_thread,
31    scoped_refptr<base::MessageLoopProxy> db_thread,
32    const ProfileErrorCallback& callback)
33    : WebDataServiceBase(wdbs, callback, ui_thread),
34      ui_thread_(ui_thread),
35      db_thread_(db_thread),
36      autofill_backend_(NULL),
37      weak_ptr_factory_(this) {
38
39  base::Closure on_changed_callback = Bind(
40      &AutofillWebDataService::NotifyAutofillMultipleChangedOnUIThread,
41      weak_ptr_factory_.GetWeakPtr());
42
43  autofill_backend_ = new AutofillWebDataBackendImpl(
44      wdbs_->GetBackend(), ui_thread_, db_thread_, on_changed_callback);
45}
46
47AutofillWebDataService::AutofillWebDataService(
48    scoped_refptr<base::MessageLoopProxy> ui_thread,
49    scoped_refptr<base::MessageLoopProxy> db_thread)
50    : WebDataServiceBase(NULL, WebDataServiceBase::ProfileErrorCallback(),
51          ui_thread),
52      ui_thread_(ui_thread),
53      db_thread_(db_thread),
54      autofill_backend_(new AutofillWebDataBackendImpl(NULL,
55          ui_thread_,
56          db_thread_,
57          base::Closure())),
58      weak_ptr_factory_(this) {
59}
60
61void AutofillWebDataService::ShutdownOnUIThread() {
62  weak_ptr_factory_.InvalidateWeakPtrs();
63  db_thread_->PostTask(FROM_HERE,
64      Bind(&AutofillWebDataBackendImpl::ResetUserData, autofill_backend_));
65  WebDataServiceBase::ShutdownOnUIThread();
66}
67
68void AutofillWebDataService::AddFormFields(
69    const std::vector<FormFieldData>& fields) {
70  wdbs_->ScheduleDBTask(FROM_HERE,
71      Bind(&AutofillWebDataBackendImpl::AddFormElements,
72           autofill_backend_, fields));
73}
74
75WebDataServiceBase::Handle AutofillWebDataService::GetFormValuesForElementName(
76    const base::string16& name, const base::string16& prefix, int limit,
77    WebDataServiceConsumer* consumer) {
78  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
79      Bind(&AutofillWebDataBackendImpl::GetFormValuesForElementName,
80           autofill_backend_, name, prefix, limit), consumer);
81}
82
83WebDataServiceBase::Handle AutofillWebDataService::HasFormElements(
84    WebDataServiceConsumer* consumer) {
85  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
86      Bind(&AutofillWebDataBackendImpl::HasFormElements, autofill_backend_),
87      consumer);
88}
89
90void AutofillWebDataService::RemoveFormElementsAddedBetween(
91    const Time& delete_begin, const Time& delete_end) {
92  wdbs_->ScheduleDBTask(FROM_HERE,
93      Bind(&AutofillWebDataBackendImpl::RemoveFormElementsAddedBetween,
94           autofill_backend_, delete_begin, delete_end));
95}
96
97void AutofillWebDataService::RemoveFormValueForElementName(
98    const base::string16& name, const base::string16& value) {
99  wdbs_->ScheduleDBTask(FROM_HERE,
100      Bind(&AutofillWebDataBackendImpl::RemoveFormValueForElementName,
101           autofill_backend_, name, value));
102}
103
104void AutofillWebDataService::AddAutofillProfile(
105    const AutofillProfile& profile) {
106  wdbs_->ScheduleDBTask(FROM_HERE,
107      Bind(&AutofillWebDataBackendImpl::AddAutofillProfile,
108           autofill_backend_, profile));
109}
110
111void AutofillWebDataService::UpdateAutofillProfile(
112    const AutofillProfile& profile) {
113  wdbs_->ScheduleDBTask(FROM_HERE,
114      Bind(&AutofillWebDataBackendImpl::UpdateAutofillProfile,
115           autofill_backend_, profile));
116}
117
118void AutofillWebDataService::RemoveAutofillProfile(
119    const std::string& guid) {
120  wdbs_->ScheduleDBTask(FROM_HERE,
121      Bind(&AutofillWebDataBackendImpl::RemoveAutofillProfile,
122           autofill_backend_, guid));
123}
124
125WebDataServiceBase::Handle AutofillWebDataService::GetAutofillProfiles(
126    WebDataServiceConsumer* consumer) {
127  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
128      Bind(&AutofillWebDataBackendImpl::GetAutofillProfiles, autofill_backend_),
129      consumer);
130}
131
132void AutofillWebDataService::UpdateAutofillEntries(
133    const std::vector<autofill::AutofillEntry>& autofill_entries) {
134  wdbs_->ScheduleDBTask(FROM_HERE,
135                        Bind(&AutofillWebDataBackendImpl::UpdateAutofillEntries,
136                             autofill_backend_,
137                             autofill_entries));
138}
139
140void AutofillWebDataService::AddCreditCard(const CreditCard& credit_card) {
141  wdbs_->ScheduleDBTask(
142      FROM_HERE,
143      Bind(&AutofillWebDataBackendImpl::AddCreditCard,
144           autofill_backend_, credit_card));
145}
146
147void AutofillWebDataService::UpdateCreditCard(
148    const CreditCard& credit_card) {
149  wdbs_->ScheduleDBTask(
150      FROM_HERE,
151      Bind(&AutofillWebDataBackendImpl::UpdateCreditCard,
152           autofill_backend_, credit_card));
153}
154
155void AutofillWebDataService::RemoveCreditCard(const std::string& guid) {
156  wdbs_->ScheduleDBTask(
157      FROM_HERE,
158      Bind(&AutofillWebDataBackendImpl::RemoveCreditCard,
159           autofill_backend_, guid));
160}
161
162WebDataServiceBase::Handle AutofillWebDataService::GetCreditCards(
163    WebDataServiceConsumer* consumer) {
164  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
165      Bind(&AutofillWebDataBackendImpl::GetCreditCards, autofill_backend_),
166      consumer);
167}
168
169void AutofillWebDataService::RemoveAutofillDataModifiedBetween(
170    const Time& delete_begin,
171    const Time& delete_end) {
172  wdbs_->ScheduleDBTask(
173      FROM_HERE,
174      Bind(&AutofillWebDataBackendImpl::RemoveAutofillDataModifiedBetween,
175           autofill_backend_, delete_begin, delete_end));
176}
177
178void AutofillWebDataService::RemoveOriginURLsModifiedBetween(
179    const Time& delete_begin, const Time& delete_end) {
180  wdbs_->ScheduleDBTask(
181      FROM_HERE,
182      Bind(&AutofillWebDataBackendImpl::RemoveOriginURLsModifiedBetween,
183           autofill_backend_, delete_begin, delete_end));
184}
185
186void AutofillWebDataService::AddObserver(
187    AutofillWebDataServiceObserverOnDBThread* observer) {
188  DCHECK(db_thread_->BelongsToCurrentThread());
189  if (autofill_backend_.get())
190    autofill_backend_->AddObserver(observer);
191}
192
193void AutofillWebDataService::RemoveObserver(
194    AutofillWebDataServiceObserverOnDBThread* observer) {
195  DCHECK(db_thread_->BelongsToCurrentThread());
196  if (autofill_backend_.get())
197    autofill_backend_->RemoveObserver(observer);
198}
199
200void AutofillWebDataService::AddObserver(
201    AutofillWebDataServiceObserverOnUIThread* observer) {
202  DCHECK(ui_thread_->BelongsToCurrentThread());
203  ui_observer_list_.AddObserver(observer);
204}
205
206void AutofillWebDataService::RemoveObserver(
207    AutofillWebDataServiceObserverOnUIThread* observer) {
208  DCHECK(ui_thread_->BelongsToCurrentThread());
209  ui_observer_list_.RemoveObserver(observer);
210}
211
212base::SupportsUserData* AutofillWebDataService::GetDBUserData() {
213  DCHECK(db_thread_->BelongsToCurrentThread());
214  return autofill_backend_->GetDBUserData();
215}
216
217void AutofillWebDataService::GetAutofillBackend(
218    const base::Callback<void(AutofillWebDataBackend*)>& callback) {
219  db_thread_->PostTask(FROM_HERE, base::Bind(callback, autofill_backend_));
220}
221
222AutofillWebDataService::~AutofillWebDataService() {
223}
224
225void AutofillWebDataService::NotifyAutofillMultipleChangedOnUIThread() {
226  DCHECK(ui_thread_->BelongsToCurrentThread());
227  FOR_EACH_OBSERVER(AutofillWebDataServiceObserverOnUIThread,
228                    ui_observer_list_,
229                    AutofillMultipleChanged());
230}
231
232}  // namespace autofill
233