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