Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: chrome/browser/autofill/autofill_manager.h

Issue 12434004: Move remaining Autofill code to //components/autofill. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix long lines Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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
8 #include <list>
9 #include <map>
10 #include <string>
11 #include <vector>
12
13 #include "base/basictypes.h"
14 #include "base/callback_forward.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/memory/weak_ptr.h"
20 #include "base/prefs/public/pref_change_registrar.h"
21 #include "base/string16.h"
22 #include "base/supports_user_data.h"
23 #include "base/time.h"
24 #include "chrome/browser/autofill/autocheckout_manager.h"
25 #include "chrome/browser/autofill/autocomplete_history_manager.h"
26 #include "chrome/browser/autofill/autofill_download.h"
27 #include "chrome/browser/autofill/autofill_manager_delegate.h"
28 #include "chrome/browser/autofill/field_types.h"
29 #include "chrome/browser/autofill/form_structure.h"
30 #include "chrome/browser/autofill/personal_data_manager.h"
31 #include "components/autofill/common/autocheckout_status.h"
32 #include "components/autofill/common/form_data.h"
33 #include "content/public/browser/web_contents_observer.h"
34 #include "content/public/common/ssl_status.h"
35 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFormElement.h"
36
37 class AutofillExternalDelegate;
38 class AutofillField;
39 class AutofillProfile;
40 class AutofillMetrics;
41 class CreditCard;
42 class FormGroup;
43 class GURL;
44 class PrefRegistrySyncable;
45 class ProfileSyncService;
46
47 struct FormData;
48 struct FormFieldData;
49 struct PasswordFormFillData;
50 struct ViewHostMsg_FrameNavigate_Params;
51
52 namespace autofill {
53 class AutofillManagerDelegate;
54 class PasswordGenerator;
55 }
56
57 namespace content {
58 class RenderViewHost;
59 class WebContents;
60
61 struct PasswordForm;
62 }
63
64 namespace gfx {
65 class Rect;
66 class RectF;
67 }
68
69 namespace IPC {
70 class Message;
71 }
72
73 // Manages saving and restoring the user's personal information entered into web
74 // forms.
75 class AutofillManager : public content::WebContentsObserver,
76 public AutofillDownloadManager::Observer,
77 public base::SupportsUserData::Data {
78 public:
79 static void CreateForWebContentsAndDelegate(
80 content::WebContents* contents,
81 autofill::AutofillManagerDelegate* delegate);
82 static AutofillManager* FromWebContents(content::WebContents* contents);
83
84 // Registers our Enable/Disable Autofill pref.
85 static void RegisterUserPrefs(PrefRegistrySyncable* registry);
86
87 // Set an external delegate.
88 void SetExternalDelegate(AutofillExternalDelegate* delegate);
89
90 // Whether browser process will create and own the Autofill popup UI.
91 bool IsNativeUiEnabled();
92
93 // Called from our external delegate so they cannot be private.
94 virtual void OnFillAutofillFormData(int query_id,
95 const FormData& form,
96 const FormFieldData& field,
97 int unique_id);
98 void OnDidShowAutofillSuggestions(bool is_new_popup);
99 void OnDidFillAutofillFormData(const base::TimeTicks& timestamp);
100 void OnShowAutofillDialog();
101 void OnDidPreviewAutofillFormData();
102 void OnShowPasswordGenerationPopup(const gfx::Rect& bounds,
103 int max_length,
104 const content::PasswordForm& form);
105
106 // Remove the credit card or Autofill profile that matches |unique_id|
107 // from the database.
108 void RemoveAutofillProfileOrCreditCard(int unique_id);
109
110 // Remove the specified Autocomplete entry.
111 void RemoveAutocompleteEntry(const string16& name, const string16& value);
112
113 // Returns the present web_contents state.
114 content::WebContents* GetWebContents() const;
115
116 // Returns the present form structures seen by Autofill manager.
117 const std::vector<FormStructure*>& GetFormStructures();
118
119 // Causes the dialog for request autocomplete feature to be shown.
120 virtual void ShowRequestAutocompleteDialog(
121 const FormData& form,
122 const GURL& source_url,
123 const content::SSLStatus& ssl_status,
124 autofill::DialogType dialog_type,
125 const base::Callback<void(const FormStructure*)>& callback);
126
127 // Happens when the autocomplete dialog runs its callback when being closed.
128 void RequestAutocompleteDialogClosed();
129
130 autofill::AutofillManagerDelegate* delegate() const {
131 return manager_delegate_;
132 }
133
134 protected:
135 // Only test code should subclass AutofillManager.
136 AutofillManager(content::WebContents* web_contents,
137 autofill::AutofillManagerDelegate* delegate);
138 virtual ~AutofillManager();
139
140 // Test code should prefer to use this constructor.
141 AutofillManager(content::WebContents* web_contents,
142 autofill::AutofillManagerDelegate* delegate,
143 PersonalDataManager* personal_data);
144
145 // Returns the value of the AutofillEnabled pref.
146 virtual bool IsAutofillEnabled() const;
147
148 // Uploads the form data to the Autofill server.
149 virtual void UploadFormData(const FormStructure& submitted_form);
150
151 // Reset cache.
152 void Reset();
153
154 // Informs the renderer of the current password generation state. This is a
155 // separate function to aid with testing.
156 virtual void SendPasswordGenerationStateToRenderer(
157 content::RenderViewHost* host,
158 bool enabled);
159
160 // Logs quality metrics for the |submitted_form| and uploads the form data
161 // to the crowdsourcing server, if appropriate.
162 virtual void UploadFormDataAsyncCallback(
163 const FormStructure* submitted_form,
164 const base::TimeTicks& load_time,
165 const base::TimeTicks& interaction_time,
166 const base::TimeTicks& submission_time);
167
168 // Maps GUIDs to and from IDs that are used to identify profiles and credit
169 // cards sent to and from the renderer process.
170 virtual int GUIDToID(const PersonalDataManager::GUIDPair& guid) const;
171 virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const;
172
173 // Methods for packing and unpacking credit card and profile IDs for sending
174 // and receiving to and from the renderer process.
175 int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid,
176 const PersonalDataManager::GUIDPair& profile_guid) const;
177 void UnpackGUIDs(int id,
178 PersonalDataManager::GUIDPair* cc_guid,
179 PersonalDataManager::GUIDPair* profile_guid) const;
180
181 const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
182 void set_metric_logger(const AutofillMetrics* metric_logger);
183
184 ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
185
186 // Exposed for testing.
187 AutofillExternalDelegate* external_delegate() {
188 return external_delegate_;
189 }
190
191 // Exposed for testing.
192 autofill::AutocheckoutManager* autocheckout_manager() {
193 return &autocheckout_manager_;
194 }
195
196 // Processes the submitted |form|, saving any new Autofill data and uploading
197 // the possible field types for the submitted fields to the crowdsouring
198 // server. Returns false if this form is not relevant for Autofill.
199 bool OnFormSubmitted(const FormData& form,
200 const base::TimeTicks& timestamp);
201
202 // Tell the renderer the current interactive autocomplete finished.
203 virtual void ReturnAutocompleteResult(
204 WebKit::WebFormElement::AutocompleteResult result,
205 const FormData& form_data);
206
207 private:
208 // content::WebContentsObserver:
209 virtual void RenderViewCreated(content::RenderViewHost* host) OVERRIDE;
210 virtual void DidNavigateMainFrame(
211 const content::LoadCommittedDetails& details,
212 const content::FrameNavigateParams& params) OVERRIDE;
213 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
214 virtual void WebContentsDestroyed(
215 content::WebContents* web_contents) OVERRIDE;
216
217 // AutofillDownloadManager::Observer:
218 virtual void OnLoadedServerPredictions(
219 const std::string& response_xml) OVERRIDE;
220
221 void OnSyncStateChanged();
222
223 // Register as an observer with the sync service.
224 void RegisterWithSyncService();
225
226 // Called when password generation preference state changes.
227 void OnPasswordGenerationEnabledChanged();
228
229 // Determines what the current state of password generation is, and if it has
230 // changed from |password_generation_enabled_|. If it has changed or if
231 // |new_renderer| is true, it notifies the renderer of this change via
232 // SendPasswordGenerationStateToRenderer.
233 void UpdatePasswordGenerationState(content::RenderViewHost* host,
234 bool new_renderer);
235
236 void OnFormsSeen(const std::vector<FormData>& forms,
237 const base::TimeTicks& timestamp);
238 void OnTextFieldDidChange(const FormData& form,
239 const FormFieldData& field,
240 const base::TimeTicks& timestamp);
241
242 // The |bounding_box| is a window relative value.
243 void OnQueryFormFieldAutofill(int query_id,
244 const FormData& form,
245 const FormFieldData& field,
246 const gfx::RectF& bounding_box,
247 bool display_warning);
248 void OnDidEndTextFieldEditing();
249 void OnHideAutofillPopup();
250 void OnAddPasswordFormMapping(
251 const FormFieldData& form,
252 const PasswordFormFillData& fill_data);
253 void OnShowPasswordSuggestions(const FormFieldData& field,
254 const gfx::RectF& bounds,
255 const std::vector<string16>& suggestions);
256 void OnSetDataList(const std::vector<string16>& values,
257 const std::vector<string16>& labels,
258 const std::vector<string16>& icons,
259 const std::vector<int>& unique_ids);
260
261 // Requests an interactive autocomplete UI be shown.
262 void OnRequestAutocomplete(const FormData& form,
263 const GURL& frame_url,
264 const content::SSLStatus& ssl_status);
265
266 // Passes return data for an OnRequestAutocomplete call back to the page.
267 void ReturnAutocompleteData(const FormStructure* result);
268
269 // Called to signal clicking an element failed in some way during an
270 // Autocheckout flow.
271 void OnClickFailed(autofill::AutocheckoutStatus status);
272
273 // Returns the matched whitelist URL prefix for the current tab's url.
274 std::string GetAutocheckoutURLPrefix() const;
275
276 // Fills |host| with the RenderViewHost for this tab.
277 // Returns false if Autofill is disabled or if the host is unavailable.
278 bool GetHost(content::RenderViewHost** host) const WARN_UNUSED_RESULT;
279
280 // Unpacks |unique_id| and fills |form_group| and |variant| with the
281 // appropriate data source and variant index. Returns false if the unpacked
282 // id cannot be found.
283 bool GetProfileOrCreditCard(int unique_id,
284 const FormGroup** form_group,
285 size_t* variant) const WARN_UNUSED_RESULT;
286
287 // Fills |form_structure| cached element corresponding to |form|.
288 // Returns false if the cached element was not found.
289 bool FindCachedForm(const FormData& form,
290 FormStructure** form_structure) const WARN_UNUSED_RESULT;
291
292 // Fills |form_structure| and |autofill_field| with the cached elements
293 // corresponding to |form| and |field|. This might have the side-effect of
294 // updating the cache. Returns false if the |form| is not autofillable, or if
295 // it is not already present in the cache and the cache is full.
296 bool GetCachedFormAndField(const FormData& form,
297 const FormFieldData& field,
298 FormStructure** form_structure,
299 AutofillField** autofill_field) WARN_UNUSED_RESULT;
300
301 // Re-parses |live_form| and adds the result to |form_structures_|.
302 // |cached_form| should be a pointer to the existing version of the form, or
303 // NULL if no cached version exists. The updated form is then written into
304 // |updated_form|. Returns false if the cache could not be updated.
305 bool UpdateCachedForm(const FormData& live_form,
306 const FormStructure* cached_form,
307 FormStructure** updated_form) WARN_UNUSED_RESULT;
308
309 // Returns a list of values from the stored profiles that match |type| and the
310 // value of |field| and returns the labels of the matching profiles. |labels|
311 // is filled with the Profile label.
312 void GetProfileSuggestions(FormStructure* form,
313 const FormFieldData& field,
314 AutofillFieldType type,
315 std::vector<string16>* values,
316 std::vector<string16>* labels,
317 std::vector<string16>* icons,
318 std::vector<int>* unique_ids) const;
319
320 // Returns a list of values from the stored credit cards that match |type| and
321 // the value of |field| and returns the labels of the matching credit cards.
322 void GetCreditCardSuggestions(const FormFieldData& field,
323 AutofillFieldType type,
324 std::vector<string16>* values,
325 std::vector<string16>* labels,
326 std::vector<string16>* icons,
327 std::vector<int>* unique_ids) const;
328
329 // Parses the forms using heuristic matching and querying the Autofill server.
330 void ParseForms(const std::vector<FormData>& forms);
331
332 // Imports the form data, submitted by the user, into |personal_data_|.
333 void ImportFormData(const FormStructure& submitted_form);
334
335 // If |initial_interaction_timestamp_| is unset or is set to a later time than
336 // |interaction_timestamp|, updates the cached timestamp. The latter check is
337 // needed because IPC messages can arrive out of order.
338 void UpdateInitialInteractionTimestamp(
339 const base::TimeTicks& interaction_timestamp);
340
341 // Send our current field type predictions to the renderer. This is a no-op if
342 // the appropriate command-line flag is not set.
343 void SendAutofillTypePredictions(
344 const std::vector<FormStructure*>& forms) const;
345
346 autofill::AutofillManagerDelegate* const manager_delegate_;
347
348 // The personal data manager, used to save and load personal data to/from the
349 // web database. This is overridden by the AutofillManagerTest.
350 // Weak reference.
351 // May be NULL. NULL indicates OTR.
352 PersonalDataManager* personal_data_;
353
354 std::list<std::string> autofilled_form_signatures_;
355
356 // Handles queries and uploads to Autofill servers.
357 AutofillDownloadManager download_manager_;
358
359 // Should be set to true in AutofillManagerTest and other tests, false in
360 // AutofillDownloadManagerTest and in non-test environment. Is false by
361 // default for the public constructor, and true by default for the test-only
362 // constructors.
363 bool disable_download_manager_requests_;
364
365 // Handles single-field autocomplete form data.
366 AutocompleteHistoryManager autocomplete_history_manager_;
367
368 // Handles autocheckout flows.
369 autofill::AutocheckoutManager autocheckout_manager_;
370
371 // For logging UMA metrics. Overridden by metrics tests.
372 scoped_ptr<const AutofillMetrics> metric_logger_;
373 // Have we logged whether Autofill is enabled for this page load?
374 bool has_logged_autofill_enabled_;
375 // Have we logged an address suggestions count metric for this page?
376 bool has_logged_address_suggestions_count_;
377 // Have we shown Autofill suggestions at least once?
378 bool did_show_suggestions_;
379 // Has the user manually edited at least one form field among the autofillable
380 // ones?
381 bool user_did_type_;
382 // Has the user autofilled a form on this page?
383 bool user_did_autofill_;
384 // Has the user edited a field that was previously autofilled?
385 bool user_did_edit_autofilled_field_;
386 // When the page finished loading.
387 base::TimeTicks forms_loaded_timestamp_;
388 // When the user first interacted with a potentially fillable form on this
389 // page.
390 base::TimeTicks initial_interaction_timestamp_;
391 // If password generation is enabled. We cache this value so that we don't
392 // spam the renderer with messages during startup when the sync state
393 // is changing rapidly.
394 bool password_generation_enabled_;
395 // Listens for changes to the 'enabled' state for password generation.
396 PrefChangeRegistrar registrar_;
397
398 // To be passed to the password generation UI to generate the password.
399 scoped_ptr<autofill::PasswordGenerator> password_generator_;
400
401 // Our copy of the form data.
402 ScopedVector<FormStructure> form_structures_;
403
404 // GUID to ID mapping. We keep two maps to convert back and forth.
405 mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_;
406 mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_;
407
408 // Delegate to perform external processing (display, selection) on
409 // our behalf. Weak.
410 AutofillExternalDelegate* external_delegate_;
411
412 base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
413
414 friend class AutofillManagerTest;
415 friend class FormStructureBrowserTest;
416 FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
417 DeterminePossibleFieldTypesForUpload);
418 FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
419 DeterminePossibleFieldTypesForUploadStressTest);
420 FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
421 DisabledAutofillDispatchesError);
422 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
423 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
424 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement);
425 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration);
426 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
427 NoQualityMetricsForNonAutofillableForms);
428 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics);
429 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure);
430 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId);
431 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch);
432 FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate);
433 FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
434 TestTabContentsWithExternalDelegate);
435 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
436 UserHappinessFormLoadAndSubmission);
437 FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction);
438
439 DISALLOW_COPY_AND_ASSIGN(AutofillManager);
440 };
441
442 #endif // CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc ('k') | chrome/browser/autofill/autofill_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698