Index: chrome/browser/password_manager/password_form_manager.cc |
diff --git a/chrome/browser/password_manager/password_form_manager.cc b/chrome/browser/password_manager/password_form_manager.cc |
index de736eb0480676235ab60efeb5e524aabd3f8b42..3f732ff8cb88fe07a7780f532bc9e139eba26860 100644 |
--- a/chrome/browser/password_manager/password_form_manager.cc |
+++ b/chrome/browser/password_manager/password_form_manager.cc |
@@ -189,7 +189,10 @@ void PasswordFormManager::ProvisionallySave( |
if (it != best_matches_.end()) { |
// The user signed in with a login we autofilled. |
pending_credentials_ = *it->second; |
- is_new_login_ = false; |
+ |
+ // PSL origin matches should always be new logins, since we want to store |
+ // them so they can automatically be filled in later. |
+ is_new_login_ = pending_credentials_.is_psl_origin_match; |
// Check to see if we're using a known username but a new password. |
if (pending_credentials_.password_value != credentials.password_value) |
@@ -226,6 +229,10 @@ void PasswordFormManager::ProvisionallySave( |
pending_credentials_.type = PasswordForm::TYPE_GENERATED; |
} |
+bool PasswordFormManager::IsPSLOriginMatched() { |
+ return pending_credentials_.is_psl_origin_match; |
+} |
+ |
void PasswordFormManager::Save() { |
DCHECK_EQ(state_, POST_MATCHING_PHASE); |
DCHECK(!profile_->IsOffTheRecord()); |
@@ -342,7 +349,8 @@ void PasswordFormManager::OnRequestDone( |
bool wait_for_username = |
profile_->IsOffTheRecord() || |
observed_form_.action.GetWithEmptyPath() != |
- preferred_match_->action.GetWithEmptyPath(); |
+ preferred_match_->action.GetWithEmptyPath() || |
+ preferred_match_->is_psl_origin_match; |
if (wait_for_username) |
manager_action_ = kManagerActionNone; |
else |
@@ -380,8 +388,10 @@ bool PasswordFormManager::IgnoreResult(const PasswordForm& form) const { |
return true; |
} |
// Don't match an invalid SSL form with one saved under secure |
- // circumstances. |
- if (form.ssl_valid && !observed_form_.ssl_valid) { |
+ // circumstances unless it was found as a PSL origin domain match. |
+ if (form.ssl_valid && |
+ !observed_form_.ssl_valid && |
+ !form.is_psl_origin_match) { |
return true; |
} |
return false; |
@@ -540,7 +550,7 @@ int PasswordFormManager::ScoreResult(const PasswordForm& candidate) const { |
// is we have a single match in the db for the given host, |
// so we don't generally need to walk the entire URL path (the else |
// clause). |
- score += (1 << 5) + static_cast<int>(form_path_tokens_.size()); |
+ score += (1 << 6) + static_cast<int>(form_path_tokens_.size()); |
} else { |
// Walk the origin URL paths one directory at a time to see how |
// deep the two match. |
@@ -555,9 +565,12 @@ int PasswordFormManager::ScoreResult(const PasswordForm& candidate) const { |
score++; |
} |
// do we have a partial match? |
- score += (depth > 0) ? 1 << 4 : 0; |
+ score += (depth > 0) ? 1 << 5 : 0; |
} |
if (observed_form_.scheme == PasswordForm::SCHEME_HTML) { |
+ // PSL origin matched domains should have lower score than perfect matches. |
+ if (!candidate.is_psl_origin_match) |
+ score += 1 << 4; |
if (candidate.action == observed_form_.action) |
score += 1 << 3; |
if (candidate.password_element == observed_form_.password_element) |