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"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/autofill/core/browser/autofill_client.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/autofill/core/browser/autofill_download_manager.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/core/browser/autofill_driver.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RectF;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillDataModel;
49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class AutofillDownloadManager;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillExternalDelegate;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillField;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AutofillClient;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegate;
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillMetrics;
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillProfile;
563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillType;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CreditCard;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FormStructureBrowserTest;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormData;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormFieldData;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordFormFillData;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages saving and restoring the user's personal information entered into web
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forms.
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillManager : public AutofillDownloadManager::Observer {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  enum AutofillDownloadManagerState {
69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ENABLE_AUTOFILL_DOWNLOAD_MANAGER,
70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DISABLE_AUTOFILL_DOWNLOAD_MANAGER,
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers our Enable/Disable Autofill pref.
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS)
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void MigrateUserPrefs(PrefService* prefs);
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillManager(AutofillDriver* driver,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  AutofillClient* client,
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  const std::string& app_locale,
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  AutofillDownloadManagerState enable_download_manager);
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~AutofillManager();
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Sets an external delegate.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExternalDelegate(AutofillExternalDelegate* delegate);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ShowAutofillSettings();
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Whether the field represented by |fieldData| should show an entry to prompt
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the user to give Chrome access to the user's address book.
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool ShouldShowAccessAddressBookSuggestion(const FormData& data,
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                             const FormFieldData& field_data);
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If Chrome has not prompted for access to the user's address book, the
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // method prompts the user for permission and blocks the process. Otherwise,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // this method has no effect. The return value reflects whether the user was
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // prompted with a modal dialog.
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool AccessAddressBook();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The access Address Book prompt was shown for a form.
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ShowedAccessAddressBookPrompt();
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The number of times that the access address book prompt was shown.
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int AccessAddressBookPromptCount();
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called from our external delegate so they cannot be private.
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void FillOrPreviewForm(AutofillDriver::RendererFormDataAction action,
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 int query_id,
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const FormData& form,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const FormFieldData& field,
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 int unique_id);
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DidShowSuggestions(bool is_new_popup);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDidFillAutofillFormData(const base::TimeTicks& timestamp);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDidPreviewAutofillFormData();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the credit card or Autofill profile that matches |unique_id|
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the database.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAutofillProfileOrCreditCard(int unique_id);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the specified Autocomplete entry.
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemoveAutocompleteEntry(const base::string16& name,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const base::string16& value);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the present form structures seen by Autofill manager.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<FormStructure*>& GetFormStructures();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Happens when the autocomplete dialog runs its callback when being closed.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RequestAutocompleteDialogClosed();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AutofillClient* client() const { return client_; }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string& app_locale() const { return app_locale_; }
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only for testing.
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetTestDelegate(AutofillManagerTestDelegate* delegate);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnFormsSeen(const std::vector<FormData>& forms,
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const base::TimeTicks& timestamp);
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Processes the submitted |form|, saving any new Autofill data and uploading
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the possible field types for the submitted fields to the crowdsourcing
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // server.  Returns false if this form is not relevant for Autofill.
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool OnFormSubmitted(const FormData& form,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const base::TimeTicks& timestamp);
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnTextFieldDidChange(const FormData& form,
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const FormFieldData& field,
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const base::TimeTicks& timestamp);
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The |bounding_box| is a window relative value.
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnQueryFormFieldAutofill(int query_id,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const FormData& form,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const FormFieldData& field,
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const gfx::RectF& bounding_box,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                bool display_warning);
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnDidEndTextFieldEditing();
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnHidePopup();
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnSetDataList(const std::vector<base::string16>& values,
163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     const std::vector<base::string16>& labels);
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Try to label password fields and upload |form|. This differs from
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // OnFormSubmitted() in a few ways.
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //   - This function will only label the first <input type="password"> field
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //     as |password_type|. Other fields will stay unlabeled, as they
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     should have been labeled during the upload for OnFormSubmitted().
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //   - This function does not assume that |form| is being uploaded during
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     the same browsing session as it was originally submitted (as we may
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     not have the necessary information to classify the form at that time)
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //     so it bypasses the cache and doesn't log the same quality UMA metrics.
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool UploadPasswordForm(const FormData& form,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          const ServerFieldType& pasword_type);
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Resets cache.
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Reset();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the value of the AutofillEnabled pref.
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual bool IsAutofillEnabled() const;
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test code should prefer to use this constructor.
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillManager(AutofillDriver* driver,
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  AutofillClient* client,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PersonalDataManager* personal_data);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uploads the form data to the Autofill server.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormData(const FormStructure& submitted_form);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs quality metrics for the |submitted_form| and uploads the form data
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the crowdsourcing server, if appropriate.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormDataAsyncCallback(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FormStructure* submitted_form,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& load_time,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& interaction_time,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& submission_time);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps GUIDs to and from IDs that are used to identify profiles and credit
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cards sent to and from the renderer process.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GUIDToID(const PersonalDataManager::GUIDPair& guid) const;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods for packing and unpacking credit card and profile IDs for sending
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and receiving to and from the renderer process.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                const PersonalDataManager::GUIDPair& profile_guid) const;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnpackGUIDs(int id,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   PersonalDataManager::GUIDPair* cc_guid,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   PersonalDataManager::GUIDPair* profile_guid) const;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_metric_logger(const AutofillMetrics* metric_logger);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exposed for testing.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillExternalDelegate* external_delegate() {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return external_delegate_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutofillDownloadManager::Observer:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLoadedServerPredictions(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& response_xml) OVERRIDE;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns false if Autofill is disabled or if no Autofill data is available.
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool RefreshDataModels() const;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unpacks |unique_id| and fills |form_group| and |variant| with the
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // appropriate data source and variant index. Sets |is_credit_card| to true
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // if |data_model| points to a CreditCard data model, false if it's a
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // profile data model.
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns false if the unpacked id cannot be found.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetProfileOrCreditCard(int unique_id,
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const AutofillDataModel** data_model,
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              size_t* variant,
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              bool* is_credit_card) const WARN_UNUSED_RESULT;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills |form_structure| cached element corresponding to |form|.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the cached element was not found.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindCachedForm(const FormData& form,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      FormStructure** form_structure) const WARN_UNUSED_RESULT;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills |form_structure| and |autofill_field| with the cached elements
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding to |form| and |field|.  This might have the side-effect of
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the cache.  Returns false if the |form| is not autofillable, or if
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it is not already present in the cache and the cache is full.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetCachedFormAndField(const FormData& form,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const FormFieldData& field,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FormStructure** form_structure,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             AutofillField** autofill_field) WARN_UNUSED_RESULT;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-parses |live_form| and adds the result to |form_structures_|.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |cached_form| should be a pointer to the existing version of the form, or
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL if no cached version exists.  The updated form is then written into
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |updated_form|.  Returns false if the cache could not be updated.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdateCachedForm(const FormData& live_form,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const FormStructure* cached_form,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        FormStructure** updated_form) WARN_UNUSED_RESULT;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of values from the stored profiles that match |type| and the
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value of |field| and returns the labels of the matching profiles. |labels|
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is filled with the Profile label.
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void GetProfileSuggestions(const FormStructure& form,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const FormFieldData& field,
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const AutofillField& autofill_field,
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* values,
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* labels,
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::vector<base::string16>* icons,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::vector<int>* unique_ids) const;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of values from the stored credit cards that match |type| and
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the value of |field| and returns the labels of the matching credit cards.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetCreditCardSuggestions(const FormFieldData& field,
2773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                const AutofillType& type,
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* values,
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* labels,
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::vector<base::string16>* icons,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                std::vector<int>* unique_ids) const;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses the forms using heuristic matching and querying the Autofill server.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ParseForms(const std::vector<FormData>& forms);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Imports the form data, submitted by the user, into |personal_data_|.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportFormData(const FormStructure& submitted_form);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |initial_interaction_timestamp_| is unset or is set to a later time than
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |interaction_timestamp|, updates the cached timestamp.  The latter check is
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed because IPC messages can arrive out of order.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateInitialInteractionTimestamp(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& interaction_timestamp);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Shared code to determine if |form| should be uploaded.
296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool ShouldUploadForm(const FormStructure& form);
297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Provides driver-level context to the shared code of the component. Must
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // outlive this object.
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutofillDriver* driver_;
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AutofillClient* const client_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string app_locale_;
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The personal data manager, used to save and load personal data to/from the
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // web database.  This is overridden by the AutofillManagerTest.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak reference.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May be NULL.  NULL indicates OTR.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PersonalDataManager* personal_data_;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string> autofilled_form_signatures_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Handles queries and uploads to Autofill servers. Will be NULL if
315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // the download manager functionality is disabled.
316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<AutofillDownloadManager> download_manager_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles single-field autocomplete form data.
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<AutocompleteHistoryManager> autocomplete_history_manager_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For logging UMA metrics. Overridden by metrics tests.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<const AutofillMetrics> metric_logger_;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we logged whether Autofill is enabled for this page load?
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_logged_autofill_enabled_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we logged an address suggestions count metric for this page?
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_logged_address_suggestions_count_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have we shown Autofill suggestions at least once?
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_show_suggestions_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user manually edited at least one form field among the autofillable
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ones?
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_type_;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user autofilled a form on this page?
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_autofill_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has the user edited a field that was previously autofilled?
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_did_edit_autofilled_field_;
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // When the form finished loading.
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::map<FormData, base::TimeTicks> forms_loaded_timestamps_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the user first interacted with a potentially fillable form on this
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks initial_interaction_timestamp_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our copy of the form data.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure> form_structures_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GUID to ID mapping.  We keep two maps to convert back and forth.
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate to perform external processing (display, selection) on
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // our behalf.  Weak.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillExternalDelegate* external_delegate_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delegate used in test to get notifications on certain events.
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AutofillManagerTestDelegate* test_delegate_;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AutofillManagerTest;
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  friend class FormStructureBrowserTest;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DeterminePossibleFieldTypesForUpload);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DeterminePossibleFieldTypesForUploadStressTest);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           DisabledAutofillDispatchesError);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NoQualityMetricsForNonAutofillableForms);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestTabContentsWithExternalDelegate);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           UserHappinessFormLoadAndSubmission);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction);
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FormSubmittedAutocompleteEnabled);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManager);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
390