autofill_webdata_backend_impl.h 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#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_WEBDATA_BACKEND_IMPL_H_
6#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_WEBDATA_BACKEND_IMPL_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/observer_list.h"
11#include "base/supports_user_data.h"
12#include "components/autofill/core/browser/webdata/autofill_webdata.h"
13#include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
14#include "components/autofill/core/common/form_field_data.h"
15#include "components/webdata/common/web_data_results.h"
16#include "components/webdata/common/web_data_service_base.h"
17#include "components/webdata/common/web_data_service_consumer.h"
18#include "components/webdata/common/web_database.h"
19#include "content/public/browser/browser_thread.h"
20
21class WebDataServiceBackend;
22
23namespace autofill {
24
25class AutofillChange;
26class AutofillProfile;
27class AutofillWebDataServiceObserverOnDBThread;
28class CreditCard;
29
30// Backend implentation for the AutofillWebDataService. This class runs on the
31// DB thread, as it handles reads and writes to the WebDatabase, and functions
32// in it should only be called from that thread. Most functions here are just
33// the implementations of the corresponding functions in the Autofill
34// WebDataService.
35class AutofillWebDataBackendImpl
36    : public base::RefCountedThreadSafe<AutofillWebDataBackendImpl,
37          content::BrowserThread::DeleteOnDBThread>,
38      public AutofillWebDataBackend {
39 public:
40  // |web_database_backend| is used to access the WebDatabase directly for
41  // Sync-related operations. |on_changed_callback| is a closure which can be
42  // used to notify the UI thread of changes initiated by Sync (this callback
43  // may be called multiple times).
44  AutofillWebDataBackendImpl(
45      scoped_refptr<WebDataServiceBackend> web_database_backend,
46      const base::Closure& on_changed_callback);
47
48  // AutofillWebDataBackend implementation.
49  virtual void AddObserver(AutofillWebDataServiceObserverOnDBThread* observer)
50      OVERRIDE;
51  virtual void RemoveObserver(
52      AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE;
53  virtual WebDatabase* GetDatabase() OVERRIDE;
54  virtual void RemoveExpiredFormElements() OVERRIDE;
55  virtual void NotifyOfMultipleAutofillChanges() OVERRIDE;
56
57  // Returns a SupportsUserData objects that may be used to store data
58  // owned by the DB thread on this object. Should be called only from
59  // the DB thread, and will be destroyed on the DB thread soon after
60  // |ShutdownOnUIThread()| is called.
61  base::SupportsUserData* GetDBUserData();
62
63  void ResetUserData();
64
65  // Adds form fields to the web database.
66  WebDatabase::State AddFormElements(const std::vector<FormFieldData>& fields,
67                                     WebDatabase* db);
68
69  // Returns a vector of values which have been entered in form input fields
70  // named |name|.
71  scoped_ptr<WDTypedResult> GetFormValuesForElementName(
72      const base::string16& name,
73      const base::string16& prefix,
74      int limit,
75      WebDatabase* db);
76
77  // Returns true if there are any elements in the form.
78  scoped_ptr<WDTypedResult> HasFormElements(WebDatabase* db);
79
80  // Removes form elements recorded for Autocomplete from the database.
81  WebDatabase::State RemoveFormElementsAddedBetween(
82      const base::Time& delete_begin,
83      const base::Time& delete_end,
84      WebDatabase* db);
85
86
87  // Removes the Form-value |value| which has been entered in form input fields
88  // named |name| from the database.
89  WebDatabase::State RemoveFormValueForElementName(const base::string16& name,
90                                                   const base::string16& value,
91                                                   WebDatabase* db);
92
93  // Adds an Autofill profile to the web database.
94  WebDatabase::State AddAutofillProfile(const AutofillProfile& profile,
95                                        WebDatabase* db);
96
97  // Updates an Autofill profile in the web database.
98  WebDatabase::State UpdateAutofillProfile(const AutofillProfile& profile,
99                                           WebDatabase* db);
100
101  // Removes an Autofill profile from the web database.
102  WebDatabase::State RemoveAutofillProfile(const std::string& guid,
103                                           WebDatabase* db);
104
105  // Returns all Autofill profiles from the web database.
106  scoped_ptr<WDTypedResult> GetAutofillProfiles(WebDatabase* db);
107
108  // Adds a credit card to the web database.
109  WebDatabase::State AddCreditCard(const CreditCard& credit_card,
110                                   WebDatabase* db);
111
112  // Updates a credit card in the web database.
113  WebDatabase::State UpdateCreditCard(const CreditCard& credit_card,
114                                      WebDatabase* db);
115
116  // Removes a credit card from the web database.
117  WebDatabase::State RemoveCreditCard(const std::string& guid,
118                                      WebDatabase* db);
119
120  // Returns a vector of all credit cards from the web database.
121  scoped_ptr<WDTypedResult> GetCreditCards(WebDatabase* db);
122
123  // Removes Autofill records from the database.
124  WebDatabase::State RemoveAutofillDataModifiedBetween(
125      const base::Time& delete_begin,
126      const base::Time& delete_end,
127      WebDatabase* db);
128
129  // Removes origin URLs associated with Autofill profiles and credit cards from
130  // the database.
131  WebDatabase::State RemoveOriginURLsModifiedBetween(
132      const base::Time& delete_begin,
133      const base::Time& delete_end,
134      WebDatabase* db);
135
136 protected:
137  virtual ~AutofillWebDataBackendImpl();
138
139 private:
140  friend struct content::BrowserThread::DeleteOnThread<
141      content::BrowserThread::DB>;
142  friend class base::DeleteHelper<AutofillWebDataBackendImpl>;
143  // We have to friend RCTS<> so WIN shared-lib build is happy
144  // (http://crbug/112250).
145  friend class base::RefCountedThreadSafe<AutofillWebDataBackendImpl,
146      content::BrowserThread::DeleteOnDBThread>;
147
148  // This makes the destructor public, and thus allows us to aggregate
149  // SupportsUserData. It is private by default to prevent incorrect
150  // usage in class hierarchies where it is inherited by
151  // reference-counted objects.
152  class SupportsUserDataAggregatable : public base::SupportsUserData {
153   public:
154    SupportsUserDataAggregatable() {}
155    virtual ~SupportsUserDataAggregatable() {}
156   private:
157    DISALLOW_COPY_AND_ASSIGN(SupportsUserDataAggregatable);
158  };
159
160  // Storage for user data to be accessed only on the DB thread. May
161  // be used e.g. for SyncableService subclasses that need to be owned
162  // by this object. Is created on first call to |GetDBUserData()|.
163  scoped_ptr<SupportsUserDataAggregatable> user_data_;
164
165  WebDatabase::State RemoveExpiredFormElementsImpl(WebDatabase* db);
166
167  // Callbacks to ensure that sensitive info is destroyed if request is
168  // cancelled.
169  void DestroyAutofillProfileResult(const WDTypedResult* result);
170  void DestroyAutofillCreditCardResult(const WDTypedResult* result);
171
172  ObserverList<AutofillWebDataServiceObserverOnDBThread> db_observer_list_;
173
174  // WebDataServiceBackend allows direct access to DB.
175  // TODO(caitkp): Make it so nobody but us needs direct DB access anymore.
176  scoped_refptr<WebDataServiceBackend> web_database_backend_;
177
178  base::Closure on_changed_callback_;
179
180  DISALLOW_COPY_AND_ASSIGN(AutofillWebDataBackendImpl);
181};
182
183}  // namespace autofill
184
185#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_WEBDATA_BACKEND_IMPL_H_
186