// 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_METRICS_H_ #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_METRICS_H_ #include #include #include "base/basictypes.h" #include "components/autofill/core/browser/autofill_manager_delegate.h" #include "components/autofill/core/browser/field_types.h" namespace base { class TimeDelta; } namespace autofill { class AutofillMetrics { public: // The possible results of an Autocheckout flow. enum AutocheckoutBuyFlowMetric { // The user has initated Autocheckout. The baseline metric. AUTOCHECKOUT_BUY_FLOW_STARTED, // Autocheckout completed successfully. AUTOCHECKOUT_BUY_FLOW_SUCCESS, // Autocheckout failed due to missing server side data. AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING, // Autocheckout failed due to a missing proceed element. AUTOCHECKOUT_BUY_FLOW_MISSING_ADVANCE_ELEMENT, // Autocheckout failed for any number of other reasons, e.g, the proceed // element click failed, the page numbers were not increasing, etc. AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED, // Autocheckout failed due to a missing click element before form filling. AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING, // Autocheckout failed due to a missing click element after form filling. AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING, NUM_AUTOCHECKOUT_BUY_FLOW_METRICS }; // The success or failure of Autocheckout. enum AutocheckoutCompletionStatus { AUTOCHECKOUT_CANCELLED, // The user canceled Autocheckout while it was in // progress. AUTOCHECKOUT_FAILED, // The user canceled out of the dialog after // an Autocheckout failure. AUTOCHECKOUT_SUCCEEDED, // The dialog was closed after Autocheckout // succeeded. }; // The action a user took to dismiss a bubble. enum BubbleMetric { BUBBLE_CREATED = 0, // The bubble was created. BUBBLE_ACCEPTED, // The user accepted, i.e. confirmed, the // bubble. BUBBLE_DISMISSED, // The user dismissed the bubble. BUBBLE_IGNORED, // The user did not interact with the bubble. BUBBLE_COULD_BE_DISPLAYED, // The bubble could be displayed. NUM_BUBBLE_METRICS, }; enum DeveloperEngagementMetric { // Parsed a form that is potentially autofillable. FILLABLE_FORM_PARSED = 0, // Parsed a form that is potentially autofillable and contains at least one // web developer-specified field type hint, a la // http://is.gd/whatwg_autocomplete FILLABLE_FORM_CONTAINS_TYPE_HINTS, NUM_DEVELOPER_ENGAGEMENT_METRICS, }; // The action the user took to dismiss a dialog. enum DialogDismissalAction { DIALOG_ACCEPTED = 0, // The user accepted, i.e. submitted, the dialog. DIALOG_CANCELED, // The user canceled out of the dialog. }; // The state of the Autofill dialog when it was dismissed. enum DialogDismissalState { // The user submitted with no data available to save. DIALOG_ACCEPTED_EXISTING_DATA, // The saved details to Online Wallet on submit. DIALOG_ACCEPTED_SAVE_TO_WALLET, // The saved details to the local Autofill database on submit. DIALOG_ACCEPTED_SAVE_TO_AUTOFILL, // The user submitted without saving any edited sections. DIALOG_ACCEPTED_NO_SAVE, // The user canceled with no edit UI showing. DIALOG_CANCELED_NO_EDITS, // The user canceled with edit UI showing, but no invalid fields. DIALOG_CANCELED_NO_INVALID_FIELDS, // The user canceled with at least one invalid field. DIALOG_CANCELED_WITH_INVALID_FIELDS, NUM_DIALOG_DISMISSAL_STATES }; // The initial state of user that's interacting with a freshly shown Autofill // dialog. enum DialogInitialUserStateMetric { // Could not determine the user's state due to failure to communicate with // the Wallet server. DIALOG_USER_STATE_UNKNOWN = 0, // Not signed in, no verified Autofill profiles. DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL, // Not signed in, has verified Autofill profiles. DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL, // Signed in, no Wallet items, no verified Autofill profiles. DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL, // Signed in, no Wallet items, has verified Autofill profiles. DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL, // Signed in, has Wallet items, no verified Autofill profiles. DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL, // Signed in, has Wallet items, has verified Autofill profiles. DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL, NUM_DIALOG_INITIAL_USER_STATE_METRICS }; // Events related to the Autofill popup shown in a requestAutocomplete or // Autocheckout dialog. enum DialogPopupEvent { // An Autofill popup was shown. DIALOG_POPUP_SHOWN = 0, // The user chose to fill the form with a suggestion from the popup. DIALOG_POPUP_FORM_FILLED, NUM_DIALOG_POPUP_EVENTS }; // For measuring the frequency of security warnings or errors that can come // up as part of the requestAutocomplete flow. enum DialogSecurityMetric { // Baseline metric: The dialog was shown. SECURITY_METRIC_DIALOG_SHOWN = 0, // Credit card requested over non-secure protocol. SECURITY_METRIC_CREDIT_CARD_OVER_HTTP, // Autocomplete data requested from a frame hosted on an origin not matching // the main frame's origin. SECURITY_METRIC_CROSS_ORIGIN_FRAME, NUM_DIALOG_SECURITY_METRICS }; // For measuring how users are interacting with the Autofill dialog UI. enum DialogUiEvent { // Baseline metric: The dialog was shown. DIALOG_UI_SHOWN = 0, // Dialog dismissal actions: DIALOG_UI_ACCEPTED, DIALOG_UI_CANCELED, // Selections within the account switcher: // Switched from a Wallet account to local Autofill data. DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_AUTOFILL, // Switched from local Autofill data to a Wallet account. DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_WALLET, // Switched from one Wallet account to another one. DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_WALLET_ACCOUNT, // The sign-in UI was shown. DIALOG_UI_SIGNIN_SHOWN, // Selecting a different item from a suggestion menu dropdown: DIALOG_UI_EMAIL_SELECTED_SUGGESTION_CHANGED, DIALOG_UI_BILLING_SELECTED_SUGGESTION_CHANGED, DIALOG_UI_CC_BILLING_SELECTED_SUGGESTION_CHANGED, DIALOG_UI_SHIPPING_SELECTED_SUGGESTION_CHANGED, DIALOG_UI_CC_SELECTED_SUGGESTION_CHANGED, // Showing the editing UI for a section of the dialog: DIALOG_UI_EMAIL_EDIT_UI_SHOWN, DIALOG_UI_BILLING_EDIT_UI_SHOWN, DIALOG_UI_CC_BILLING_EDIT_UI_SHOWN, DIALOG_UI_SHIPPING_EDIT_UI_SHOWN, DIALOG_UI_CC_EDIT_UI_SHOWN, // Adding a new item in a section of the dialog: DIALOG_UI_EMAIL_ITEM_ADDED, DIALOG_UI_BILLING_ITEM_ADDED, DIALOG_UI_CC_BILLING_ITEM_ADDED, DIALOG_UI_SHIPPING_ITEM_ADDED, DIALOG_UI_CC_ITEM_ADDED, NUM_DIALOG_UI_EVENTS }; enum InfoBarMetric { INFOBAR_SHOWN = 0, // We showed an infobar, e.g. prompting to save credit // card info. INFOBAR_ACCEPTED, // The user explicitly accepted the infobar. INFOBAR_DENIED, // The user explicitly denied the infobar. INFOBAR_IGNORED, // The user completely ignored the infobar (logged on // tab close). NUM_INFO_BAR_METRICS, }; // Metrics measuring how well we predict field types. Exactly three such // metrics are logged for each fillable field in a submitted form: for // the heuristic prediction, for the crowd-sourced prediction, and for the // overall prediction. enum FieldTypeQualityMetric { TYPE_UNKNOWN = 0, // Offered no prediction. TYPE_MATCH, // Predicted correctly. TYPE_MISMATCH, // Predicted incorrectly. NUM_FIELD_TYPE_QUALITY_METRICS, }; enum QualityMetric { // Logged for each potentially fillable field in a submitted form. FIELD_SUBMITTED = 0, // A simple successs metric, logged for each field that returns true for // |is_autofilled()|. FIELD_AUTOFILLED, // A simple failure metric, logged for each field that returns false for // |is_autofilled()| but has a value that is present in the personal data // manager. FIELD_NOT_AUTOFILLED, // The below are only logged when |FIELD_AUTOFILL_FAILED| is also logged. NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN, NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH, NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH, NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN, NOT_AUTOFILLED_SERVER_TYPE_MATCH, NOT_AUTOFILLED_SERVER_TYPE_MISMATCH, NUM_QUALITY_METRICS, }; // Each of these is logged at most once per query to the server, which in turn // occurs at most once per page load. enum ServerQueryMetric { QUERY_SENT = 0, // Sent a query to the server. QUERY_RESPONSE_RECEIVED, // Received a response. QUERY_RESPONSE_PARSED, // Successfully parsed the server response. // The response was parseable, but provided no improvements relative to our // heuristics. QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS, // Our heuristics detected at least one auto-fillable field, and the server // response overrode the type of at least one field. QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS, // Our heuristics did not detect any auto-fillable fields, but the server // response did detect at least one. QUERY_RESPONSE_WITH_NO_LOCAL_HEURISTICS, NUM_SERVER_QUERY_METRICS, }; // Each of these metrics is logged only for potentially autofillable forms, // i.e. forms with at least three fields, etc. // These are used to derive certain "user happiness" metrics. For example, we // can compute the ratio (USER_DID_EDIT_AUTOFILLED_FIELD / USER_DID_AUTOFILL) // to see how often users have to correct autofilled data. enum UserHappinessMetric { // Loaded a page containing forms. FORMS_LOADED, // Submitted a fillable form -- i.e. one with at least three field values // that match the user's stored Autofill data -- and all matching fields // were autofilled. SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL, // Submitted a fillable form and some (but not all) matching fields were // autofilled. SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME, // Submitted a fillable form and no fields were autofilled. SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE, // Submitted a non-fillable form. SUBMITTED_NON_FILLABLE_FORM, // User manually filled one of the form fields. USER_DID_TYPE, // We showed a popup containing Autofill suggestions. SUGGESTIONS_SHOWN, // Same as above, but only logged once per page load. SUGGESTIONS_SHOWN_ONCE, // User autofilled at least part of the form. USER_DID_AUTOFILL, // Same as above, but only logged once per page load. USER_DID_AUTOFILL_ONCE, // User edited a previously autofilled field. USER_DID_EDIT_AUTOFILLED_FIELD, // Same as above, but only logged once per page load. USER_DID_EDIT_AUTOFILLED_FIELD_ONCE, NUM_USER_HAPPINESS_METRICS, }; // For measuring the network request time of various Wallet API calls. See // WalletClient::RequestType. enum WalletApiCallMetric { UNKNOWN_API_CALL, // Catch all. Should never be used. ACCEPT_LEGAL_DOCUMENTS, AUTHENTICATE_INSTRUMENT, GET_FULL_WALLET, GET_WALLET_ITEMS, SAVE_ADDRESS, SAVE_INSTRUMENT, SAVE_INSTRUMENT_AND_ADDRESS, SEND_STATUS, UPDATE_ADDRESS, UPDATE_INSTRUMENT, }; // For measuring the frequency of errors while communicating with the Wallet // server. enum WalletErrorMetric { // Baseline metric: Issued a request to the Wallet server. WALLET_ERROR_BASELINE_ISSUED_REQUEST = 0, // A fatal error occured while communicating with the Wallet server. This // value has been deprecated. WALLET_FATAL_ERROR_DEPRECATED, // Received a malformed response from the Wallet server. WALLET_MALFORMED_RESPONSE, // A network error occured while communicating with the Wallet server. WALLET_NETWORK_ERROR, // The request was malformed. WALLET_BAD_REQUEST, // Risk deny, unsupported country, or account closed. WALLET_BUYER_ACCOUNT_ERROR, // Unknown server side error. WALLET_INTERNAL_ERROR, // API call had missing or invalid parameters. WALLET_INVALID_PARAMS, // Online Wallet is down. WALLET_SERVICE_UNAVAILABLE, // User needs make a cheaper transaction or not use Online Wallet. This // value has been deprecated. WALLET_SPENDING_LIMIT_EXCEEDED_DEPRECATED, // The server API version of the request is no longer supported. WALLET_UNSUPPORTED_API_VERSION, // Catch all error type. WALLET_UNKNOWN_ERROR, NUM_WALLET_ERROR_METRICS }; // For measuring the frequency of "required actions" returned by the Wallet // server. This is similar to the autofill::wallet::RequiredAction enum; // but unlike that enum, the values in this one must remain constant over // time, so that the metrics can be consistently interpreted on the // server-side. enum WalletRequiredActionMetric { // Baseline metric: Issued a request to the Wallet server. WALLET_REQUIRED_ACTION_BASELINE_ISSUED_REQUEST = 0, // Values from the autofill::wallet::RequiredAction enum: UNKNOWN_REQUIRED_ACTION, // Catch all type. GAIA_AUTH, PASSIVE_GAIA_AUTH, SETUP_WALLET, ACCEPT_TOS, UPDATE_EXPIRATION_DATE, UPGRADE_MIN_ADDRESS, CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS, VERIFY_CVV, INVALID_FORM_FIELD, REQUIRE_PHONE_NUMBER, NUM_WALLET_REQUIRED_ACTIONS }; // The success or failure of downloading Autocheckout whitelist file. enum AutocheckoutWhitelistDownloadStatus { AUTOCHECKOUT_WHITELIST_DOWNLOAD_FAILED, AUTOCHECKOUT_WHITELIST_DOWNLOAD_SUCCEEDED, }; AutofillMetrics(); virtual ~AutofillMetrics(); // Logs how the user interacted with the Autocheckout bubble. virtual void LogAutocheckoutBubbleMetric(BubbleMetric metric) const; // Logs the result of an Autocheckout buy flow. virtual void LogAutocheckoutBuyFlowMetric( AutocheckoutBuyFlowMetric metric) const; virtual void LogCreditCardInfoBarMetric(InfoBarMetric metric) const; virtual void LogDeveloperEngagementMetric( DeveloperEngagementMetric metric) const; virtual void LogHeuristicTypePrediction( FieldTypeQualityMetric metric, AutofillFieldType field_type, const std::string& experiment_id) const; virtual void LogOverallTypePrediction( FieldTypeQualityMetric metric, AutofillFieldType field_type, const std::string& experiment_id) const; virtual void LogServerTypePrediction(FieldTypeQualityMetric metric, AutofillFieldType field_type, const std::string& experiment_id) const; virtual void LogQualityMetric(QualityMetric metric, const std::string& experiment_id) const; virtual void LogServerQueryMetric(ServerQueryMetric metric) const; virtual void LogUserHappinessMetric(UserHappinessMetric metric) const; // Logs |state| to the dismissal states histogram for |dialog_type|. virtual void LogDialogDismissalState(autofill::DialogType dialog_type, DialogDismissalState state) const; // This should be called as soon as the user's signed-in status and Wallet // item count is known. Records that a user starting out in |user_state| is // interacting with a dialog of |dialog_type|. virtual void LogDialogInitialUserState( autofill::DialogType dialog_type, DialogInitialUserStateMetric user_type) const; // Logs the time elapsed between the dialog being shown for |dialog_type| and // when it is ready for user interaction. virtual void LogDialogLatencyToShow(autofill::DialogType dialog_type, const base::TimeDelta& duration) const; // Logs |event| to the popup events histogram for |dialog_type|. virtual void LogDialogPopupEvent(autofill::DialogType dialog_type, DialogPopupEvent event) const; // Logs |metric| to the security metrics histogram for |dialog_type|. virtual void LogDialogSecurityMetric(autofill::DialogType dialog_type, DialogSecurityMetric metric) const; // This should be called when the Autofill dialog, invoked by a dialog of type // |dialog_type|, is closed. |duration| should be the time elapsed between // the dialog being shown and it being closed. |dismissal_action| should // indicate whether the user dismissed the dialog by submitting the form data // or by canceling. virtual void LogDialogUiDuration( const base::TimeDelta& duration, autofill::DialogType dialog_type, DialogDismissalAction dismissal_action) const; // Logs |event| to the UI events histogram for |dialog_type|. virtual void LogDialogUiEvent(autofill::DialogType dialog_type, DialogUiEvent event) const; // Logs |metric| to the Wallet errors histogram for |dialog_type|. virtual void LogWalletErrorMetric(autofill::DialogType dialog_type, WalletErrorMetric metric) const; // Logs the network request time of Wallet API calls. virtual void LogWalletApiCallDuration( WalletApiCallMetric metric, const base::TimeDelta& duration) const; // Logs |required_action| to the required actions histogram for |dialog_type|. virtual void LogWalletRequiredActionMetric( autofill::DialogType dialog_type, WalletRequiredActionMetric required_action) const; virtual void LogAutocheckoutDuration( const base::TimeDelta& duration, AutocheckoutCompletionStatus status) const; // Logs the time taken to download Autocheckout whitelist file. virtual void LogAutocheckoutWhitelistDownloadDuration( const base::TimeDelta& duration, AutocheckoutWhitelistDownloadStatus status) const; // This should be called when a form that has been Autofilled is submitted. // |duration| should be the time elapsed between form load and submission. virtual void LogFormFillDurationFromLoadWithAutofill( const base::TimeDelta& duration) const; // This should be called when a fillable form that has not been Autofilled is // submitted. |duration| should be the time elapsed between form load and // submission. virtual void LogFormFillDurationFromLoadWithoutAutofill( const base::TimeDelta& duration) const; // This should be called when a form that has been Autofilled is submitted. // |duration| should be the time elapsed between the initial form interaction // and submission. virtual void LogFormFillDurationFromInteractionWithAutofill( const base::TimeDelta& duration) const; // This should be called when a fillable form that has not been Autofilled is // submitted. |duration| should be the time elapsed between the initial form // interaction and submission. virtual void LogFormFillDurationFromInteractionWithoutAutofill( const base::TimeDelta& duration) const; // This should be called each time a page containing forms is loaded. virtual void LogIsAutofillEnabledAtPageLoad(bool enabled) const; // This should be called each time a new profile is launched. virtual void LogIsAutofillEnabledAtStartup(bool enabled) const; // This should be called each time a new profile is launched. virtual void LogStoredProfileCount(size_t num_profiles) const; // Log the number of Autofill suggestions presented to the user when filling a // form. virtual void LogAddressSuggestionsCount(size_t num_suggestions) const; // Logs the experiment id corresponding to a server query response. virtual void LogServerExperimentIdForQuery( const std::string& experiment_id) const; // Logs the experiment id corresponding to an upload to the server. virtual void LogServerExperimentIdForUpload( const std::string& experiment_id) const; private: DISALLOW_COPY_AND_ASSIGN(AutofillMetrics); }; } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_METRICS_H_