1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "components/webdata/common/web_data_service_backend.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_service.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::Bind;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::Time;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillWebDataService::AutofillWebDataService(
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<WebDatabaseService> wdbs,
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> ui_thread,
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> db_thread,
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ProfileErrorCallback& callback)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : WebDataServiceBase(wdbs, callback, ui_thread),
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui_thread_(ui_thread),
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      db_thread_(db_thread),
36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      weak_ptr_factory_(this),
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      autofill_backend_(NULL) {
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::Closure on_changed_callback = Bind(
40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      &AutofillWebDataService::NotifyAutofillMultipleChangedOnUIThread,
41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      weak_ptr_factory_.GetWeakPtr());
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  autofill_backend_ = new AutofillWebDataBackendImpl(
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wdbs_->GetBackend(), ui_thread_, db_thread_, on_changed_callback);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)AutofillWebDataService::AutofillWebDataService(
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> ui_thread,
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> db_thread)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebDataServiceBase(NULL, WebDataServiceBase::ProfileErrorCallback(),
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ui_thread),
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ui_thread_(ui_thread),
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      db_thread_(db_thread),
54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      weak_ptr_factory_(this),
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      autofill_backend_(new AutofillWebDataBackendImpl(NULL,
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ui_thread_,
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          db_thread_,
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          base::Closure())) {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::ShutdownOnUIThread() {
62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  weak_ptr_factory_.InvalidateWeakPtrs();
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  db_thread_->PostTask(FROM_HERE,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::ResetUserData, autofill_backend_));
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebDataServiceBase::ShutdownOnUIThread();
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::AddFormFields(
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<FormFieldData>& fields) {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::AddFormElements,
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, fields));
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebDataServiceBase::Handle AutofillWebDataService::GetFormValuesForElementName(
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& name, const base::string16& prefix, int limit,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::GetFormValuesForElementName,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, name, prefix, limit), consumer);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)WebDataServiceBase::Handle AutofillWebDataService::HasFormElements(
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::HasFormElements, autofill_backend_),
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      consumer);
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveFormElementsAddedBetween(
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Time& delete_begin, const Time& delete_end) {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveFormElementsAddedBetween,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, delete_begin, delete_end));
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveFormValueForElementName(
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& name, const base::string16& value) {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveFormValueForElementName,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, name, value));
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::AddAutofillProfile(
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const AutofillProfile& profile) {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::AddAutofillProfile,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, profile));
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::UpdateAutofillProfile(
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const AutofillProfile& profile) {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::UpdateAutofillProfile,
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, profile));
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveAutofillProfile(
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& guid) {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveAutofillProfile,
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, guid));
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebDataServiceBase::Handle AutofillWebDataService::GetAutofillProfiles(
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::GetAutofillProfiles, autofill_backend_),
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      consumer);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::AddCreditCard(const CreditCard& credit_card) {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::AddCreditCard,
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, credit_card));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::UpdateCreditCard(
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const CreditCard& credit_card) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::UpdateCreditCard,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, credit_card));
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveCreditCard(const std::string& guid) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveCreditCard,
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           autofill_backend_, guid));
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebDataServiceBase::Handle AutofillWebDataService::GetCreditCards(
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::GetCreditCards, autofill_backend_),
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      consumer);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveAutofillDataModifiedBetween(
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Time& delete_begin,
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Time& delete_end) {
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wdbs_->ScheduleDBTask(
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveAutofillDataModifiedBetween,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           autofill_backend_, delete_begin, delete_end));
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillWebDataService::RemoveOriginURLsModifiedBetween(
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const Time& delete_begin, const Time& delete_end) {
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  wdbs_->ScheduleDBTask(
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Bind(&AutofillWebDataBackendImpl::RemoveOriginURLsModifiedBetween,
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           autofill_backend_, delete_begin, delete_end));
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::AddObserver(
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillWebDataServiceObserverOnDBThread* observer) {
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(db_thread_->BelongsToCurrentThread());
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (autofill_backend_.get())
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_backend_->AddObserver(observer);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveObserver(
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillWebDataServiceObserverOnDBThread* observer) {
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(db_thread_->BelongsToCurrentThread());
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (autofill_backend_.get())
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_backend_->RemoveObserver(observer);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::AddObserver(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillWebDataServiceObserverOnUIThread* observer) {
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(ui_thread_->BelongsToCurrentThread());
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_observer_list_.AddObserver(observer);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::RemoveObserver(
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillWebDataServiceObserverOnUIThread* observer) {
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(ui_thread_->BelongsToCurrentThread());
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_observer_list_.RemoveObserver(observer);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::SupportsUserData* AutofillWebDataService::GetDBUserData() {
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(db_thread_->BelongsToCurrentThread());
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return autofill_backend_->GetDBUserData();
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillWebDataService::GetAutofillBackend(
210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const base::Callback<void(AutofillWebDataBackend*)>& callback) {
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  db_thread_->PostTask(FROM_HERE, base::Bind(callback, autofill_backend_));
212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillWebDataService::~AutofillWebDataService() {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillWebDataService::NotifyAutofillMultipleChangedOnUIThread() {
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(ui_thread_->BelongsToCurrentThread());
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FOR_EACH_OBSERVER(AutofillWebDataServiceObserverOnUIThread,
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    ui_observer_list_,
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    AutofillMultipleChanged());
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
225