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

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

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

Powered by Google App Engine
This is Rietveld 408576698