Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_METRICS_H_
      6 #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_METRICS_H_
      7 
      8 #include <stddef.h>
      9 #include <string>
     10 
     11 #include "base/basictypes.h"
     12 #include "components/autofill/core/browser/autofill_manager_delegate.h"
     13 #include "components/autofill/core/browser/field_types.h"
     14 
     15 namespace base {
     16 class TimeDelta;
     17 }
     18 
     19 namespace autofill {
     20 
     21 class AutofillMetrics {
     22  public:
     23   // The possible results of an Autocheckout flow.
     24   enum AutocheckoutBuyFlowMetric {
     25     // The user has initated Autocheckout. The baseline metric.
     26     AUTOCHECKOUT_BUY_FLOW_STARTED,
     27     // Autocheckout completed successfully.
     28     AUTOCHECKOUT_BUY_FLOW_SUCCESS,
     29     // Autocheckout failed due to missing server side data.
     30     AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING,
     31     // Autocheckout failed due to a missing proceed element.
     32     AUTOCHECKOUT_BUY_FLOW_MISSING_ADVANCE_ELEMENT,
     33     // Autocheckout failed for any number of other reasons, e.g, the proceed
     34     // element click failed, the page numbers were not increasing, etc.
     35     AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED,
     36     // Autocheckout failed due to a missing click element before form filling.
     37     AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING,
     38     // Autocheckout failed due to a missing click element after form filling.
     39     AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING,
     40     NUM_AUTOCHECKOUT_BUY_FLOW_METRICS
     41   };
     42 
     43   // The success or failure of Autocheckout.
     44   enum AutocheckoutCompletionStatus {
     45     AUTOCHECKOUT_CANCELLED,  // The user canceled Autocheckout while it was in
     46                              // progress.
     47     AUTOCHECKOUT_FAILED,     // The user canceled out of the dialog after
     48                              // an Autocheckout failure.
     49     AUTOCHECKOUT_SUCCEEDED,  // The dialog was closed after Autocheckout
     50                              // succeeded.
     51   };
     52 
     53   // The action a user took to dismiss a bubble.
     54   enum BubbleMetric {
     55     BUBBLE_CREATED = 0,         // The bubble was created.
     56     BUBBLE_ACCEPTED,            // The user accepted, i.e. confirmed, the
     57                                 // bubble.
     58     BUBBLE_DISMISSED,           // The user dismissed the bubble.
     59     BUBBLE_IGNORED,             // The user did not interact with the bubble.
     60     BUBBLE_COULD_BE_DISPLAYED,  // The bubble could be displayed.
     61     NUM_BUBBLE_METRICS,
     62   };
     63 
     64   enum DeveloperEngagementMetric {
     65     // Parsed a form that is potentially autofillable.
     66     FILLABLE_FORM_PARSED = 0,
     67     // Parsed a form that is potentially autofillable and contains at least one
     68     // web developer-specified field type hint, a la
     69     // http://is.gd/whatwg_autocomplete
     70     FILLABLE_FORM_CONTAINS_TYPE_HINTS,
     71     NUM_DEVELOPER_ENGAGEMENT_METRICS,
     72   };
     73 
     74   // The action the user took to dismiss a dialog.
     75   enum DialogDismissalAction {
     76     DIALOG_ACCEPTED = 0,  // The user accepted, i.e. submitted, the dialog.
     77     DIALOG_CANCELED,      // The user canceled out of the dialog.
     78   };
     79 
     80   // The state of the Autofill dialog when it was dismissed.
     81   enum DialogDismissalState {
     82     // The user submitted with no data available to save.
     83     DIALOG_ACCEPTED_EXISTING_DATA,
     84     // The saved details to Online Wallet on submit.
     85     DIALOG_ACCEPTED_SAVE_TO_WALLET,
     86     // The saved details to the local Autofill database on submit.
     87     DIALOG_ACCEPTED_SAVE_TO_AUTOFILL,
     88     // The user submitted without saving any edited sections.
     89     DIALOG_ACCEPTED_NO_SAVE,
     90     // The user canceled with no edit UI showing.
     91     DIALOG_CANCELED_NO_EDITS,
     92     // The user canceled with edit UI showing, but no invalid fields.
     93     DIALOG_CANCELED_NO_INVALID_FIELDS,
     94     // The user canceled with at least one invalid field.
     95     DIALOG_CANCELED_WITH_INVALID_FIELDS,
     96     // The user canceled while the sign-in form was showing.
     97     DIALOG_CANCELED_DURING_SIGNIN,
     98     NUM_DIALOG_DISMISSAL_STATES
     99   };
    100 
    101   // The initial state of user that's interacting with a freshly shown Autofill
    102   // dialog.
    103   enum DialogInitialUserStateMetric {
    104     // Could not determine the user's state due to failure to communicate with
    105     // the Wallet server.
    106     DIALOG_USER_STATE_UNKNOWN = 0,
    107     // Not signed in, no verified Autofill profiles.
    108     DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL,
    109     // Not signed in, has verified Autofill profiles.
    110     DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL,
    111     // Signed in, no Wallet items, no verified Autofill profiles.
    112     DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL,
    113     // Signed in, no Wallet items, has verified Autofill profiles.
    114     DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL,
    115     // Signed in, has Wallet items, no verified Autofill profiles.
    116     DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL,
    117     // Signed in, has Wallet items, has verified Autofill profiles.
    118     DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL,
    119     NUM_DIALOG_INITIAL_USER_STATE_METRICS
    120   };
    121 
    122   // Events related to the Autofill popup shown in a requestAutocomplete or
    123   // Autocheckout dialog.
    124   enum DialogPopupEvent {
    125     // An Autofill popup was shown.
    126     DIALOG_POPUP_SHOWN = 0,
    127     // The user chose to fill the form with a suggestion from the popup.
    128     DIALOG_POPUP_FORM_FILLED,
    129     NUM_DIALOG_POPUP_EVENTS
    130   };
    131 
    132   // For measuring the frequency of security warnings or errors that can come
    133   // up as part of the requestAutocomplete flow.
    134   enum DialogSecurityMetric {
    135     // Baseline metric: The dialog was shown.
    136     SECURITY_METRIC_DIALOG_SHOWN = 0,
    137     // Credit card requested over non-secure protocol.
    138     SECURITY_METRIC_CREDIT_CARD_OVER_HTTP,
    139     // Autocomplete data requested from a frame hosted on an origin not matching
    140     // the main frame's origin.
    141     SECURITY_METRIC_CROSS_ORIGIN_FRAME,
    142     NUM_DIALOG_SECURITY_METRICS
    143   };
    144 
    145   // For measuring how users are interacting with the Autofill dialog UI.
    146   enum DialogUiEvent {
    147     // Baseline metric: The dialog was shown.
    148     DIALOG_UI_SHOWN = 0,
    149 
    150     // Dialog dismissal actions:
    151     DIALOG_UI_ACCEPTED,
    152     DIALOG_UI_CANCELED,
    153 
    154     // Selections within the account switcher:
    155     // Switched from a Wallet account to local Autofill data.
    156     DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_AUTOFILL,
    157     // Switched from local Autofill data to a Wallet account.
    158     DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_WALLET,
    159     // Switched from one Wallet account to another one.
    160     DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_WALLET_ACCOUNT,
    161 
    162     // The sign-in UI was shown.
    163     DIALOG_UI_SIGNIN_SHOWN,
    164 
    165     // Selecting a different item from a suggestion menu dropdown:
    166     DIALOG_UI_EMAIL_SELECTED_SUGGESTION_CHANGED,
    167     DIALOG_UI_BILLING_SELECTED_SUGGESTION_CHANGED,
    168     DIALOG_UI_CC_BILLING_SELECTED_SUGGESTION_CHANGED,
    169     DIALOG_UI_SHIPPING_SELECTED_SUGGESTION_CHANGED,
    170     DIALOG_UI_CC_SELECTED_SUGGESTION_CHANGED,
    171 
    172     // Showing the editing UI for a section of the dialog:
    173     DIALOG_UI_EMAIL_EDIT_UI_SHOWN,
    174     DIALOG_UI_BILLING_EDIT_UI_SHOWN,
    175     DIALOG_UI_CC_BILLING_EDIT_UI_SHOWN,
    176     DIALOG_UI_SHIPPING_EDIT_UI_SHOWN,
    177     DIALOG_UI_CC_EDIT_UI_SHOWN,
    178 
    179     // Adding a new item in a section of the dialog:
    180     DIALOG_UI_EMAIL_ITEM_ADDED,
    181     DIALOG_UI_BILLING_ITEM_ADDED,
    182     DIALOG_UI_CC_BILLING_ITEM_ADDED,
    183     DIALOG_UI_SHIPPING_ITEM_ADDED,
    184     DIALOG_UI_CC_ITEM_ADDED,
    185 
    186     NUM_DIALOG_UI_EVENTS
    187   };
    188 
    189   enum InfoBarMetric {
    190     INFOBAR_SHOWN = 0,  // We showed an infobar, e.g. prompting to save credit
    191                         // card info.
    192     INFOBAR_ACCEPTED,   // The user explicitly accepted the infobar.
    193     INFOBAR_DENIED,     // The user explicitly denied the infobar.
    194     INFOBAR_IGNORED,    // The user completely ignored the infobar (logged on
    195                         // tab close).
    196     NUM_INFO_BAR_METRICS,
    197   };
    198 
    199   // Metrics measuring how well we predict field types.  Exactly three such
    200   // metrics are logged for each fillable field in a submitted form: for
    201   // the heuristic prediction, for the crowd-sourced prediction, and for the
    202   // overall prediction.
    203   enum FieldTypeQualityMetric {
    204     TYPE_UNKNOWN = 0,  // Offered no prediction.
    205     TYPE_MATCH,        // Predicted correctly.
    206     TYPE_MISMATCH,     // Predicted incorrectly.
    207     NUM_FIELD_TYPE_QUALITY_METRICS,
    208   };
    209 
    210   enum QualityMetric {
    211     // Logged for each potentially fillable field in a submitted form.
    212     FIELD_SUBMITTED = 0,
    213 
    214     // A simple successs metric, logged for each field that returns true for
    215     // |is_autofilled()|.
    216     FIELD_AUTOFILLED,
    217 
    218     // A simple failure metric, logged for each field that returns false for
    219     // |is_autofilled()| but has a value that is present in the personal data
    220     // manager.
    221     FIELD_NOT_AUTOFILLED,
    222 
    223     // The below are only logged when |FIELD_AUTOFILL_FAILED| is also logged.
    224     NOT_AUTOFILLED_HEURISTIC_TYPE_UNKNOWN,
    225     NOT_AUTOFILLED_HEURISTIC_TYPE_MATCH,
    226     NOT_AUTOFILLED_HEURISTIC_TYPE_MISMATCH,
    227     NOT_AUTOFILLED_SERVER_TYPE_UNKNOWN,
    228     NOT_AUTOFILLED_SERVER_TYPE_MATCH,
    229     NOT_AUTOFILLED_SERVER_TYPE_MISMATCH,
    230     NUM_QUALITY_METRICS,
    231   };
    232 
    233   // Each of these is logged at most once per query to the server, which in turn
    234   // occurs at most once per page load.
    235   enum ServerQueryMetric {
    236     QUERY_SENT = 0,           // Sent a query to the server.
    237     QUERY_RESPONSE_RECEIVED,  // Received a response.
    238     QUERY_RESPONSE_PARSED,    // Successfully parsed the server response.
    239 
    240     // The response was parseable, but provided no improvements relative to our
    241     // heuristics.
    242     QUERY_RESPONSE_MATCHED_LOCAL_HEURISTICS,
    243 
    244     // Our heuristics detected at least one auto-fillable field, and the server
    245     // response overrode the type of at least one field.
    246     QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS,
    247 
    248     // Our heuristics did not detect any auto-fillable fields, but the server
    249     // response did detect at least one.
    250     QUERY_RESPONSE_WITH_NO_LOCAL_HEURISTICS,
    251     NUM_SERVER_QUERY_METRICS,
    252   };
    253 
    254   // Each of these metrics is logged only for potentially autofillable forms,
    255   // i.e. forms with at least three fields, etc.
    256   // These are used to derive certain "user happiness" metrics.  For example, we
    257   // can compute the ratio (USER_DID_EDIT_AUTOFILLED_FIELD / USER_DID_AUTOFILL)
    258   // to see how often users have to correct autofilled data.
    259   enum UserHappinessMetric {
    260     // Loaded a page containing forms.
    261     FORMS_LOADED,
    262     // Submitted a fillable form -- i.e. one with at least three field values
    263     // that match the user's stored Autofill data -- and all matching fields
    264     // were autofilled.
    265     SUBMITTED_FILLABLE_FORM_AUTOFILLED_ALL,
    266     // Submitted a fillable form and some (but not all) matching fields were
    267     // autofilled.
    268     SUBMITTED_FILLABLE_FORM_AUTOFILLED_SOME,
    269     // Submitted a fillable form and no fields were autofilled.
    270     SUBMITTED_FILLABLE_FORM_AUTOFILLED_NONE,
    271     // Submitted a non-fillable form.
    272     SUBMITTED_NON_FILLABLE_FORM,
    273 
    274     // User manually filled one of the form fields.
    275     USER_DID_TYPE,
    276     // We showed a popup containing Autofill suggestions.
    277     SUGGESTIONS_SHOWN,
    278     // Same as above, but only logged once per page load.
    279     SUGGESTIONS_SHOWN_ONCE,
    280     // User autofilled at least part of the form.
    281     USER_DID_AUTOFILL,
    282     // Same as above, but only logged once per page load.
    283     USER_DID_AUTOFILL_ONCE,
    284     // User edited a previously autofilled field.
    285     USER_DID_EDIT_AUTOFILLED_FIELD,
    286     // Same as above, but only logged once per page load.
    287     USER_DID_EDIT_AUTOFILLED_FIELD_ONCE,
    288     NUM_USER_HAPPINESS_METRICS,
    289   };
    290 
    291   // For measuring the network request time of various Wallet API calls. See
    292   // WalletClient::RequestType.
    293   enum WalletApiCallMetric {
    294     UNKNOWN_API_CALL,  // Catch all. Should never be used.
    295     ACCEPT_LEGAL_DOCUMENTS,
    296     AUTHENTICATE_INSTRUMENT,
    297     GET_FULL_WALLET,
    298     GET_WALLET_ITEMS,
    299     SEND_STATUS,
    300     SAVE_TO_WALLET,
    301   };
    302 
    303   // For measuring the frequency of errors while communicating with the Wallet
    304   // server.
    305   enum WalletErrorMetric {
    306     // Baseline metric: Issued a request to the Wallet server.
    307     WALLET_ERROR_BASELINE_ISSUED_REQUEST = 0,
    308     // A fatal error occured while communicating with the Wallet server. This
    309     // value has been deprecated.
    310     WALLET_FATAL_ERROR_DEPRECATED,
    311     // Received a malformed response from the Wallet server.
    312     WALLET_MALFORMED_RESPONSE,
    313     // A network error occured while communicating with the Wallet server.
    314     WALLET_NETWORK_ERROR,
    315     // The request was malformed.
    316     WALLET_BAD_REQUEST,
    317     // Risk deny, unsupported country, or account closed.
    318     WALLET_BUYER_ACCOUNT_ERROR,
    319     // Unknown server side error.
    320     WALLET_INTERNAL_ERROR,
    321     // API call had missing or invalid parameters.
    322     WALLET_INVALID_PARAMS,
    323     // Online Wallet is down.
    324     WALLET_SERVICE_UNAVAILABLE,
    325     // User needs make a cheaper transaction or not use Online Wallet. This
    326     // value has been deprecated.
    327     WALLET_SPENDING_LIMIT_EXCEEDED_DEPRECATED,
    328     // The server API version of the request is no longer supported.
    329     WALLET_UNSUPPORTED_API_VERSION,
    330     // Catch all error type.
    331     WALLET_UNKNOWN_ERROR,
    332     // The merchant has been blacklisted for Online Wallet due to some manner
    333     // of compliance violation.
    334     WALLET_UNSUPPORTED_MERCHANT,
    335     // Buyer Legal Address has a country which is unsupported by Wallet.
    336     WALLET_BUYER_LEGAL_ADDRESS_NOT_SUPPORTED,
    337     // Wallet's Know Your Customer(KYC) action is pending/failed for this user.
    338     WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS,
    339     NUM_WALLET_ERROR_METRICS
    340   };
    341 
    342   // For measuring the frequency of "required actions" returned by the Wallet
    343   // server.  This is similar to the autofill::wallet::RequiredAction enum;
    344   // but unlike that enum, the values in this one must remain constant over
    345   // time, so that the metrics can be consistently interpreted on the
    346   // server-side.
    347   enum WalletRequiredActionMetric {
    348     // Baseline metric: Issued a request to the Wallet server.
    349     WALLET_REQUIRED_ACTION_BASELINE_ISSUED_REQUEST = 0,
    350     // Values from the autofill::wallet::RequiredAction enum:
    351     UNKNOWN_REQUIRED_ACTION,  // Catch all type.
    352     GAIA_AUTH,
    353     PASSIVE_GAIA_AUTH,
    354     SETUP_WALLET,
    355     ACCEPT_TOS,
    356     UPDATE_EXPIRATION_DATE,
    357     UPGRADE_MIN_ADDRESS,
    358     CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS,
    359     VERIFY_CVV,
    360     INVALID_FORM_FIELD,
    361     REQUIRE_PHONE_NUMBER,
    362     NUM_WALLET_REQUIRED_ACTIONS
    363   };
    364 
    365   // The success or failure of downloading Autocheckout whitelist file.
    366   enum AutocheckoutWhitelistDownloadStatus {
    367     AUTOCHECKOUT_WHITELIST_DOWNLOAD_FAILED,
    368     AUTOCHECKOUT_WHITELIST_DOWNLOAD_SUCCEEDED,
    369   };
    370 
    371   AutofillMetrics();
    372   virtual ~AutofillMetrics();
    373 
    374   // Logs how the user interacted with the Autocheckout bubble.
    375   virtual void LogAutocheckoutBubbleMetric(BubbleMetric metric) const;
    376 
    377   // Logs the result of an Autocheckout buy flow.
    378   virtual void LogAutocheckoutBuyFlowMetric(
    379       AutocheckoutBuyFlowMetric metric) const;
    380 
    381   virtual void LogCreditCardInfoBarMetric(InfoBarMetric metric) const;
    382 
    383   virtual void LogDeveloperEngagementMetric(
    384       DeveloperEngagementMetric metric) const;
    385 
    386   virtual void LogHeuristicTypePrediction(
    387       FieldTypeQualityMetric metric,
    388       ServerFieldType field_type,
    389       const std::string& experiment_id) const;
    390   virtual void LogOverallTypePrediction(
    391       FieldTypeQualityMetric metric,
    392       ServerFieldType field_type,
    393       const std::string& experiment_id) const;
    394   virtual void LogServerTypePrediction(FieldTypeQualityMetric metric,
    395                                        ServerFieldType field_type,
    396                                        const std::string& experiment_id) const;
    397 
    398   virtual void LogQualityMetric(QualityMetric metric,
    399                                 const std::string& experiment_id) const;
    400 
    401   virtual void LogServerQueryMetric(ServerQueryMetric metric) const;
    402 
    403   virtual void LogUserHappinessMetric(UserHappinessMetric metric) const;
    404 
    405   // Logs |state| to the dismissal states histogram for |dialog_type|.
    406   virtual void LogDialogDismissalState(autofill::DialogType dialog_type,
    407                                        DialogDismissalState state) const;
    408 
    409   // This should be called as soon as the user's signed-in status and Wallet
    410   // item count is known.  Records that a user starting out in |user_state| is
    411   // interacting with a dialog of |dialog_type|.
    412   virtual void LogDialogInitialUserState(
    413       autofill::DialogType dialog_type,
    414       DialogInitialUserStateMetric user_type) const;
    415 
    416   // Logs the time elapsed between the dialog being shown for |dialog_type| and
    417   // when it is ready for user interaction.
    418   virtual void LogDialogLatencyToShow(autofill::DialogType dialog_type,
    419                                          const base::TimeDelta& duration) const;
    420 
    421   // Logs |event| to the popup events histogram for |dialog_type|.
    422   virtual void LogDialogPopupEvent(autofill::DialogType dialog_type,
    423                                    DialogPopupEvent event) const;
    424 
    425   // Logs |metric| to the security metrics histogram for |dialog_type|.
    426   virtual void LogDialogSecurityMetric(autofill::DialogType dialog_type,
    427                                        DialogSecurityMetric metric) const;
    428 
    429   // This should be called when the Autofill dialog, invoked by a dialog of type
    430   // |dialog_type|, is closed.  |duration| should be the time elapsed between
    431   // the dialog being shown and it being closed.  |dismissal_action| should
    432   // indicate whether the user dismissed the dialog by submitting the form data
    433   // or by canceling.
    434   virtual void LogDialogUiDuration(
    435       const base::TimeDelta& duration,
    436       autofill::DialogType dialog_type,
    437       DialogDismissalAction dismissal_action) const;
    438 
    439   // Logs |event| to the UI events histogram for |dialog_type|.
    440   virtual void LogDialogUiEvent(autofill::DialogType dialog_type,
    441                                 DialogUiEvent event) const;
    442 
    443   // Logs |metric| to the Wallet errors histogram for |dialog_type|.
    444   virtual void LogWalletErrorMetric(autofill::DialogType dialog_type,
    445                                     WalletErrorMetric metric) const;
    446 
    447   // Logs the network request time of Wallet API calls.
    448   virtual void LogWalletApiCallDuration(
    449       WalletApiCallMetric metric,
    450       const base::TimeDelta& duration) const;
    451 
    452   // Logs |required_action| to the required actions histogram for |dialog_type|.
    453   virtual void LogWalletRequiredActionMetric(
    454       autofill::DialogType dialog_type,
    455       WalletRequiredActionMetric required_action) const;
    456 
    457   virtual void LogAutocheckoutDuration(
    458       const base::TimeDelta& duration,
    459       AutocheckoutCompletionStatus status) const;
    460 
    461   // Logs the time taken to download Autocheckout whitelist file.
    462   virtual void LogAutocheckoutWhitelistDownloadDuration(
    463       const base::TimeDelta& duration,
    464       AutocheckoutWhitelistDownloadStatus status) const;
    465 
    466   // This should be called when a form that has been Autofilled is submitted.
    467   // |duration| should be the time elapsed between form load and submission.
    468   virtual void LogFormFillDurationFromLoadWithAutofill(
    469       const base::TimeDelta& duration) const;
    470 
    471   // This should be called when a fillable form that has not been Autofilled is
    472   // submitted.  |duration| should be the time elapsed between form load and
    473   // submission.
    474   virtual void LogFormFillDurationFromLoadWithoutAutofill(
    475       const base::TimeDelta& duration) const;
    476 
    477   // This should be called when a form that has been Autofilled is submitted.
    478   // |duration| should be the time elapsed between the initial form interaction
    479   // and submission.
    480   virtual void LogFormFillDurationFromInteractionWithAutofill(
    481       const base::TimeDelta& duration) const;
    482 
    483   // This should be called when a fillable form that has not been Autofilled is
    484   // submitted.  |duration| should be the time elapsed between the initial form
    485   // interaction and submission.
    486   virtual void LogFormFillDurationFromInteractionWithoutAutofill(
    487       const base::TimeDelta& duration) const;
    488 
    489   // This should be called each time a page containing forms is loaded.
    490   virtual void LogIsAutofillEnabledAtPageLoad(bool enabled) const;
    491 
    492   // This should be called each time a new profile is launched.
    493   virtual void LogIsAutofillEnabledAtStartup(bool enabled) const;
    494 
    495   // This should be called each time a new profile is launched.
    496   virtual void LogStoredProfileCount(size_t num_profiles) const;
    497 
    498   // Log the number of Autofill suggestions presented to the user when filling a
    499   // form.
    500   virtual void LogAddressSuggestionsCount(size_t num_suggestions) const;
    501 
    502   // Logs the experiment id corresponding to a server query response.
    503   virtual void LogServerExperimentIdForQuery(
    504       const std::string& experiment_id) const;
    505 
    506   // Logs the experiment id corresponding to an upload to the server.
    507   virtual void LogServerExperimentIdForUpload(
    508       const std::string& experiment_id) const;
    509 
    510  private:
    511   DISALLOW_COPY_AND_ASSIGN(AutofillMetrics);
    512 };
    513 
    514 }  // namespace autofill
    515 
    516 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_METRICS_H_
    517