• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
6 #define CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
7 #pragma once
8 
9 #include <list>
10 #include <map>
11 #include <string>
12 #include <vector>
13 
14 #ifdef ANDROID
15 #include "base/base_api.h"
16 #endif
17 #include "base/basictypes.h"
18 #include "base/compiler_specific.h"
19 #include "base/gtest_prod_util.h"
20 #include "base/memory/scoped_ptr.h"
21 #include "base/memory/scoped_vector.h"
22 #include "base/string16.h"
23 #include "chrome/browser/autofill/autofill_download.h"
24 #include "chrome/browser/autofill/field_types.h"
25 #include "chrome/browser/autofill/form_structure.h"
26 #ifndef ANDROID
27 #include "content/browser/tab_contents/navigation_controller.h"
28 #endif
29 #include "content/browser/tab_contents/tab_contents_observer.h"
30 
31 class AutofillField;
32 class AutofillProfile;
33 class AutofillMetrics;
34 class CreditCard;
35 class PersonalDataManager;
36 class PrefService;
37 class RenderViewHost;
38 class TabContents;
39 
40 #ifdef ANDROID
41 class AutoFillHost;
42 #endif
43 
44 struct ViewHostMsg_FrameNavigate_Params;
45 
46 namespace IPC {
47 class Message;
48 }
49 
50 namespace webkit_glue {
51 struct FormData;
52 struct FormField;
53 }
54 
55 // Manages saving and restoring the user's personal information entered into web
56 // forms.
57 class
58 #ifdef ANDROID
59 BASE_API
60 #endif
61 AutofillManager : public TabContentsObserver,
62                         public AutofillDownloadManager::Observer {
63  public:
64   explicit AutofillManager(TabContents* tab_contents);
65   virtual ~AutofillManager();
66 
67 #ifndef ANDROID
68   // Registers our browser prefs.
69   static void RegisterBrowserPrefs(PrefService* prefs);
70 #endif
71 
72 #ifndef ANDROID
73   // Registers our Enable/Disable Autofill pref.
74   static void RegisterUserPrefs(PrefService* prefs);
75 #endif
76 
77 #ifndef ANDROID
78   // TabContentsObserver implementation.
79   virtual void DidNavigateMainFramePostCommit(
80       const NavigationController::LoadCommittedDetails& details,
81       const ViewHostMsg_FrameNavigate_Params& params);
82   virtual bool OnMessageReceived(const IPC::Message& message);
83 #endif
84 
85   // AutofillDownloadManager::Observer implementation:
86   virtual void OnLoadedAutofillHeuristics(const std::string& heuristic_xml);
87   virtual void OnUploadedAutofillHeuristics(const std::string& form_signature);
88   virtual void OnHeuristicsRequestError(
89       const std::string& form_signature,
90       AutofillDownloadManager::AutofillRequestType request_type,
91       int http_error);
92 
93   // Returns the value of the AutofillEnabled pref.
94   virtual bool IsAutofillEnabled() const;
95 
96   // Imports the form data, submitted by the user, into |personal_data_|.
97   void ImportFormData(const FormStructure& submitted_form);
98 
99   // Uploads the form data to the Autofill server.
100   void UploadFormData(const FormStructure& submitted_form);
101 
102   // Reset cache.
103   void Reset();
104 
105 #ifdef ANDROID
OnFormsSeenWrapper(const std::vector<webkit_glue::FormData> & forms)106   void OnFormsSeenWrapper(const std::vector<webkit_glue::FormData>& forms) {
107     OnFormsSeen(forms);
108   }
109 
OnQueryFormFieldAutoFillWrapper(const webkit_glue::FormData & form,const webkit_glue::FormField & field)110   bool OnQueryFormFieldAutoFillWrapper(const webkit_glue::FormData& form,
111                                        const webkit_glue::FormField& field) {
112     return OnQueryFormFieldAutofill(0, form, field);
113   }
114 
OnFillAutoFillFormDataWrapper(int query_id,const webkit_glue::FormData & form,const webkit_glue::FormField & field,int unique_id)115   void OnFillAutoFillFormDataWrapper(int query_id,
116                                      const webkit_glue::FormData& form,
117                                      const webkit_glue::FormField& field,
118                                      int unique_id) {
119     OnFillAutofillFormData(query_id, form, field, unique_id);
120   }
121 #endif
122 
123  protected:
124   // For tests:
125 
126   // The string/int pair is composed of the guid string and variant index
127   // respectively.  The variant index is an index into the multi-valued item
128   // (where applicable).
129   typedef std::pair<std::string, size_t> GUIDPair;
130 
131   AutofillManager(TabContents* tab_contents,
132                   PersonalDataManager* personal_data);
133 
set_personal_data_manager(PersonalDataManager * personal_data)134   void set_personal_data_manager(PersonalDataManager* personal_data) {
135     personal_data_ = personal_data;
136   }
137 
metric_logger()138   const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
139   void set_metric_logger(const AutofillMetrics* metric_logger);
140 
form_structures()141   ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
142 
143   // Maps GUIDs to and from IDs that are used to identify profiles and credit
144   // cards sent to and from the renderer process.
145   virtual int GUIDToID(const GUIDPair& guid);
146   virtual const GUIDPair IDToGUID(int id);
147 
148   // Methods for packing and unpacking credit card and profile IDs for sending
149   // and receiving to and from the renderer process.
150   int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid);
151   void UnpackGUIDs(int id, GUIDPair* cc_guid, GUIDPair* profile_guid);
152 
153  private:
154   void OnFormSubmitted(const webkit_glue::FormData& form);
155   void OnFormsSeen(const std::vector<webkit_glue::FormData>& forms);
156 #ifdef ANDROID
157   bool
158 #else
159   void
160 #endif
161   OnQueryFormFieldAutofill(int query_id,
162                                 const webkit_glue::FormData& form,
163                                 const webkit_glue::FormField& field);
164   void OnFillAutofillFormData(int query_id,
165                               const webkit_glue::FormData& form,
166                               const webkit_glue::FormField& field,
167                               int unique_id);
168   void OnShowAutofillDialog();
169   void OnDidFillAutofillFormData();
170   void OnDidShowAutofillSuggestions();
171 
172   // Fills |host| with the RenderViewHost for this tab.
173   // Returns false if Autofill is disabled or if the host is unavailable.
174   bool GetHost(const std::vector<AutofillProfile*>& profiles,
175                const std::vector<CreditCard*>& credit_cards,
176 #ifdef ANDROID
177                AutoFillHost** host) WARN_UNUSED_RESULT;
178 #else
179                RenderViewHost** host) const WARN_UNUSED_RESULT;
180 #endif
181 
182   // Fills |form_structure| cached element corresponding to |form|.
183   // Returns false if the cached element was not found.
184   bool FindCachedForm(const webkit_glue::FormData& form,
185                       FormStructure** form_structure) const WARN_UNUSED_RESULT;
186 
187   // Fills |form_structure| and |autofill_field| with the cached elements
188   // corresponding to |form| and |field|. Returns false if the cached elements
189   // were not found.
190   bool FindCachedFormAndField(
191       const webkit_glue::FormData& form,
192       const webkit_glue::FormField& field,
193       FormStructure** form_structure,
194       AutofillField** autofill_field) WARN_UNUSED_RESULT;
195 
196   // Returns a list of values from the stored profiles that match |type| and the
197   // value of |field| and returns the labels of the matching profiles. |labels|
198   // is filled with the Profile label.
199   void GetProfileSuggestions(FormStructure* form,
200                              const webkit_glue::FormField& field,
201                              AutofillFieldType type,
202                              std::vector<string16>* values,
203                              std::vector<string16>* labels,
204                              std::vector<string16>* icons,
205                              std::vector<int>* unique_ids);
206 
207   // Returns a list of values from the stored credit cards that match |type| and
208   // the value of |field| and returns the labels of the matching credit cards.
209   void GetCreditCardSuggestions(FormStructure* form,
210                                 const webkit_glue::FormField& field,
211                                 AutofillFieldType type,
212                                 std::vector<string16>* values,
213                                 std::vector<string16>* labels,
214                                 std::vector<string16>* icons,
215                                 std::vector<int>* unique_ids);
216 
217   // Set |field| argument's value based on |type| and contents of the
218   // |credit_card|.
219   void FillCreditCardFormField(const CreditCard* credit_card,
220                                AutofillFieldType type,
221                                webkit_glue::FormField* field);
222 
223   // Set |field| argument's value based on |type| and contents of the |profile|.
224   // The |variant| parameter specifies which value in a multi-valued profile.
225   void FillFormField(const AutofillProfile* profile,
226                      AutofillFieldType type,
227                      size_t variant,
228                      webkit_glue::FormField* field);
229 
230   // Set |field| argument's value for phone/fax number based on contents of the
231   // |profile|. |type| is the type of the phone.
232   // The |variant| parameter specifies which value in a multi-valued profile.
233   void FillPhoneNumberField(const AutofillProfile* profile,
234                             AutofillFieldType type,
235                             size_t variant,
236                             webkit_glue::FormField* field);
237 
238   // Parses the forms using heuristic matching and querying the Autofill server.
239   void ParseForms(const std::vector<webkit_glue::FormData>& forms);
240 
241   // Uses existing personal data to determine possible field types for the
242   // |submitted_form|.
243   void DeterminePossibleFieldTypesForUpload(FormStructure* submitted_form);
244 
245   // The personal data manager, used to save and load personal data to/from the
246   // web database.  This is overridden by the AutofillManagerTest.
247   // Weak reference.
248   // May be NULL.  NULL indicates OTR.
249   PersonalDataManager* personal_data_;
250 
251   std::list<std::string> autofilled_forms_signatures_;
252   // Handles queries and uploads to Autofill servers.
253   AutofillDownloadManager download_manager_;
254 
255   // Should be set to true in AutofillManagerTest and other tests, false in
256   // AutofillDownloadManagerTest and in non-test environment. Is false by
257   // default for the public constructor, and true by default for the test-only
258   // constructors.
259   bool disable_download_manager_requests_;
260 
261   // For logging UMA metrics. Overridden by metrics tests.
262   scoped_ptr<const AutofillMetrics> metric_logger_;
263 
264   // Have we logged whether Autofill is enabled for this page load?
265   bool has_logged_autofill_enabled_;
266 
267   // Have we logged an address suggestions count metric for this page?
268   bool has_logged_address_suggestions_count_;
269 
270   // Our copy of the form data.
271   ScopedVector<FormStructure> form_structures_;
272 
273   // GUID to ID mapping.  We keep two maps to convert back and forth.
274   std::map<GUIDPair, int> guid_id_map_;
275   std::map<int, GUIDPair> id_guid_map_;
276 
277   friend class AutofillManagerTest;
278   friend class FormStructureBrowserTest;
279   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardForm);
280   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
281                            FillCreditCardFormNoYearNoMonth);
282   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearNoMonth);
283   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormNoYearMonth);
284   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearMonth);
285   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressForm);
286   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressAndCreditCardForm);
287   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleSections);
288   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleEmails);
289   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAutofilledForm);
290   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillPhoneNumber);
291   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesRemoveField);
292   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesAddField);
293   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmitted);
294   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmittedServerTypes);
295   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
296   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
297   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
298                            NoQualityMetricsForNonAutofillableForms);
299   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics);
300   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure);
301   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId);
302   FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch);
303 
304   DISALLOW_COPY_AND_ASSIGN(AutofillManager);
305 };
306 
307 #endif  // CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
308