// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_ #define CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_ #pragma once #include <list> #include <map> #include <string> #include <vector> #ifdef ANDROID #include "base/base_api.h" #endif #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/string16.h" #include "chrome/browser/autofill/autofill_download.h" #include "chrome/browser/autofill/field_types.h" #include "chrome/browser/autofill/form_structure.h" #ifndef ANDROID #include "content/browser/tab_contents/navigation_controller.h" #endif #include "content/browser/tab_contents/tab_contents_observer.h" class AutofillField; class AutofillProfile; class AutofillMetrics; class CreditCard; class PersonalDataManager; class PrefService; class RenderViewHost; class TabContents; #ifdef ANDROID class AutoFillHost; #endif struct ViewHostMsg_FrameNavigate_Params; namespace IPC { class Message; } namespace webkit_glue { struct FormData; struct FormField; } // Manages saving and restoring the user's personal information entered into web // forms. class #ifdef ANDROID BASE_API #endif AutofillManager : public TabContentsObserver, public AutofillDownloadManager::Observer { public: explicit AutofillManager(TabContents* tab_contents); virtual ~AutofillManager(); #ifndef ANDROID // Registers our browser prefs. static void RegisterBrowserPrefs(PrefService* prefs); #endif #ifndef ANDROID // Registers our Enable/Disable Autofill pref. static void RegisterUserPrefs(PrefService* prefs); #endif #ifndef ANDROID // TabContentsObserver implementation. virtual void DidNavigateMainFramePostCommit( const NavigationController::LoadCommittedDetails& details, const ViewHostMsg_FrameNavigate_Params& params); virtual bool OnMessageReceived(const IPC::Message& message); #endif // AutofillDownloadManager::Observer implementation: virtual void OnLoadedAutofillHeuristics(const std::string& heuristic_xml); virtual void OnUploadedAutofillHeuristics(const std::string& form_signature); virtual void OnHeuristicsRequestError( const std::string& form_signature, AutofillDownloadManager::AutofillRequestType request_type, int http_error); // Returns the value of the AutofillEnabled pref. virtual bool IsAutofillEnabled() const; // Imports the form data, submitted by the user, into |personal_data_|. void ImportFormData(const FormStructure& submitted_form); // Uploads the form data to the Autofill server. void UploadFormData(const FormStructure& submitted_form); // Reset cache. void Reset(); #ifdef ANDROID void OnFormsSeenWrapper(const std::vector<webkit_glue::FormData>& forms) { OnFormsSeen(forms); } bool OnQueryFormFieldAutoFillWrapper(const webkit_glue::FormData& form, const webkit_glue::FormField& field) { return OnQueryFormFieldAutofill(0, form, field); } void OnFillAutoFillFormDataWrapper(int query_id, const webkit_glue::FormData& form, const webkit_glue::FormField& field, int unique_id) { OnFillAutofillFormData(query_id, form, field, unique_id); } #endif protected: // For tests: // The string/int pair is composed of the guid string and variant index // respectively. The variant index is an index into the multi-valued item // (where applicable). typedef std::pair<std::string, size_t> GUIDPair; AutofillManager(TabContents* tab_contents, PersonalDataManager* personal_data); void set_personal_data_manager(PersonalDataManager* personal_data) { personal_data_ = personal_data; } const AutofillMetrics* metric_logger() const { return metric_logger_.get(); } void set_metric_logger(const AutofillMetrics* metric_logger); ScopedVector<FormStructure>* form_structures() { return &form_structures_; } // Maps GUIDs to and from IDs that are used to identify profiles and credit // cards sent to and from the renderer process. virtual int GUIDToID(const GUIDPair& guid); virtual const GUIDPair IDToGUID(int id); // Methods for packing and unpacking credit card and profile IDs for sending // and receiving to and from the renderer process. int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid); void UnpackGUIDs(int id, GUIDPair* cc_guid, GUIDPair* profile_guid); private: void OnFormSubmitted(const webkit_glue::FormData& form); void OnFormsSeen(const std::vector<webkit_glue::FormData>& forms); #ifdef ANDROID bool #else void #endif OnQueryFormFieldAutofill(int query_id, const webkit_glue::FormData& form, const webkit_glue::FormField& field); void OnFillAutofillFormData(int query_id, const webkit_glue::FormData& form, const webkit_glue::FormField& field, int unique_id); void OnShowAutofillDialog(); void OnDidFillAutofillFormData(); void OnDidShowAutofillSuggestions(); // Fills |host| with the RenderViewHost for this tab. // Returns false if Autofill is disabled or if the host is unavailable. bool GetHost(const std::vector<AutofillProfile*>& profiles, const std::vector<CreditCard*>& credit_cards, #ifdef ANDROID AutoFillHost** host) WARN_UNUSED_RESULT; #else RenderViewHost** host) const WARN_UNUSED_RESULT; #endif // Fills |form_structure| cached element corresponding to |form|. // Returns false if the cached element was not found. bool FindCachedForm(const webkit_glue::FormData& form, FormStructure** form_structure) const WARN_UNUSED_RESULT; // Fills |form_structure| and |autofill_field| with the cached elements // corresponding to |form| and |field|. Returns false if the cached elements // were not found. bool FindCachedFormAndField( const webkit_glue::FormData& form, const webkit_glue::FormField& field, FormStructure** form_structure, AutofillField** autofill_field) WARN_UNUSED_RESULT; // Returns a list of values from the stored profiles that match |type| and the // value of |field| and returns the labels of the matching profiles. |labels| // is filled with the Profile label. void GetProfileSuggestions(FormStructure* form, const webkit_glue::FormField& field, AutofillFieldType type, std::vector<string16>* values, std::vector<string16>* labels, std::vector<string16>* icons, std::vector<int>* unique_ids); // Returns a list of values from the stored credit cards that match |type| and // the value of |field| and returns the labels of the matching credit cards. void GetCreditCardSuggestions(FormStructure* form, const webkit_glue::FormField& field, AutofillFieldType type, std::vector<string16>* values, std::vector<string16>* labels, std::vector<string16>* icons, std::vector<int>* unique_ids); // Set |field| argument's value based on |type| and contents of the // |credit_card|. void FillCreditCardFormField(const CreditCard* credit_card, AutofillFieldType type, webkit_glue::FormField* field); // Set |field| argument's value based on |type| and contents of the |profile|. // The |variant| parameter specifies which value in a multi-valued profile. void FillFormField(const AutofillProfile* profile, AutofillFieldType type, size_t variant, webkit_glue::FormField* field); // Set |field| argument's value for phone/fax number based on contents of the // |profile|. |type| is the type of the phone. // The |variant| parameter specifies which value in a multi-valued profile. void FillPhoneNumberField(const AutofillProfile* profile, AutofillFieldType type, size_t variant, webkit_glue::FormField* field); // Parses the forms using heuristic matching and querying the Autofill server. void ParseForms(const std::vector<webkit_glue::FormData>& forms); // Uses existing personal data to determine possible field types for the // |submitted_form|. void DeterminePossibleFieldTypesForUpload(FormStructure* submitted_form); // The personal data manager, used to save and load personal data to/from the // web database. This is overridden by the AutofillManagerTest. // Weak reference. // May be NULL. NULL indicates OTR. PersonalDataManager* personal_data_; std::list<std::string> autofilled_forms_signatures_; // Handles queries and uploads to Autofill servers. AutofillDownloadManager download_manager_; // Should be set to true in AutofillManagerTest and other tests, false in // AutofillDownloadManagerTest and in non-test environment. Is false by // default for the public constructor, and true by default for the test-only // constructors. bool disable_download_manager_requests_; // For logging UMA metrics. Overridden by metrics tests. scoped_ptr<const AutofillMetrics> metric_logger_; // Have we logged whether Autofill is enabled for this page load? bool has_logged_autofill_enabled_; // Have we logged an address suggestions count metric for this page? bool has_logged_address_suggestions_count_; // Our copy of the form data. ScopedVector<FormStructure> form_structures_; // GUID to ID mapping. We keep two maps to convert back and forth. std::map<GUIDPair, int> guid_id_map_; std::map<int, GUIDPair> id_guid_map_; friend class AutofillManagerTest; friend class FormStructureBrowserTest; FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardForm); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormNoYearNoMonth); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearNoMonth); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormNoYearMonth); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillCreditCardFormYearMonth); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressForm); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAddressAndCreditCardForm); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleSections); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillFormWithMultipleEmails); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillAutofilledForm); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillPhoneNumber); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesRemoveField); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormChangesAddField); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmitted); FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FormSubmittedServerTypes); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, NoQualityMetricsForNonAutofillableForms); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId); FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch); DISALLOW_COPY_AND_ASSIGN(AutofillManager); }; #endif // CHROME_BROWSER_AUTOFILL_AUTOFILL_MANAGER_H_