summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/password_manager.cc32
-rw-r--r--chrome/browser/password_manager.h29
2 files changed, 40 insertions, 21 deletions
diff --git a/chrome/browser/password_manager.cc b/chrome/browser/password_manager.cc
index 97c8ea7..8779209 100644
--- a/chrome/browser/password_manager.cc
+++ b/chrome/browser/password_manager.cc
@@ -77,33 +77,30 @@ void PasswordManager::ProvisionallySavePassword(PasswordForm form) {
ProcessedSSLErrorFromRequest();
form.preferred = true;
manager->ProvisionallySave(form);
- pending_save_manager_.reset(manager);
+ provisional_save_manager_.reset(manager);
pending_login_managers_.erase(iter);
// We don't care about the rest of the forms on the page now that one
// was selected.
STLDeleteElements(&pending_login_managers_);
- pending_login_managers_.clear();
}
void PasswordManager::DidNavigate() {
// As long as this navigation isn't due to a currently pending
// password form submit, we're ready to reset and move on.
- if (!pending_save_manager_.get() && !pending_login_managers_.empty()) {
+ if (!provisional_save_manager_.get() && !pending_login_managers_.empty())
STLDeleteElements(&pending_login_managers_);
- pending_login_managers_.clear();
- }
}
void PasswordManager::ClearProvisionalSave() {
- pending_save_manager_.reset();
+ provisional_save_manager_.reset();
}
void PasswordManager::DidStopLoading() {
- if (!pending_save_manager_.get())
+ if (!provisional_save_manager_.get())
return;
DCHECK(!web_contents_->profile()->IsOffTheRecord());
- DCHECK(!pending_save_manager_->IsBlacklisted());
+ DCHECK(!provisional_save_manager_->IsBlacklisted());
if (!web_contents_->profile() ||
!web_contents_->profile()->GetWebDataService(Profile::IMPLICIT_ACCESS))
@@ -111,13 +108,14 @@ void PasswordManager::DidStopLoading() {
if (!web_contents_->controller())
return;
- if (pending_save_manager_->IsNewLogin()) {
+ if (provisional_save_manager_->IsNewLogin()) {
web_contents_->AddInfoBar(this);
+ pending_decision_manager_.reset(provisional_save_manager_.release());
} else {
// If the save is not a new username entry, then we just want to save this
// data (since the user already has related data saved), so don't prompt.
- pending_save_manager_->Save();
- pending_save_manager_.reset();
+ provisional_save_manager_->Save();
+ provisional_save_manager_.reset();
}
}
@@ -136,12 +134,12 @@ void PasswordManager::PasswordFormsSeen(const std::vector<PasswordForm>& forms)
std::vector<PasswordForm>::const_iterator iter;
for (iter = forms.begin(); iter != forms.end(); iter++) {
- if (pending_save_manager_.get() &&
- pending_save_manager_->DoesManage(*iter)) {
+ if (provisional_save_manager_.get() &&
+ provisional_save_manager_->DoesManage(*iter)) {
// The form trying to be saved has immediately re-appeared. Assume
// login failure and abort this save. Fallback to pending login state
// since the user may try again.
- pending_login_managers_.push_back(pending_save_manager_.release());
+ pending_login_managers_.push_back(provisional_save_manager_.release());
// Don't delete the login managers since the user may try again
// and we want to be able to save in that case.
break;
@@ -184,7 +182,7 @@ void PasswordManager::Autofill(const PasswordForm& form_for_autofill,
// PasswordManager, ConfirmInfoBarDelegate implementation: ---------------------
void PasswordManager::InfoBarClosed() {
- pending_save_manager_.reset(NULL);
+ pending_decision_manager_.reset(NULL);
}
std::wstring PasswordManager::GetMessageText() const {
@@ -210,12 +208,12 @@ std::wstring PasswordManager::GetButtonLabel(InfoBarButton button) const {
}
bool PasswordManager::Accept() {
- pending_save_manager_->Save();
+ pending_decision_manager_->Save();
return true;
}
bool PasswordManager::Cancel() {
- pending_save_manager_->PermanentlyBlacklist();
+ pending_decision_manager_->PermanentlyBlacklist();
return true;
}
diff --git a/chrome/browser/password_manager.h b/chrome/browser/password_manager.h
index 1b57082..a1e28eb 100644
--- a/chrome/browser/password_manager.h
+++ b/chrome/browser/password_manager.h
@@ -70,6 +70,17 @@ class PasswordManager : public views::LoginModel,
virtual bool Accept();
virtual bool Cancel();
+ // Note about how a PasswordFormManager can transition from
+ // pending_login_managers_ to {provisional_save, pending_decision_}manager_.
+ //
+ // 1. form "seen"
+ // | new
+ // | ___ pending_decision
+ // pending_login -- form submit --> provisional_save ___/
+ // ^ | \___ (update DB)
+ // | fail
+ // |-----------<------<---------| !new
+ //
// When a form is "seen" on a page, a PasswordFormManager is created
// and stored in this collection until user navigates away from page.
typedef std::vector<PasswordFormManager*> LoginManagers;
@@ -79,11 +90,21 @@ class PasswordManager : public views::LoginModel,
// tab closes) on a page with a password form, thus containing login managers.
STLElementDeleter<LoginManagers> login_managers_deleter_;
- // When the user opts to save a password, this contains the
- // PasswordFormManager for the form in question.
- // Scoped incase PasswordManager gets deleted (e.g tab closes) between the
+ // When the user submits a password/credential, this contains the
+ // PasswordFormManager for the form in question until we deem the login
+ // attempt to have succeeded (as in valid credentials). If it fails, we
+ // send the PasswordFormManager back to the pending_login_managers_ set.
+ // Scoped in case PasswordManager gets deleted (e.g tab closes) between the
// time a user submits a login form and gets to the next page.
- scoped_ptr<PasswordFormManager> pending_save_manager_;
+ scoped_ptr<PasswordFormManager> provisional_save_manager_;
+
+ // After a successful *new* login attempt, we take the PasswordFormManager in
+ // provisional_save_manager_ and move it here while the user makes up their
+ // mind with the "save password" infobar. Note if the login is one we already
+ // know about, the end of the line is provisional_save_manager_ because we
+ // just update it on success and so such forms never end up in
+ // pending_decision_manager_.
+ scoped_ptr<PasswordFormManager> pending_decision_manager_;
// The containing WebContents
WebContents* web_contents_;