summaryrefslogtreecommitdiffstats
path: root/components/autofill/core/browser/autofill_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'components/autofill/core/browser/autofill_manager.h')
-rw-r--r--components/autofill/core/browser/autofill_manager.h430
1 files changed, 430 insertions, 0 deletions
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
new file mode 100644
index 0000000..0c47328
--- /dev/null
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -0,0 +1,430 @@
+// Copyright 2013 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 COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_
+
+#include <list>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/callback_forward.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/memory/weak_ptr.h"
+#include "base/strings/string16.h"
+#include "base/time.h"
+#include "components/autofill/content/browser/autocheckout_manager.h"
+#include "components/autofill/core/browser/autocomplete_history_manager.h"
+#include "components/autofill/core/browser/autofill_download.h"
+#include "components/autofill/core/browser/autofill_manager_delegate.h"
+#include "components/autofill/core/browser/field_types.h"
+#include "components/autofill/core/browser/form_structure.h"
+#include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/common/autocheckout_status.h"
+#include "components/autofill/core/common/form_data.h"
+#include "components/autofill/core/common/forms_seen_state.h"
+#include "content/public/common/ssl_status.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFormElement.h"
+
+class GURL;
+
+namespace content {
+class RenderViewHost;
+class WebContents;
+struct FrameNavigateParams;
+struct LoadCommittedDetails;
+}
+
+namespace gfx {
+class Rect;
+class RectF;
+}
+
+namespace IPC {
+class Message;
+}
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+namespace autofill {
+
+class AutofillDriver;
+class AutofillDataModel;
+class AutofillDownloadManager;
+class AutofillExternalDelegate;
+class AutofillField;
+class AutofillProfile;
+class AutofillManagerDelegate;
+class AutofillManagerTestDelegate;
+class AutofillMetrics;
+class CreditCard;
+class FormStructureBrowserTest;
+
+struct FormData;
+struct FormFieldData;
+struct PasswordFormFillData;
+
+// Manages saving and restoring the user's personal information entered into web
+// forms.
+class AutofillManager : public AutofillDownloadManager::Observer {
+ public:
+ enum AutofillDownloadManagerState {
+ ENABLE_AUTOFILL_DOWNLOAD_MANAGER,
+ DISABLE_AUTOFILL_DOWNLOAD_MANAGER,
+ };
+
+ // Registers our Enable/Disable Autofill pref.
+ static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry);
+
+ AutofillManager(AutofillDriver* driver,
+ autofill::AutofillManagerDelegate* delegate,
+ const std::string& app_locale,
+ AutofillDownloadManagerState enable_download_manager);
+ virtual ~AutofillManager();
+
+ // Set an external delegate.
+ void SetExternalDelegate(AutofillExternalDelegate* delegate);
+
+ // Whether browser process will create and own the Autofill popup UI.
+ bool IsNativeUiEnabled();
+
+ // Called from our external delegate so they cannot be private.
+ virtual void OnFillAutofillFormData(int query_id,
+ const FormData& form,
+ const FormFieldData& field,
+ int unique_id);
+ void OnDidShowAutofillSuggestions(bool is_new_popup);
+ void OnDidFillAutofillFormData(const base::TimeTicks& timestamp);
+ void OnShowAutofillDialog();
+ void OnDidPreviewAutofillFormData();
+
+ // Remove the credit card or Autofill profile that matches |unique_id|
+ // from the database.
+ void RemoveAutofillProfileOrCreditCard(int unique_id);
+
+ // Remove the specified Autocomplete entry.
+ void RemoveAutocompleteEntry(const base::string16& name,
+ const base::string16& value);
+
+ // Returns the present web_contents state.
+ content::WebContents* GetWebContents() const;
+
+ // Returns the present form structures seen by Autofill manager.
+ const std::vector<FormStructure*>& GetFormStructures();
+
+ // Causes the dialog for request autocomplete feature to be shown.
+ virtual void ShowRequestAutocompleteDialog(
+ const FormData& form,
+ const GURL& source_url,
+ autofill::DialogType dialog_type,
+ const base::Callback<void(const FormStructure*,
+ const std::string&)>& callback);
+
+ // Happens when the autocomplete dialog runs its callback when being closed.
+ void RequestAutocompleteDialogClosed();
+
+ autofill::AutofillManagerDelegate* delegate() const {
+ return manager_delegate_;
+ }
+
+ const std::string& app_locale() const { return app_locale_; }
+
+ // Only for testing.
+ void SetTestDelegate(autofill::AutofillManagerTestDelegate* delegate);
+
+ // TODO(blundell): Move the logic in these methods into AutofillDriver and
+ // eliminate these methods.
+ virtual void DidNavigateMainFrame(
+ const content::LoadCommittedDetails& details,
+ const content::FrameNavigateParams& params);
+ virtual bool OnMessageReceived(const IPC::Message& message);
+
+ protected:
+ // Test code should prefer to use this constructor.
+ AutofillManager(AutofillDriver* driver,
+ autofill::AutofillManagerDelegate* delegate,
+ PersonalDataManager* personal_data);
+
+ // Returns the value of the AutofillEnabled pref.
+ virtual bool IsAutofillEnabled() const;
+
+ // Uploads the form data to the Autofill server.
+ virtual void UploadFormData(const FormStructure& submitted_form);
+
+ // Reset cache.
+ void Reset();
+
+ // Logs quality metrics for the |submitted_form| and uploads the form data
+ // to the crowdsourcing server, if appropriate.
+ virtual void UploadFormDataAsyncCallback(
+ const FormStructure* submitted_form,
+ const base::TimeTicks& load_time,
+ const base::TimeTicks& interaction_time,
+ const base::TimeTicks& submission_time);
+
+ // Shows the Autocheckout bubble if conditions are right. See comments for
+ // AutocheckoutManager::MaybeShowAutocheckoutBubble. Input element requesting
+ // bubble belongs to |form|. |bounding_box| is the bounding box of the input
+ // field in focus.
+ virtual void OnMaybeShowAutocheckoutBubble(const FormData& form,
+ const gfx::RectF& bounding_box);
+
+ // 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 PersonalDataManager::GUIDPair& guid) const;
+ virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const;
+
+ // Methods for packing and unpacking credit card and profile IDs for sending
+ // and receiving to and from the renderer process.
+ int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid,
+ const PersonalDataManager::GUIDPair& profile_guid) const;
+ void UnpackGUIDs(int id,
+ PersonalDataManager::GUIDPair* cc_guid,
+ PersonalDataManager::GUIDPair* profile_guid) const;
+
+ const AutofillMetrics* metric_logger() const { return metric_logger_.get(); }
+ void set_metric_logger(const AutofillMetrics* metric_logger);
+
+ ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
+
+ // Exposed for testing.
+ AutofillExternalDelegate* external_delegate() {
+ return external_delegate_;
+ }
+
+ // Exposed for testing.
+ autofill::AutocheckoutManager* autocheckout_manager() {
+ return &autocheckout_manager_;
+ }
+
+ // Processes the submitted |form|, saving any new Autofill data and uploading
+ // the possible field types for the submitted fields to the crowdsouring
+ // server. Returns false if this form is not relevant for Autofill.
+ bool OnFormSubmitted(const FormData& form,
+ const base::TimeTicks& timestamp);
+
+ // Tell the renderer the current interactive autocomplete finished.
+ virtual void ReturnAutocompleteResult(
+ WebKit::WebFormElement::AutocompleteResult result,
+ const FormData& form_data);
+
+ private:
+
+ // AutofillDownloadManager::Observer:
+ virtual void OnLoadedServerPredictions(
+ const std::string& response_xml) OVERRIDE;
+
+ void OnFormsSeen(const std::vector<FormData>& forms,
+ const base::TimeTicks& timestamp,
+ autofill::FormsSeenState state);
+ void OnTextFieldDidChange(const FormData& form,
+ const FormFieldData& field,
+ const base::TimeTicks& timestamp);
+
+ // The |bounding_box| is a window relative value.
+ void OnQueryFormFieldAutofill(int query_id,
+ const FormData& form,
+ const FormFieldData& field,
+ const gfx::RectF& bounding_box,
+ bool display_warning);
+ void OnDidEndTextFieldEditing();
+ void OnHideAutofillUi();
+ void OnAddPasswordFormMapping(
+ const FormFieldData& form,
+ const PasswordFormFillData& fill_data);
+ void OnShowPasswordSuggestions(
+ const FormFieldData& field,
+ const gfx::RectF& bounds,
+ const std::vector<base::string16>& suggestions);
+ void OnSetDataList(const std::vector<base::string16>& values,
+ const std::vector<base::string16>& labels,
+ const std::vector<base::string16>& icons,
+ const std::vector<int>& unique_ids);
+
+ // Requests an interactive autocomplete UI be shown.
+ void OnRequestAutocomplete(const FormData& form,
+ const GURL& frame_url);
+
+ // Passes return data for an OnRequestAutocomplete call back to the page.
+ void ReturnAutocompleteData(const FormStructure* result,
+ const std::string& unused_transaction_id);
+
+ // Called to signal clicking an element failed in some way during an
+ // Autocheckout flow.
+ void OnClickFailed(autofill::AutocheckoutStatus status);
+
+ // Returns the matched whitelist URL prefix for the current tab's url.
+ virtual std::string GetAutocheckoutURLPrefix() const;
+
+ // Fills |host| with the RenderViewHost for this tab.
+ // Returns false if Autofill is disabled or if the host is unavailable.
+ bool GetHost(content::RenderViewHost** host) const WARN_UNUSED_RESULT;
+
+ // Unpacks |unique_id| and fills |form_group| and |variant| with the
+ // appropriate data source and variant index. Returns false if the unpacked
+ // id cannot be found.
+ bool GetProfileOrCreditCard(int unique_id,
+ const AutofillDataModel** data_model,
+ size_t* variant) const WARN_UNUSED_RESULT;
+
+ // Fills |form_structure| cached element corresponding to |form|.
+ // Returns false if the cached element was not found.
+ bool FindCachedForm(const FormData& form,
+ FormStructure** form_structure) const WARN_UNUSED_RESULT;
+
+ // Fills |form_structure| and |autofill_field| with the cached elements
+ // corresponding to |form| and |field|. This might have the side-effect of
+ // updating the cache. Returns false if the |form| is not autofillable, or if
+ // it is not already present in the cache and the cache is full.
+ bool GetCachedFormAndField(const FormData& form,
+ const FormFieldData& field,
+ FormStructure** form_structure,
+ AutofillField** autofill_field) WARN_UNUSED_RESULT;
+
+ // Re-parses |live_form| and adds the result to |form_structures_|.
+ // |cached_form| should be a pointer to the existing version of the form, or
+ // NULL if no cached version exists. The updated form is then written into
+ // |updated_form|. Returns false if the cache could not be updated.
+ bool UpdateCachedForm(const FormData& live_form,
+ const FormStructure* cached_form,
+ FormStructure** updated_form) 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 FormFieldData& field,
+ AutofillFieldType type,
+ std::vector<base::string16>* values,
+ std::vector<base::string16>* labels,
+ std::vector<base::string16>* icons,
+ std::vector<int>* unique_ids) const;
+
+ // 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(const FormFieldData& field,
+ AutofillFieldType type,
+ std::vector<base::string16>* values,
+ std::vector<base::string16>* labels,
+ std::vector<base::string16>* icons,
+ std::vector<int>* unique_ids) const;
+
+ // Parses the forms using heuristic matching and querying the Autofill server.
+ void ParseForms(const std::vector<FormData>& forms);
+
+ // Imports the form data, submitted by the user, into |personal_data_|.
+ void ImportFormData(const FormStructure& submitted_form);
+
+ // If |initial_interaction_timestamp_| is unset or is set to a later time than
+ // |interaction_timestamp|, updates the cached timestamp. The latter check is
+ // needed because IPC messages can arrive out of order.
+ void UpdateInitialInteractionTimestamp(
+ const base::TimeTicks& interaction_timestamp);
+
+ // Send our current field type predictions to the renderer. This is a no-op if
+ // the appropriate command-line flag is not set.
+ void SendAutofillTypePredictions(
+ const std::vector<FormStructure*>& forms) const;
+
+ // Provides driver-level context to the shared code of the component. Must
+ // outlive this object.
+ AutofillDriver* driver_;
+
+ autofill::AutofillManagerDelegate* const manager_delegate_;
+
+ std::string app_locale_;
+
+ // 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_form_signatures_;
+
+ // Handles queries and uploads to Autofill servers. Will be NULL if
+ // the download manager functionality is disabled.
+ scoped_ptr<AutofillDownloadManager> download_manager_;
+
+ // Handles single-field autocomplete form data.
+ AutocompleteHistoryManager autocomplete_history_manager_;
+
+ // Handles autocheckout flows.
+ autofill::AutocheckoutManager autocheckout_manager_;
+
+ // 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_;
+ // Have we shown Autofill suggestions at least once?
+ bool did_show_suggestions_;
+ // Has the user manually edited at least one form field among the autofillable
+ // ones?
+ bool user_did_type_;
+ // Has the user autofilled a form on this page?
+ bool user_did_autofill_;
+ // Has the user edited a field that was previously autofilled?
+ bool user_did_edit_autofilled_field_;
+ // When the page finished loading.
+ base::TimeTicks forms_loaded_timestamp_;
+ // When the user first interacted with a potentially fillable form on this
+ // page.
+ base::TimeTicks initial_interaction_timestamp_;
+
+ // Our copy of the form data.
+ ScopedVector<FormStructure> form_structures_;
+
+ // GUID to ID mapping. We keep two maps to convert back and forth.
+ mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_;
+ mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_;
+
+ // Delegate to perform external processing (display, selection) on
+ // our behalf. Weak.
+ AutofillExternalDelegate* external_delegate_;
+
+ // Delegate used in test to get notifications on certain events.
+ autofill::AutofillManagerTestDelegate* test_delegate_;
+
+ base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
+
+ friend class AutofillManagerTest;
+ friend class autofill::FormStructureBrowserTest;
+ FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
+ DeterminePossibleFieldTypesForUpload);
+ FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
+ DeterminePossibleFieldTypesForUploadStressTest);
+ FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
+ DisabledAutofillDispatchesError);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration);
+ 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);
+ FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate);
+ FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
+ TestTabContentsWithExternalDelegate);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest,
+ UserHappinessFormLoadAndSubmission);
+ FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction);
+
+ DISALLOW_COPY_AND_ASSIGN(AutofillManager);
+};
+
+} // namespace autofill
+
+#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_