| // 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_ |