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

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

Issue 870513002: [PasswordManager] Improve detection of ignorable change password forms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated reviews. 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_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 b642296ddba651cc8b1c420f5699f3d818ff9310..a773baeca6c3a925834c19ae213ed796fb1ceaf3 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -68,6 +68,20 @@ PasswordForm CopyAndModifySSLValidity(const PasswordForm& orig,
return result;
}
+// Returns true if user-typed username and password field values match with one
+// of the password form within |credentials| map; otherwise false.
+bool DoesUsenameAndPasswordMatchCredentials(
+ const base::string16& typed_username,
+ const base::string16& typed_password,
+ const autofill::PasswordFormMap& credentials) {
+ for (auto match : credentials) {
+ if (match.second->username_value == typed_username &&
+ match.second->password_value == typed_password)
+ return true;
+ }
+ return false;
+}
+
} // namespace
PasswordFormManager::PasswordFormManager(
@@ -376,18 +390,6 @@ void PasswordFormManager::FetchMatchingLoginsFromPasswordStore(
logger->LogMessage(Logger::STRING_FETCH_LOGINS_METHOD);
}
- // Do not autofill on sign-up or change password forms (until we have some
- // working change password functionality).
- if (!observed_form_.new_password_element.empty()) {
- if (logger)
- logger->LogMessage(Logger::STRING_FORM_NOT_AUTOFILLED);
- client_->AutofillResultsComputed();
- // There is no point in looking for the credentials in the store when they
- // won't be autofilled, so pretend there were none.
- OnGetPasswordStoreResults(ScopedVector<autofill::PasswordForm>());
- return;
- }
-
PasswordStore* password_store = client_->GetPasswordStore();
if (!password_store) {
if (logger)
@@ -402,11 +404,14 @@ bool PasswordFormManager::HasCompletedMatching() const {
return state_ == POST_MATCHING_PHASE;
}
-bool PasswordFormManager::IsIgnorableChangePasswordForm() const {
+bool PasswordFormManager::IsIgnorableChangePasswordForm(
+ const base::string16& typed_username,
+ const base::string16& typed_password) const {
bool is_change_password_form = !observed_form_.new_password_element.empty() &&
!observed_form_.password_element.empty();
- bool is_username_certainly_correct = observed_form_.username_marked_by_site;
- return is_change_password_form && !is_username_certainly_correct;
+ return is_change_password_form && !observed_form_.username_marked_by_site &&
+ !DoesUsenameAndPasswordMatchCredentials(typed_username, typed_password,
+ best_matches_);
}
void PasswordFormManager::OnRequestDone(
@@ -536,6 +541,17 @@ void PasswordFormManager::ProcessFrame(
if (best_matches_.empty())
return;
+ // Do not autofill on sign-up or change password forms (until we have some
+ // working change password functionality).
+ if (!observed_form_.new_password_element.empty()) {
+ if (client_->IsLoggingActive()) {
+ BrowserSavePasswordProgressLogger logger(client_);
+ logger.LogMessage(Logger::PROCESS_FRAME_METHOD);
+ logger.LogMessage(Logger::STRING_FORM_NOT_AUTOFILLED);
+ }
+ return;
+ }
+
// Proceed to autofill.
// Note that we provide the choices but don't actually prefill a value if:
// (1) we are in Incognito mode, (2) the ACTION paths don't match,

Powered by Google App Engine
This is Rietveld 408576698