1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autocomplete_history_manager.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_download.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager_delegate.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/forms_seen_state.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFormElement.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RectF;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillDriver;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillDataModel;
51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class AutofillDownloadManager;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillExternalDelegate;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillField;
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerDelegate;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegate;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillMetrics;
573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillProfile;
583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillType;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CreditCard;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FormStructureBrowserTest;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormData;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormFieldData;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordFormFillData;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages saving and restoring the user's personal information entered into web
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forms.
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillManager : public AutofillDownloadManager::Observer {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  enum AutofillDownloadManagerState {
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ENABLE_AUTOFILL_DOWNLOAD_MANAGER,
72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DISABLE_AUTOFILL_DOWNLOAD_MANAGER,
73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers our Enable/Disable Autofill pref.
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillManager(AutofillDriver* driver,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  autofill::AutofillManagerDelegate* delegate,
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  const std::string& app_locale,
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  AutofillDownloadManagerState enable_download_manager);
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~AutofillManager();
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Sets an external delegate.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExternalDelegate(AutofillExternalDelegate* delegate);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called from our external delegate so they cannot be private.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFillAutofillFormData(int query_id,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const FormData& form,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const FormFieldData& field,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int unique_id);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDidShowAutofillSuggestions(bool is_new_popup);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDidFillAutofillFormData(const base::TimeTicks& timestamp);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnShowAutofillDialog();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDidPreviewAutofillFormData();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the credit card or Autofill profile that matches |unique_id|
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the database.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAutofillProfileOrCreditCard(int unique_id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the specified Autocomplete entry.
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemoveAutocompleteEntry(const base::string16& name,
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const base::string16& value);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the present form structures seen by Autofill manager.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<FormStructure*>& GetFormStructures();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Happens when the autocomplete dialog runs its callback when being closed.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RequestAutocompleteDialogClosed();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill::AutofillManagerDelegate* delegate() const {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return manager_delegate_;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string& app_locale() const { return app_locale_; }
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only for testing.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTestDelegate(autofill::AutofillManagerTestDelegate* delegate);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnFormsSeen(const std::vector<FormData>& forms,
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   const base::TimeTicks& timestamp,
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   autofill::FormsSeenState state);
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Processes the submitted |form|, saving any new Autofill data and uploading
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the possible field types for the submitted fields to the crowdsourcing
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // server.  Returns false if this form is not relevant for Autofill.
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool OnFormSubmitted(const FormData& form,
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const base::TimeTicks& timestamp);
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnTextFieldDidChange(const FormData& form,
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const FormFieldData& field,
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const base::TimeTicks& timestamp);
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The |bounding_box| is a window relative value.
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnQueryFormFieldAutofill(int query_id,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const FormData& form,
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const FormFieldData& field,
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const gfx::RectF& bounding_box,
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                bool display_warning);
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnDidEndTextFieldEditing();
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void OnHideAutofillUI();
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnAddPasswordFormMapping(
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const FormFieldData& form,
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const PasswordFormFillData& fill_data);
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnShowPasswordSuggestions(
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const FormFieldData& field,
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::RectF& bounds,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::vector<base::string16>& suggestions,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::vector<base::string16>& realms);
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnSetDataList(const std::vector<base::string16>& values,
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     const std::vector<base::string16>& labels);
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Try and upload |form|. This differs from OnFormSubmitted() in a few ways.
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //   - This function will only label the first <input type="password"> field
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     as ACCOUNT_CREATION_PASSWORD. Other fields will stay unlabeled, as they
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     should have been labeled during the upload for OnFormSubmitted().
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //   - This function does not assume that |form| is being uploaded during
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     the same browsing session as it was originally submitted (as we may
159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     not have the necessary information to classify the form at that time)
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     so it bypasses the cache and doesn't log the same quality UMA metrics.
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool UploadPasswordGenerationForm(const FormData& form);
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Resets cache.
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Reset();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the value of the AutofillEnabled pref.
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual bool IsAutofillEnabled() const;
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test code should prefer to use this constructor.
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillManager(AutofillDriver* driver,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  autofill::AutofillManagerDelegate* delegate,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PersonalDataManager* personal_data);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uploads the form data to the Autofill server.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormData(const FormStructure& submitted_form);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs quality metrics for the |submitted_form| and uploads the form data
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the crowdsourcing server, if appropriate.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormDataAsyncCallback(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FormStructure* submitted_form,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& load_time,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& interaction_time,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& submission_time);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps GUIDs to and from IDs that are used to identify profiles and credit
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cards sent to and from the renderer process.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GUIDToID(const PersonalDataManager::GUIDPair& guid) const;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods for packing and unpacking credit card and profile IDs for sending
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and receiving to and from the renderer process.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                const PersonalDataManager::GUIDPair& profile_guid) const;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnpackGUIDs(int id,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   PersonalDataManager::GUIDPair* cc_guid,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   PersonalDataManager::GUIDPair* profile_guid) const;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_metric_logger(const AutofillMetrics* metric_logger);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exposed for testing.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillExternalDelegate* external_delegate() {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return external_delegate_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutofillDownloadManager::Observer:
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLoadedServerPredictions(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& response_xml) OVERRIDE;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns false if Autofill is disabled or if no Autofill data is available.
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool RefreshDataModels() const;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unpacks |unique_id| and fills |form_group| and |variant| with the
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // appropriate data source and variant index.  Returns false if the unpacked
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // id cannot be found.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetProfileOrCreditCard(int unique_id,
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const AutofillDataModel** data_model,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t* variant) const WARN_UNUSED_RESULT;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills |form_structure| cached element corresponding to |form|.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the cached element was not found.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindCachedForm(const FormData& form,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      FormStructure** form_structure) const WARN_UNUSED_RESULT;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills |form_structure| and |autofill_field| with the cached elements
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding to |form| and |field|.  This might have the side-effect of
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the cache.  Returns false if the |form| is not autofillable, or if
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it is not already present in the cache and the cache is full.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetCachedFormAndField(const FormData& form,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const FormFieldData& field,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FormStructure** form_structure,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             AutofillField** autofill_field) WARN_UNUSED_RESULT;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-parses |live_form| and adds the result to |form_structures_|.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |cached_form| should be a pointer to the existing version of the form, or
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL if no cached version exists.  The updated form is then written into
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |updated_form|.  Returns false if the cache could not be updated.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdateCachedForm(const FormData& live_form,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const FormStructure* cached_form,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        FormStructure** updated_form) WARN_UNUSED_RESULT;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of values from the stored profiles that match |type| and the
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value of |field| and returns the labels of the matching profiles. |labels|
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is filled with the Profile label.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetProfileSuggestions(FormStructure* form,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const FormFieldData& field,
2513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                             const AutofillType& type,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* values,
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* labels,
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* icons,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<int>* unique_ids) const;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of values from the stored credit cards that match |type| and
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the value of |field| and returns the labels of the matching credit cards.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetCreditCardSuggestions(const FormFieldData& field,
2603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                const AutofillType& type,
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* values,
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* labels,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* icons,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                std::vector<int>* unique_ids) const;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses the forms using heuristic matching and querying the Autofill server.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ParseForms(const std::vector<FormData>& forms);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Imports the form data, submitted by the user, into |personal_data_|.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportFormData(const FormStructure& submitted_form);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |initial_interaction_timestamp_| is unset or is set to a later time than
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |interaction_timestamp|, updates the cached timestamp.  The latter check is
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed because IPC messages can arrive out of order.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateInitialInteractionTimestamp(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& interaction_timestamp);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Shared code to determine if |form| should be uploaded.
279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool ShouldUploadForm(const FormStructure& form);
280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Provides driver-level context to the shared code of the component. Must
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // outlive this object.
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillDriver* driver_;
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill::AutofillManagerDelegate* const manager_delegate_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string app_locale_;
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The personal data manager, used to save and load personal data to/from the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // web database.  This is overridden by the AutofillManagerTest.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak reference.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May be NULL.  NULL indicates OTR.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PersonalDataManager* personal_data_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string> autofilled_form_signatures_;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Handles queries and uploads to Autofill servers. Will be NULL if
298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // the download manager functionality is disabled.
299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<AutofillDownloadManager> download_manager_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles single-field autocomplete form data.
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<AutocompleteHistoryManager> autocomplete_history_manager_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For logging UMA metrics. Overridden by metrics tests.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<const AutofillMetrics> metric_logger_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we logged whether Autofill is enabled for this page load?
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_logged_autofill_enabled_;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we logged an address suggestions count metric for this page?
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_logged_address_suggestions_count_;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we shown Autofill suggestions at least once?
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_show_suggestions_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user manually edited at least one form field among the autofillable
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ones?
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_type_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user autofilled a form on this page?
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_autofill_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user edited a field that was previously autofilled?
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_edit_autofilled_field_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the page finished loading.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks forms_loaded_timestamp_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the user first interacted with a potentially fillable form on this
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks initial_interaction_timestamp_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our copy of the form data.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure> form_structures_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GUID to ID mapping.  We keep two maps to convert back and forth.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_;
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate to perform external processing (display, selection) on
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // our behalf.  Weak.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillExternalDelegate* external_delegate_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delegate used in test to get notifications on certain events.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill::AutofillManagerTestDelegate* test_delegate_;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AutofillManagerTest;
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class autofill::FormStructureBrowserTest;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DeterminePossibleFieldTypesForUpload);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DeterminePossibleFieldTypesForUploadStressTest);
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           DisabledAutofillDispatchesError);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NoQualityMetricsForNonAutofillableForms);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestTabContentsWithExternalDelegate);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           UserHappinessFormLoadAndSubmission);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction);
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FormSubmittedAutocompleteEnabled);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManager);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
373