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 4c0a4c3bcd07ce80ac680f2213bce96ca25bd886..d481abf07db15322cd1f3c7c9d09ebbf7f462860 100644 |
--- a/components/password_manager/core/browser/password_manager.cc |
+++ b/components/password_manager/core/browser/password_manager.cc |
@@ -310,10 +310,19 @@ void PasswordManager::OnPasswordFormSubmitted( |
void PasswordManager::OnPasswordFormsParsed( |
const std::vector<PasswordForm>& forms) { |
+ CreatePendingLoginManagers(forms); |
+} |
+ |
+void PasswordManager::CreatePendingLoginManagers( |
+ const std::vector<PasswordForm>& forms) { |
// Don't try to autofill or save passwords in the presence of SSL errors. |
if (driver_->DidLastPageLoadEncounterSSLErrors()) |
return; |
+ // Copy the weak pointers to the currently known login managers for comparison |
+ // against the newly added. |
+ std::vector<PasswordFormManager*> old_login_managers( |
+ pending_login_managers_.get()); |
for (std::vector<PasswordForm>::const_iterator iter = forms.begin(); |
iter != forms.end(); |
++iter) { |
@@ -321,6 +330,16 @@ void PasswordManager::OnPasswordFormsParsed( |
// SpdyProxy authentication, as indicated by the realm. |
if (EndsWith(iter->signon_realm, kSpdyProxyRealm, true)) |
continue; |
+ bool old_manager_found = false; |
+ for (std::vector<PasswordFormManager*>::const_iterator old_manager = |
+ old_login_managers.begin(); |
+ !old_manager_found && old_manager != old_login_managers.end(); |
+ ++old_manager) { |
+ old_manager_found |= (*old_manager)->DoesManage( |
+ *iter, PasswordFormManager::ACTION_MATCH_REQUIRED); |
+ } |
+ if (old_manager_found) |
+ continue; // The current form is already managed. |
bool ssl_valid = iter->origin.SchemeIsSecure(); |
PasswordFormManager* manager = |
@@ -346,6 +365,8 @@ bool PasswordManager::ShouldPromptUserToSavePassword() const { |
void PasswordManager::OnPasswordFormsRendered( |
const std::vector<PasswordForm>& visible_forms) { |
+ CreatePendingLoginManagers(visible_forms); |
+ |
scoped_ptr<BrowserSavePasswordProgressLogger> logger; |
if (client_->IsLoggingActive()) { |
logger.reset(new BrowserSavePasswordProgressLogger(client_)); |