| // 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 <stddef.h> |
| #include <string> |
| |
| #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, |
| // The user canceled while the sign-in form was showing. |
| DIALOG_CANCELED_DURING_SIGNIN, |
| 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, |
| SEND_STATUS, |
| SAVE_TO_WALLET, |
| }; |
| |
| // 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, |
| // The merchant has been blacklisted for Online Wallet due to some manner |
| // of compliance violation. |
| WALLET_UNSUPPORTED_MERCHANT, |
| // Buyer Legal Address has a country which is unsupported by Wallet. |
| WALLET_BUYER_LEGAL_ADDRESS_NOT_SUPPORTED, |
| // Wallet's Know Your Customer(KYC) action is pending/failed for this user. |
| WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS, |
| 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, |
| ServerFieldType field_type, |
| const std::string& experiment_id) const; |
| virtual void LogOverallTypePrediction( |
| FieldTypeQualityMetric metric, |
| ServerFieldType field_type, |
| const std::string& experiment_id) const; |
| virtual void LogServerTypePrediction(FieldTypeQualityMetric metric, |
| ServerFieldType 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_ |