| Index: components/password_manager/core/browser/password_form_manager.cc
|
| diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
|
| index 529fe5f9471f088d1e0fe68ff495dde7a9e3cc7b..ec3ab1f00dad61c148a0e25dc026745fcbbe3d44 100644
|
| --- a/components/password_manager/core/browser/password_form_manager.cc
|
| +++ b/components/password_manager/core/browser/password_form_manager.cc
|
| @@ -11,6 +11,7 @@
|
| #include <utility>
|
|
|
| #include "base/feature_list.h"
|
| +#include "base/logging.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/metrics/user_metrics.h"
|
| @@ -237,7 +238,7 @@ PasswordFormManager::PasswordFormManager(
|
| PasswordStore::FormDigest(observed_form),
|
| client,
|
| true /* should_migrate_http_passwords */,
|
| - false /* should_query_suppressed_https_forms */)),
|
| + true /* should_query_suppressed_https_forms */)),
|
| form_fetcher_(form_fetcher ? form_fetcher : owned_form_fetcher_.get()),
|
| is_main_frame_secure_(client->IsMainFrameSecure()) {
|
| if (owned_form_fetcher_)
|
| @@ -254,6 +255,7 @@ PasswordFormManager::~PasswordFormManager() {
|
|
|
| UMA_HISTOGRAM_ENUMERATION("PasswordManager.ActionsTakenV3", GetActionsTaken(),
|
| kMaxNumActionsTaken);
|
| +
|
| // Use the visible main frame URL at the time the PasswordFormManager
|
| // is created, in case a navigation has already started and the
|
| // visible URL has changed.
|
| @@ -261,6 +263,23 @@ PasswordFormManager::~PasswordFormManager() {
|
| UMA_HISTOGRAM_ENUMERATION("PasswordManager.ActionsTakenOnNonSecureForm",
|
| GetActionsTaken(), kMaxNumActionsTaken);
|
| }
|
| +
|
| + if (!observed_form_.origin.SchemeIsCryptographic()) {
|
| + UMA_HISTOGRAM_BOOLEAN(
|
| + "PasswordManager.QueryingSuppressedAccountsFinished",
|
| + form_fetcher_->DidCompleteQueryingSuppressedHTTPSForms());
|
| + if (form_fetcher_->DidCompleteQueryingSuppressedHTTPSForms()) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "PasswordManager.SuppressedAccount.Generated.HTTPSNotHTTP",
|
| + GetStatsForSuppressedHTTPSAccount(PasswordForm::TYPE_GENERATED),
|
| + kMaxSuppressedAccountStats);
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "PasswordManager.SuppressedAccount.Manual.HTTPSNotHTTP",
|
| + GetStatsForSuppressedHTTPSAccount(PasswordForm::TYPE_MANUAL),
|
| + kMaxSuppressedAccountStats);
|
| + }
|
| + }
|
| +
|
| if (submit_result_ == kSubmitResultNotSubmitted) {
|
| if (has_generated_password_)
|
| metrics_util::LogPasswordGenerationSubmissionEvent(
|
| @@ -269,6 +288,7 @@ PasswordFormManager::~PasswordFormManager() {
|
| metrics_util::LogPasswordGenerationAvailableSubmissionEvent(
|
| metrics_util::PASSWORD_NOT_SUBMITTED);
|
| }
|
| +
|
| if (form_type_ != kFormTypeUnspecified) {
|
| UMA_HISTOGRAM_ENUMERATION("PasswordManager.SubmittedFormType", form_type_,
|
| kFormTypeMax);
|
| @@ -285,6 +305,46 @@ int PasswordFormManager::GetActionsTaken() const {
|
| (manager_action_ + kManagerActionMax * submit_result_);
|
| }
|
|
|
| +int PasswordFormManager::GetStatsForSuppressedHTTPSAccount(
|
| + PasswordForm::Type type) const {
|
| + DCHECK(form_fetcher_->DidCompleteQueryingSuppressedHTTPSForms());
|
| +
|
| + SuppressedAccountExistence best_matching_account = kSuppressedAccountNone;
|
| + for (const autofill::PasswordForm* form :
|
| + form_fetcher_->GetSuppressedHTTPSForms()) {
|
| + if (form->type != type)
|
| + continue;
|
| +
|
| + SuppressedAccountExistence current_account;
|
| + if (pending_credentials_.password_value.empty())
|
| + current_account = kSuppressedAccountExists;
|
| + else if (form->username_value != pending_credentials_.username_value)
|
| + current_account = kSuppressedAccountExistsDifferentUsername;
|
| + else if (form->password_value != pending_credentials_.password_value)
|
| + current_account = kSuppressedAccountExistsSameUsername;
|
| + else
|
| + current_account = kSuppressedAccountExistsSameUsernameAndPassword;
|
| +
|
| + best_matching_account = std::max(best_matching_account, current_account);
|
| + }
|
| +
|
| + // Merge kManagerActionNone and kManagerActionBlacklisted_Obsolete. This
|
| + // lowers the number of histogram buckets used by 33%.
|
| + ManagerActionNew manager_action_new =
|
| + (manager_action_ == kManagerActionAutofilled)
|
| + ? kManagerActionNewAutofilled
|
| + : kManagerActionNewNone;
|
| +
|
| + // Encoding: most significant digit is the |best_matching_account|.
|
| + int mixed_base_encoding = 0;
|
| + mixed_base_encoding += best_matching_account;
|
| + (mixed_base_encoding *= kSubmitResultMax) += submit_result_;
|
| + (mixed_base_encoding *= kManagerActionNewMax) += manager_action_new;
|
| + (mixed_base_encoding *= kUserActionMax) += user_action_;
|
| + DCHECK_LT(mixed_base_encoding, kMaxSuppressedAccountStats);
|
| + return mixed_base_encoding;
|
| +}
|
| +
|
| // static
|
| base::string16 PasswordFormManager::PasswordToSave(const PasswordForm& form) {
|
| if (form.new_password_element.empty() || form.new_password_value.empty())
|
|
|