1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <list>
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map>
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <string>
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#ifdef ANDROID
15a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#include "base/base_api.h"
16a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#endif
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/basictypes.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/compiler_specific.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/gtest_prod_util.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string16.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_download.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/field_types.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/form_structure.h"
26cfb4826edae011aed657a813297687800ed85e17Kristian Monsen#ifndef ANDROID
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/navigation_controller.h"
28cfb4826edae011aed657a813297687800ed85e17Kristian Monsen#endif
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_observer.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillField;
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillProfile;
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutofillMetrics;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CreditCard;
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass PersonalDataManager;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService;
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass RenderViewHost;
38e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsenclass TabContents;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch#ifdef ANDROID
41ec088f53b6595e64df8841a817706e6d086cb17cBen Murdochclass AutoFillHost;
42ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch#endif
43cfb4826edae011aed657a813297687800ed85e17Kristian Monsen
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct ViewHostMsg_FrameNavigate_Params;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace IPC {
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass Message;
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
49ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct FormData;
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct FormField;
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Manages saving and restoring the user's personal information entered into web
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// forms.
57a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsenclass
58a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#ifdef ANDROID
59a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian MonsenBASE_API
60a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#endif
61a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian MonsenAutofillManager : public TabContentsObserver,
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        public AutofillDownloadManager::Observer {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit AutofillManager(TabContents* tab_contents);
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~AutofillManager();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
676e1a1d3242a4de2a633c62ba45948dd2d0620990Kristian Monsen#ifndef ANDROID
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Registers our browser prefs.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterBrowserPrefs(PrefService* prefs);
706e1a1d3242a4de2a633c62ba45948dd2d0620990Kristian Monsen#endif
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
726e1a1d3242a4de2a633c62ba45948dd2d0620990Kristian Monsen#ifndef ANDROID
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Registers our Enable/Disable Autofill pref.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterUserPrefs(PrefService* prefs);
756e1a1d3242a4de2a633c62ba45948dd2d0620990Kristian Monsen#endif
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#ifndef ANDROID
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TabContentsObserver implementation.
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void DidNavigateMainFramePostCommit(
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const NavigationController::LoadCommittedDetails& details,
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ViewHostMsg_FrameNavigate_Params& params);
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnMessageReceived(const IPC::Message& message);
83e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#endif
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // AutofillDownloadManager::Observer implementation:
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnLoadedAutofillHeuristics(const std::string& heuristic_xml);
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnUploadedAutofillHeuristics(const std::string& form_signature);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnHeuristicsRequestError(
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string& form_signature,
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutofillDownloadManager::AutofillRequestType request_type,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int http_error);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the value of the AutofillEnabled pref.
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsAutofillEnabled() const;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Imports the form data, submitted by the user, into |personal_data_|.
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ImportFormData(const FormStructure& submitted_form);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Uploads the form data to the Autofill server.
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void UploadFormData(const FormStructure& submitted_form);
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Reset cache.
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Reset();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#ifdef ANDROID
106e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen  void OnFormsSeenWrapper(const std::vector<webkit_glue::FormData>& forms) {
107e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen    OnFormsSeen(forms);
108e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen  }
109e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen
110307db3d811ae8f73246af95b9bf4e4a5f82f65ebBen Murdoch  bool OnQueryFormFieldAutoFillWrapper(const webkit_glue::FormData& form,
111e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen                                       const webkit_glue::FormField& field) {
112cfb4826edae011aed657a813297687800ed85e17Kristian Monsen    return OnQueryFormFieldAutofill(0, form, field);
113e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen  }
114e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen
115e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen  void OnFillAutoFillFormDataWrapper(int query_id,
116e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen                                     const webkit_glue::FormData& form,
117e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen                                     const webkit_glue::FormField& field,
118e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen                                     int unique_id) {
119cfb4826edae011aed657a813297687800ed85e17Kristian Monsen    OnFillAutofillFormData(query_id, form, field, unique_id);
120e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen  }
121e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#endif
122e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For tests:
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The string/int pair is composed of the guid string and variant index
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // respectively.  The variant index is an index into the multi-valued item
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // (where applicable).
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::pair<std::string, size_t> GUIDPair;
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutofillManager(TabContents* tab_contents,
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  PersonalDataManager* personal_data);
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_personal_data_manager(PersonalDataManager* personal_data) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    personal_data_ = personal_data;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_metric_logger(const AutofillMetrics* metric_logger);
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Maps GUIDs to and from IDs that are used to identify profiles and credit
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // cards sent to and from the renderer process.
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GUIDToID(const GUIDPair& guid);
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const GUIDPair IDToGUID(int id);
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Methods for packing and unpacking credit card and profile IDs for sending
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // and receiving to and from the renderer process.
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid);
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UnpackGUIDs(int id, GUIDPair* cc_guid, GUIDPair* profile_guid);
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnFormSubmitted(const webkit_glue::FormData& form);
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnFormsSeen(const std::vector<webkit_glue::FormData>& forms);
156e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#ifdef ANDROID
157cfb4826edae011aed657a813297687800ed85e17Kristian Monsen  bool
158e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#else
159cfb4826edae011aed657a813297687800ed85e17Kristian Monsen  void
160e673c43ad7cf68f9dfcc0e8b797a5c1b38e2fa63Kristian Monsen#endif
161cfb4826edae011aed657a813297687800ed85e17Kristian Monsen  OnQueryFormFieldAutofill(int query_id,
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const webkit_glue::FormData& form,
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const webkit_glue::FormField& field);
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnFillAutofillFormData(int query_id,
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              const webkit_glue::FormData& form,
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              const webkit_glue::FormField& field,
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              int unique_id);
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnShowAutofillDialog();
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnDidFillAutofillFormData();
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnDidShowAutofillSuggestions();
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Fills |host| with the RenderViewHost for this tab.
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns false if Autofill is disabled or if the host is unavailable.
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetHost(const std::vector<AutofillProfile*>& profiles,
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch               const std::vector<CreditCard*>& credit_cards,
176ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch#ifdef ANDROID
177ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch               AutoFillHost** host) WARN_UNUSED_RESULT;
178ec088f53b6595e64df8841a817706e6d086cb17cBen Murdoch#else
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               RenderViewHost** host) const WARN_UNUSED_RESULT;
180cfb4826edae011aed657a813297687800ed85e17Kristian Monsen#endif
181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Fills |form_structure| cached element corresponding to |form|.
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns false if the cached element was not found.
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool FindCachedForm(const webkit_glue::FormData& form,
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      FormStructure** form_structure) const WARN_UNUSED_RESULT;
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
187201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Fills |form_structure| and |autofill_field| with the cached elements
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // corresponding to |form| and |field|. Returns false if the cached elements
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // were not found.
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool FindCachedFormAndField(
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const webkit_glue::FormData& form,
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const webkit_glue::FormField& field,
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      FormStructure** form_structure,
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutofillField** autofill_field) WARN_UNUSED_RESULT;
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a list of values from the stored profiles that match |type| and the
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // value of |field| and returns the labels of the matching profiles. |labels|
198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // is filled with the Profile label.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetProfileSuggestions(FormStructure* form,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const webkit_glue::FormField& field,
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             AutofillFieldType type,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             std::vector<string16>* values,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             std::vector<string16>* labels,
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             std::vector<string16>* icons,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             std::vector<int>* unique_ids);
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a list of values from the stored credit cards that match |type| and
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the value of |field| and returns the labels of the matching credit cards.
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetCreditCardSuggestions(FormStructure* form,
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const webkit_glue::FormField& field,
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                AutofillFieldType type,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                std::vector<string16>* values,
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                std::vector<string16>* labels,
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                std::vector<string16>* icons,
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                std::vector<int>* unique_ids);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set |field| argument's value based on |type| and contents of the
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |credit_card|.
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void FillCreditCardFormField(const CreditCard* credit_card,
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               AutofillFieldType type,
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               webkit_glue::FormField* field);
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set |field| argument's value based on |type| and contents of the |profile|.
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The |variant| parameter specifies which value in a multi-valued profile.
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FillFormField(const AutofillProfile* profile,
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     AutofillFieldType type,
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     size_t variant,
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     webkit_glue::FormField* field);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Set |field| argument's value for phone/fax number based on contents of the
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |profile|. |type| is the type of the phone.
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The |variant| parameter specifies which value in a multi-valued profile.
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FillPhoneNumberField(const AutofillProfile* profile,
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            AutofillFieldType type,
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            size_t variant,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            webkit_glue::FormField* field);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Parses the forms using heuristic matching and querying the Autofill server.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ParseForms(const std::vector<webkit_glue::FormData>& forms);
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Uses existing personal data to determine possible field types for the
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |submitted_form|.
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DeterminePossibleFieldTypesForUpload(FormStructure* submitted_form);
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The personal data manager, used to save and load personal data to/from the
246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // web database.  This is overridden by the AutofillManagerTest.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Weak reference.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // May be NULL.  NULL indicates OTR.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PersonalDataManager* personal_data_;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::list<std::string> autofilled_forms_signatures_;
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Handles queries and uploads to Autofill servers.
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutofillDownloadManager download_manager_;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Should be set to true in AutofillManagerTest and other tests, false in
256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // AutofillDownloadManagerTest and in non-test environment. Is false by
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // default for the public constructor, and true by default for the test-only
25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // constructors.
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool disable_download_manager_requests_;
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // For logging UMA metrics. Overridden by metrics tests.
262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<const AutofillMetrics> metric_logger_;
26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Have we logged whether Autofill is enabled for this page load?
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool has_logged_autofill_enabled_;
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Have we logged an address suggestions count metric for this page?
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool has_logged_address_suggestions_count_;
2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Our copy of the form data.
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ScopedVector<FormStructure> form_structures_;
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // GUID to ID mapping.  We keep two maps to convert back and forth.
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<GUIDPair, int> guid_id_map_;
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<int, GUIDPair> id_guid_map_;
276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class AutofillManagerTest;
278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  friend class FormStructureBrowserTest;
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardForm);
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           FillCreditCardFormNoYearNoMonth);
282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearNoMonth);
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormNoYearMonth);
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearMonth);
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressForm);
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressAndCreditCardForm);
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleSections);
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleEmails);
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAutofilledForm);
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillPhoneNumber);
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesRemoveField);
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesAddField);
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmitted);
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmittedServerTypes);
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           NoQualityMetricsForNonAutofillableForms);
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics);
300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure);
301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId);
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch);
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutofillManager);
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_
308