Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(386)

Unified Diff: components/password_manager/core/browser/password_manager.cc

Issue 944163003: [Password Manager] Fix password saving on Macys registration page (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tests Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/password_manager/core/browser/password_manager.cc
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
index 0ed1987d18093b7dab2cc0535f72a1107729d4b9..7d20d9ad3894b770bd8f1710ad7c94f8c4276f20 100644
--- a/components/password_manager/core/browser/password_manager.cc
+++ b/components/password_manager/core/browser/password_manager.cc
@@ -107,6 +107,25 @@ void RecordWhetherTargetDomainDiffers(const GURL& src, const GURL& target) {
target_domain_differs);
}
+// Returns true if the observed form has both the current and new password
+// fields, and the username field was not explicitly marked with
+// autocomplete=username. In these cases it is not clear whether the username
+// field is the right guess (often such change password forms do not contain
+// the username at all), and the user should not be bothered with saving a
+// potentially malformed credential. Once we handle change password forms
+// correctly, or http://crbug.com/448351 gets implemented, this method should
+// be replaced accordingly.
+bool IsIgnorableChangePasswordForm(const PasswordForm& form) {
vabr (Chromium) 2015/02/25 10:21:15 Heads-up: Your base files are out of date. There h
Garrett Casto 2015/02/26 07:11:01 Rebased and moved this back into PasswordFormManag
+ bool is_change_password_form =
+ !form.new_password_element.empty() && !form.password_element.empty();
+ bool is_username_certainly_correct = form.username_marked_by_site;
+ return is_change_password_form && !is_username_certainly_correct;
+}
+
+bool IsSignupForm(const PasswordForm& form) {
+ return !form.new_password_element.empty() && form.password_element.empty();
+}
+
} // namespace
const char PasswordManager::kOtherPossibleUsernamesExperiment[] =
@@ -221,6 +240,11 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) {
return;
}
+ if (IsIgnorableChangePasswordForm(form)) {
+ RecordFailure(CHANGE_PASSWORD_FORM, form.origin, logger.get());
+ return;
+ }
+
scoped_ptr<PasswordFormManager> manager;
ScopedVector<PasswordFormManager>::iterator matched_manager_it =
pending_login_managers_.end();
@@ -236,12 +260,6 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) {
if (result == PasswordFormManager::RESULT_NO_MATCH)
continue;
- if ((*iter)->IsIgnorableChangePasswordForm()) {
- if (logger)
- logger->LogMessage(Logger::STRING_CHANGE_PASSWORD_FORM);
- continue;
- }
-
if (!(*iter)->HasCompletedMatching()) {
has_found_matching_managers_which_were_not_ready = true;
continue;
@@ -263,6 +281,18 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) {
if (logger)
logger->LogMessage(Logger::STRING_MATCH_WITHOUT_ACTION);
matched_manager_it = iter;
+ } else if (IsSignupForm(form) &&
+ (result & PasswordFormManager::RESULT_ORIGINS_MATCH)) {
+ // Signup forms don't require HTML attributes to match because we don't
+ // need to fill these saved passwords on the same form in the future.
+ // Don't break in case there exists a better match.
+ // TODO(gcasto): Matching in this way is very inprecise and will take
vabr (Chromium) 2015/02/25 10:21:15 typo: imprecise
Garrett Casto 2015/02/26 07:11:01 Done.
+ // the last form that exists on the page. Having some better way to
+ // match the same form when the HTML elements change (e.g. text element
+ // changed to password element) would be useful.
+ if (logger)
+ logger->LogMessage(Logger::STRING_ORIGINS_MATCH);
+ matched_manager_it = iter;
vabr (Chromium) 2015/02/25 10:21:15 Should we at least give precedence to matches comi
Garrett Casto 2015/02/26 07:11:01 That's a good idea. The change I made also will pr
}
}
// If we didn't find a manager, this means a form was submitted without
@@ -362,6 +392,9 @@ void PasswordManager::RecordFailure(ProvisionalSaveFailure failure,
case EMPTY_PASSWORD:
logger->LogMessage(Logger::STRING_EMPTY_PASSWORD);
break;
+ case CHANGE_PASSWORD_FORM:
+ logger->LogMessage(Logger::STRING_CHANGE_PASSWORD_FORM);
+ break;
case MATCHING_NOT_COMPLETE:
logger->LogMessage(Logger::STRING_MATCHING_NOT_COMPLETE);
break;

Powered by Google App Engine
This is Rietveld 408576698