Index: components/autofill/browser/webdata/autofill_webdata_backend.cc |
diff --git a/components/autofill/browser/webdata/autofill_webdata_backend.cc b/components/autofill/browser/webdata/autofill_webdata_backend.cc |
index 0cda3d15310d9e4796315c7be1d2442af50caffb..40e2d302b642620095578ed310f6a5c4fe2d9c8c 100644 |
--- a/components/autofill/browser/webdata/autofill_webdata_backend.cc |
+++ b/components/autofill/browser/webdata/autofill_webdata_backend.cc |
@@ -12,7 +12,9 @@ |
#include "components/autofill/browser/webdata/autofill_change.h" |
#include "components/autofill/browser/webdata/autofill_entry.h" |
#include "components/autofill/browser/webdata/autofill_table.h" |
+#include "components/autofill/browser/webdata/autofill_webdata_service.h" |
#include "components/autofill/browser/webdata/autofill_webdata_service_observer.h" |
+#include "components/autofill/browser/webdata/syncable_service_delegate.h" |
#include "components/autofill/common/form_field_data.h" |
using base::Bind; |
@@ -21,6 +23,71 @@ using content::BrowserThread; |
namespace autofill { |
+class SyncableAutofillDelegate : public SyncableServiceDelegate { |
Jói
2013/05/06 23:08:39
Do you expect that there might be multiple impleme
|
+ public: |
+ SyncableAutofillDelegate( |
+ WebDatabase* db, |
+ AutofillWebDataBackend* autofill_backend, |
+ const base::Closure& on_changed) |
+ : web_database_(db), |
+ autofill_backend_(autofill_backend), |
+ on_changed_(new base::Closure(on_changed)), |
+ weak_ptr_factory_(this) { |
+ } |
+ |
+ virtual ~SyncableAutofillDelegate() { |
+ } |
+ |
+ base::WeakPtr<SyncableAutofillDelegate> AsWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+ } |
+ |
+ virtual WebDatabase* GetDatabase() OVERRIDE { |
+ return web_database_; |
+ } |
+ |
+ virtual void AddObserver( |
+ AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
+ if (autofill_backend_) |
+ autofill_backend_->AddObserver(observer); |
+ } |
+ |
+ virtual void RemoveObserver( |
+ AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
+ if (autofill_backend_) |
+ autofill_backend_->RemoveObserver(observer); |
+ } |
+ |
+ virtual void RemoveExpiredFormElements() OVERRIDE { |
+ if (!autofill_backend_) |
+ return; |
+ |
+ WebDatabase::State state = |
+ autofill_backend_->RemoveExpiredFormElements(web_database_); |
+ |
+ if (state == WebDatabase::COMMIT_NEEDED) { |
+ web_database_->CommitTransaction(); |
+ web_database_->BeginTransaction(); |
+ } |
+ } |
+ |
+ virtual void NotifyOfMultipleAutofillChanges() OVERRIDE { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
+ |
+ if (!autofill_backend_ || !on_changed_ || on_changed_->is_null()) |
+ return; |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, *on_changed_); |
+ } |
+ |
+ private: |
+ WebDatabase* web_database_; |
+ AutofillWebDataBackend* autofill_backend_; |
+ base::Closure* on_changed_; |
+ base::WeakPtrFactory<SyncableAutofillDelegate> weak_ptr_factory_; |
+}; |
Ilya Sherman
2013/05/07 00:02:43
nit: Please tuck this into an anonymous namespace.
|
+ |
AutofillWebDataBackend::AutofillWebDataBackend() { |
} |
@@ -36,7 +103,19 @@ void AutofillWebDataBackend::RemoveObserver( |
db_observer_list_.RemoveObserver(observer); |
} |
+void AutofillWebDataBackend::GetDelegate( |
+ const AutofillWebDataService::DelegateOnDBCallback& callback, |
+ const base::Closure& on_changed_callback, |
+ WebDatabase* db) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
+ if (!delegate_.get()) |
+ delegate_.reset(new SyncableAutofillDelegate( |
+ db, this, on_changed_callback)); |
+ callback.Run(delegate_->AsWeakPtr()); |
+} |
+ |
AutofillWebDataBackend::~AutofillWebDataBackend() { |
+ delegate_.reset(); |
} |
WebDatabase::State AutofillWebDataBackend::AddFormElements( |