blob: 9ed210500de3f3397c2ddfbf69f81824b84bd522 [file] [log] [blame]
// Copyright 2017 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.
#include "components/password_manager/core/browser/password_manager_metrics_recorder.h"
#include <memory>
#include "base/metrics/histogram_macros.h"
#include "components/autofill/core/common/save_password_progress_logger.h"
#include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "url/gurl.h"
// Shorten the name to spare line breaks. The code provides enough context
// already.
typedef autofill::SavePasswordProgressLogger Logger;
namespace password_manager {
PasswordManagerMetricsRecorder::PasswordManagerMetricsRecorder(
ukm::SourceId source_id,
const GURL& main_frame_url)
: main_frame_url_(main_frame_url),
ukm_entry_builder_(
std::make_unique<ukm::builders::PageWithPassword>(source_id)) {}
PasswordManagerMetricsRecorder::PasswordManagerMetricsRecorder(
PasswordManagerMetricsRecorder&& that) noexcept = default;
PasswordManagerMetricsRecorder::~PasswordManagerMetricsRecorder() {
if (user_modified_password_field_)
ukm_entry_builder_->SetUserModifiedPasswordField(1);
if (form_manager_availability_ != FormManagerAvailable::kNotSet)
ukm_entry_builder_->SetFormManagerAvailable(
static_cast<int64_t>(form_manager_availability_));
ukm_entry_builder_->Record(ukm::UkmRecorder::Get());
}
PasswordManagerMetricsRecorder& PasswordManagerMetricsRecorder::operator=(
PasswordManagerMetricsRecorder&& that) = default;
void PasswordManagerMetricsRecorder::RecordUserModifiedPasswordField() {
user_modified_password_field_ = true;
}
void PasswordManagerMetricsRecorder::RecordProvisionalSaveFailure(
ProvisionalSaveFailure failure,
const GURL& main_frame_url,
const GURL& form_origin,
BrowserSavePasswordProgressLogger* logger) {
UMA_HISTOGRAM_ENUMERATION("PasswordManager.ProvisionalSaveFailure", failure,
MAX_FAILURE_VALUE);
ukm_entry_builder_->SetProvisionalSaveFailure(static_cast<int64_t>(failure));
if (logger) {
switch (failure) {
case SAVING_DISABLED:
logger->LogMessage(Logger::STRING_SAVING_DISABLED);
break;
case EMPTY_PASSWORD:
logger->LogMessage(Logger::STRING_EMPTY_PASSWORD);
break;
case MATCHING_NOT_COMPLETE:
logger->LogMessage(Logger::STRING_MATCHING_NOT_COMPLETE);
break;
case NO_MATCHING_FORM:
logger->LogMessage(Logger::STRING_NO_MATCHING_FORM);
break;
case FORM_BLACKLISTED:
logger->LogMessage(Logger::STRING_FORM_BLACKLISTED);
break;
case INVALID_FORM:
logger->LogMessage(Logger::STRING_INVALID_FORM);
break;
case SYNC_CREDENTIAL:
logger->LogMessage(Logger::STRING_SYNC_CREDENTIAL);
break;
case SAVING_ON_HTTP_AFTER_HTTPS:
logger->LogSuccessiveOrigins(
Logger::STRING_BLOCK_PASSWORD_SAME_ORIGIN_INSECURE_SCHEME,
main_frame_url.GetOrigin(), form_origin.GetOrigin());
break;
case MAX_FAILURE_VALUE:
NOTREACHED();
return;
}
logger->LogMessage(Logger::STRING_DECISION_DROP);
}
}
void PasswordManagerMetricsRecorder::RecordFormManagerAvailable(
FormManagerAvailable availability) {
form_manager_availability_ = availability;
}
void PasswordManagerMetricsRecorder::RecordPageLevelUserAction(
PasswordManagerMetricsRecorder::PageLevelUserAction action) {
ukm_entry_builder_->SetPageLevelUserAction(static_cast<int64_t>(action));
}
} // namespace password_manager