Chromium Code Reviews| Index: chrome/browser/password_manager/password_manager.cc |
| diff --git a/chrome/browser/password_manager/password_manager.cc b/chrome/browser/password_manager/password_manager.cc |
| index dbeec6b27480552cb19fb5626680514dd9adb1d5..e47d8424acd08e06921706c7f1decdc807fa4a85 100644 |
| --- a/chrome/browser/password_manager/password_manager.cc |
| +++ b/chrome/browser/password_manager/password_manager.cc |
| @@ -62,6 +62,21 @@ void ReportMetrics(bool password_manager_enabled) { |
| content::RecordAction(UserMetricsAction("PasswordManager_Disabled")); |
| } |
| +void ReportSavePasswordInfoBarFailure( |
| + const enum PasswordManager::PotentialInfoBarErrorReasons reason_id, |
| + const GURL& url) { |
| + std::string domain_name = url.host(); |
| + |
| + if (domain_name.size()) |
| + domain_name.insert(0, "_"); |
|
vabr (Chromium)
2013/08/14 14:39:58
We may not append any domain name, only one of a c
Garrett Casto
2013/08/14 23:02:47
I didn't even realize you could send any identifia
vabr (Chromium)
2013/08/16 09:02:14
Yeah, we have to be careful. Logging the domain fo
|
| + |
| + UMA_HISTOGRAM_BOOLEAN("PasswordManager.InfobarDisplayed" + domain_name, |
|
Garrett Casto
2013/08/14 23:02:47
I'm not sure if this is necessary as if this is ne
vabr (Chromium)
2013/08/16 09:02:14
That's a good point.
Jordy, when you are back, le
|
| + false); |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "PasswordManager.PotentialInfoBarErrorReasons" + domain_name, reason_id, |
| + PasswordManager::NUM_ERROR_TYPES); |
| +} |
| + |
| } // namespace |
| // static |
| @@ -137,12 +152,16 @@ bool PasswordManager::IsSavingEnabled() const { |
| } |
| void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) { |
| - if (!IsSavingEnabled()) |
| + if (!IsSavingEnabled()) { |
|
Garrett Casto
2013/08/14 23:02:47
I actually just submitted a CL (https://codereview
|
| + ReportSavePasswordInfoBarFailure(SAVE_PASSWORD_DISABLE, form.origin); |
| return; |
| + } |
| // No password to save? Then don't. |
| - if (form.password_value.empty()) |
| + if (form.password_value.empty()) { |
| + ReportSavePasswordInfoBarFailure(EMPTY_PASSWORD, form.origin); |
| return; |
| + } |
| scoped_ptr<PasswordFormManager> manager; |
| ScopedVector<PasswordFormManager>::iterator matched_manager_it = |
| @@ -173,6 +192,7 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) { |
| manager.reset(*matched_manager_it); |
| pending_login_managers_.weak_erase(matched_manager_it); |
| } else { |
| + ReportSavePasswordInfoBarFailure(FIRST_PAGE_NOT_LOADED, form.origin); |
| return; |
| } |
| @@ -180,23 +200,32 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) { |
| // tried to submit credentials before we had time to even find matching |
| // results for the given form and autofill. If this is the case, we just |
| // give up. |
| - if (!manager->HasCompletedMatching()) |
| + if (!manager->HasCompletedMatching()) { |
| + ReportSavePasswordInfoBarFailure(MATCHING_ONGOING, form.origin); |
| return; |
| + } |
| // Also get out of here if the user told us to 'never remember' passwords for |
| // this form. |
| - if (manager->IsBlacklisted()) |
| + if (manager->IsBlacklisted()) { |
| + ReportSavePasswordInfoBarFailure(NEVER_REMEMBER, form.origin); |
| return; |
| + } |
| // Bail if we're missing any of the necessary form components. |
| - if (!manager->HasValidPasswordForm()) |
| + if (!manager->HasValidPasswordForm()) { |
| + ReportSavePasswordInfoBarFailure(INVALID_FORM, form.origin); |
| return; |
| + } |
| // Always save generated passwords, as the user expresses explicit intent for |
| // Chrome to manage such passwords. For other passwords, respect the |
| // autocomplete attribute. |
| - if (!manager->HasGeneratedPassword() && !form.password_autocomplete_set) |
| + if (!manager->HasGeneratedPassword() && !form.password_autocomplete_set) { |
| + ReportSavePasswordInfoBarFailure(PASSWORD_GENERATED_OR_AUTOCOMPLETED, |
| + form.origin); |
| return; |
| + } |
| PasswordForm provisionally_saved_form(form); |
| provisionally_saved_form.ssl_valid = form.origin.SchemeIsSecure() && |
| @@ -271,15 +300,34 @@ void PasswordManager::OnPasswordFormsParsed( |
| } |
| bool PasswordManager::ShouldShowSavePasswordInfoBar() const { |
|
Garrett Casto
2013/08/14 23:02:47
I don't think that this function does what you thi
|
| - return provisional_save_manager_->IsNewLogin() && |
| - !provisional_save_manager_->HasGeneratedPassword() && |
| - !provisional_save_manager_->IsPendingCredentialsPublicSuffixMatch(); |
| + |
| + // All functions are tested on by one in order to send the appropriate |
|
vabr (Chromium)
2013/08/14 14:39:58
on by one -> one by one
|
| + // UMA signal with the ReportSavePasswordInfoBarFailure function. |
| + if (!provisional_save_manager_->IsNewLogin()) { |
| + ReportSavePasswordInfoBarFailure(LOGIN_ALREADY_KNEW, |
| + GURL(provisional_save_manager_->realm())); |
| + return false; |
| + } |
| + if (provisional_save_manager_->HasGeneratedPassword()) { |
| + ReportSavePasswordInfoBarFailure(PASSWORD_GENERATED, |
| + GURL(provisional_save_manager_->realm())); |
| + return false; |
| + } |
| + if (provisional_save_manager_->IsPendingCredentialsPublicSuffixMatch()) { |
| + ReportSavePasswordInfoBarFailure(ORIGIN_MATCHING_OF_PUBLIC_SUFFIX, |
| + GURL(provisional_save_manager_->realm())); |
| + return false; |
| + } |
| + return true; |
| } |
| void PasswordManager::OnPasswordFormsRendered( |
| const std::vector<PasswordForm>& visible_forms) { |
| - if (!provisional_save_manager_.get()) |
| + if (!provisional_save_manager_.get()) { |
| + ReportSavePasswordInfoBarFailure(CANNOT_GET_THE_PROVIOSIONAL_PASSWORD, |
| + visible_forms[0].origin); |
|
Garrett Casto
2013/08/14 23:02:47
Not sure if any of the reporting in this function
|
| return; |
| + } |
| DCHECK(IsSavingEnabled()); |
| @@ -290,6 +338,8 @@ void PasswordManager::OnPasswordFormsRendered( |
| *iter, PasswordFormManager::ACTION_MATCH_REQUIRED)) { |
| // The form trying to be saved has immediately re-appeared. Assume login |
| // failure and abort this save, by clearing provisional_save_manager_. |
| + ReportSavePasswordInfoBarFailure( |
| + FORM_REAPPEARED, GURL(provisional_save_manager_->realm())); |
|
Garrett Casto
2013/08/14 23:02:47
We already keep track of this stat in the provisio
|
| provisional_save_manager_->SubmitFailed(); |
| provisional_save_manager_.reset(); |
| return; |
| @@ -299,6 +349,8 @@ void PasswordManager::OnPasswordFormsRendered( |
| if (!provisional_save_manager_->HasValidPasswordForm()) { |
| // Form is not completely valid - we do not support it. |
| NOTREACHED(); |
| + ReportSavePasswordInfoBarFailure(INVALID_FORM, |
| + GURL(provisional_save_manager_->realm())); |
| provisional_save_manager_.reset(); |
| return; |
| } |