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..7c1f8979900cae677d5ba194dc50bf771d840da2 100644 |
--- a/chrome/browser/password_manager/password_manager.cc |
+++ b/chrome/browser/password_manager/password_manager.cc |
@@ -210,6 +210,11 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) { |
provisional_save_manager_.swap(manager); |
} |
+void PasswordManager::AddSubmissionCallback( |
+ const PasswordSubmittedCallback& callback) { |
+ submission_callbacks_.push_back(callback); |
+} |
+ |
void PasswordManager::AddObserver(LoginModelObserver* observer) { |
observers_.AddObserver(observer); |
} |
@@ -218,20 +223,13 @@ void PasswordManager::RemoveObserver(LoginModelObserver* observer) { |
observers_.RemoveObserver(observer); |
} |
-void PasswordManager::DidNavigateAnyFrame( |
+void PasswordManager::DidNavigateMainFrame( |
const content::LoadCommittedDetails& details, |
const content::FrameNavigateParams& params) { |
- bool password_form_submitted = params.password_form.origin.is_valid(); |
- |
- // Try to save the password if one was submitted. |
- if (password_form_submitted) |
- ProvisionallySavePassword(params.password_form); |
- |
- // Clear data after submission or main frame navigation. We don't want |
- // to clear data after subframe navigation as there might be password |
- // forms on other frames that could be submitted. |
- if (password_form_submitted || details.is_main_frame) |
- pending_login_managers_.clear(); |
+ // Clear data after main frame navigation. We don't want to clear data after |
+ // subframe navigation as there might be password forms on other frames that |
+ // could be submitted. |
+ pending_login_managers_.clear(); |
} |
bool PasswordManager::OnMessageReceived(const IPC::Message& message) { |
@@ -241,11 +239,23 @@ bool PasswordManager::OnMessageReceived(const IPC::Message& message) { |
OnPasswordFormsParsed) |
IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordFormsRendered, |
OnPasswordFormsRendered) |
+ IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordFormSubmitted, |
+ OnPasswordFormSubmitted) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
} |
+void PasswordManager::OnPasswordFormSubmitted( |
+ const PasswordForm& password_form) { |
+ ProvisionallySavePassword(password_form); |
+ for (size_t i = 0; i < submission_callbacks_.size(); ++i) { |
+ submission_callbacks_[i].Run(password_form); |
+ } |
+ |
+ pending_login_managers_.clear(); |
+} |
+ |
void PasswordManager::OnPasswordFormsParsed( |
const std::vector<PasswordForm>& forms) { |
// Ask the SSLManager for current security. |
@@ -373,7 +383,7 @@ void PasswordManager::Autofill( |
PossiblyInitializeUsernamesExperiment(best_matches); |
switch (form_for_autofill.scheme) { |
case PasswordForm::SCHEME_HTML: { |
- // Note the check above is required because the observer_ for a non-HTML |
+ // Note the check above is required because the observers_ for a non-HTML |
// schemed password form may have been freed, so we need to distinguish. |
autofill::PasswordFormFillData fill_data; |
InitPasswordFormFillData(form_for_autofill, |