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