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