| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/android_autofill/browser/android_form_event_logger.h" |
| |
| #include "base/containers/enum_set.h" |
| #include "base/metrics/histogram_functions.h" |
| #include "base/metrics/user_metrics.h" |
| #include "base/strings/strcat.h" |
| #include "components/autofill/core/browser/foundations/autofill_client.h" |
| #include "components/autofill/core/browser/logging/log_manager.h" |
| #include "components/autofill/core/common/autofill_constants.h" |
| #include "components/autofill/core/common/autofill_internals/log_message.h" |
| #include "components/autofill/core/common/autofill_internals/logging_scope.h" |
| |
| using base::UmaHistogramBoolean; |
| |
| namespace autofill { |
| |
| AndroidFormEventLogger::AndroidFormEventLogger( |
| const std::string& form_type_name) |
| : form_type_name_(form_type_name) {} |
| |
| AndroidFormEventLogger::~AndroidFormEventLogger() { |
| RecordFunnelAndKeyMetrics(); |
| } |
| |
| void AndroidFormEventLogger::OnDidParseForm() { |
| has_parsed_form_ = true; |
| } |
| |
| void AndroidFormEventLogger::OnDidInteractWithAutofillableForm() { |
| has_logged_interacted_ = true; |
| } |
| |
| void AndroidFormEventLogger::OnDidFillSuggestion() { |
| has_logged_suggestion_filled_ = true; |
| } |
| |
| void AndroidFormEventLogger::OnWillSubmitForm() { |
| if (!has_logged_interacted_) { |
| return; |
| } |
| has_logged_will_submit_ = true; |
| } |
| |
| void AndroidFormEventLogger::OnTypedIntoNonFilledField() { |
| has_logged_typed_into_non_filled_field_ = true; |
| } |
| |
| void AndroidFormEventLogger::OnEditedAutofilledField() { |
| has_logged_edited_autofilled_field_ = true; |
| } |
| |
| void AndroidFormEventLogger::RecordFunnelAndKeyMetrics() { |
| UmaHistogramBoolean("Autofill.WebView.Funnel.ParsedAsType." + form_type_name_, |
| has_parsed_form_); |
| // Log chronological funnel. |
| if (!has_parsed_form_) { |
| return; |
| } |
| |
| UmaHistogramBoolean( |
| "Autofill.WebView.Funnel.InteractionAfterParsedAsType." + form_type_name_, |
| has_logged_interacted_); |
| if (has_logged_interacted_) { |
| UmaHistogramBoolean( |
| "Autofill.WebView.Funnel.FillAfterInteraction." + form_type_name_, |
| has_logged_suggestion_filled_); |
| } |
| if (has_logged_interacted_ && has_logged_suggestion_filled_) { |
| UmaHistogramBoolean( |
| "Autofill.WebView.Funnel.SubmissionAfterFill." + form_type_name_, |
| has_logged_will_submit_); |
| } |
| // Log key success metrics, always preconditioned on a form submission (except |
| // for the Autofill.KeyMetrics.FormSubmission metrics which measure whether |
| // a submission happens). |
| if (has_logged_will_submit_) { |
| if (has_logged_suggestion_filled_) { |
| // Whether a filled form and submitted form required no fixes to filled |
| // fields. |
| UmaHistogramBoolean( |
| "Autofill.WebView.KeyMetrics.FillingCorrectness." + form_type_name_, |
| !has_logged_edited_autofilled_field_); |
| } |
| // Whether a submitted form was filled. |
| UmaHistogramBoolean( |
| "Autofill.WebView.KeyMetrics.FillingAssistance." + form_type_name_, |
| has_logged_suggestion_filled_); |
| } |
| if (has_logged_typed_into_non_filled_field_ || |
| has_logged_suggestion_filled_) { |
| // Whether a (non-)autofilled form was submitted. |
| UmaHistogramBoolean( |
| base::StrCat( |
| {"Autofill.WebView.KeyMetrics.FormSubmission.", |
| (has_logged_suggestion_filled_ ? "Autofilled." : "NotAutofilled."), |
| form_type_name_}), |
| has_logged_will_submit_); |
| } |
| } |
| |
| } // namespace autofill |