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