Index: chrome/browser/ui/passwords/manage_passwords_ui_controller.cc |
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc |
index 6827ccd0a9617e81d4be0786d1fcc47c2e634a0b..b0f2016be1ada815a13120d6e886559d22f2f29c 100644 |
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc |
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/ui/passwords/manage_passwords_icon.h" |
#include "chrome/browser/ui/passwords/password_bubble_experiment.h" |
#include "chrome/common/url_constants.h" |
+#include "components/password_manager/content/common/credential_manager_types.h" |
#include "components/password_manager/core/browser/password_form_manager.h" |
#include "content/public/browser/navigation_details.h" |
@@ -62,7 +63,8 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); |
ManagePasswordsUIController::ManagePasswordsUIController( |
content::WebContents* web_contents) |
: content::WebContentsObserver(web_contents), |
- state_(password_manager::ui::INACTIVE_STATE) { |
+ state_(password_manager::ui::INACTIVE_STATE), |
+ bubble_shown_(false) { |
password_manager::PasswordStore* password_store = |
GetPasswordStore(web_contents); |
if (password_store) |
@@ -72,6 +74,7 @@ ManagePasswordsUIController::ManagePasswordsUIController( |
ManagePasswordsUIController::~ManagePasswordsUIController() {} |
void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { |
+ bubble_shown_ = false; |
// If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't |
// display either the bubble or the icon. |
if (!BrowsingDataHelper::IsWebScheme( |
@@ -79,25 +82,41 @@ void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { |
state_ = password_manager::ui::INACTIVE_STATE; |
} |
- #if !defined(OS_ANDROID) |
- Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
- if (!browser) |
- return; |
- LocationBar* location_bar = browser->window()->GetLocationBar(); |
- DCHECK(location_bar); |
- location_bar->UpdateManagePasswordsIconAndBubble(); |
- #endif |
+#if !defined(OS_ANDROID) |
+ Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
+ if (!browser) |
+ return; |
+ LocationBar* location_bar = browser->window()->GetLocationBar(); |
+ DCHECK(location_bar); |
+ location_bar->UpdateManagePasswordsIconAndBubble(); |
+#endif |
} |
void ManagePasswordsUIController::OnPasswordSubmitted( |
scoped_ptr<PasswordFormManager> form_manager) { |
form_manager_ = form_manager.Pass(); |
password_form_map_ = ConstifyMap(form_manager_->best_matches()); |
- origin_ = PendingCredentials().origin; |
+ origin_ = PendingPassword().origin; |
state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; |
UpdateBubbleAndIconVisibility(); |
} |
+bool ManagePasswordsUIController::OnChooseCredentials( |
+ ScopedVector<autofill::PasswordForm> credentials, |
+ base::Callback<void(const password_manager::CredentialInfo&)> callback){ |
+ DCHECK(!credentials.empty()); |
+ form_manager_.reset(); |
+ origin_ = credentials[0]->origin; |
+ new_password_forms_.swap(credentials); |
+ // The map is useless because usernames may overlap. |
+ password_form_map_.clear(); |
+ state_ = password_manager::ui::CREDENTIAL_REQUEST_AND_BUBBLE_STATE; |
+ UpdateBubbleAndIconVisibility(); |
+ if (bubble_shown_) |
+ credentials_callback_ = callback; |
+ return bubble_shown_; |
+} |
+ |
void ManagePasswordsUIController::OnAutomaticPasswordSave( |
scoped_ptr<PasswordFormManager> form_manager) { |
form_manager_ = form_manager.Pass(); |
@@ -148,6 +167,7 @@ void ManagePasswordsUIController::OnLoginsChanged( |
state_ = password_manager::ui::BLACKLIST_STATE; |
} |
} |
+ // TODO(vasilii): handle CREDENTIAL_REQUEST_STATE. |
if (current_state != state_) |
UpdateBubbleAndIconVisibility(); |
} |
@@ -170,6 +190,19 @@ void ManagePasswordsUIController::SavePassword() { |
UpdateBubbleAndIconVisibility(); |
} |
+void ManagePasswordsUIController::ChooseCredential( |
+ bool was_chosen, |
+ const autofill::PasswordForm& form) { |
+ DCHECK(password_manager::ui::IsCredentialsState(state_)); |
+ DCHECK(!credentials_callback_.is_null()); |
+ password_manager::CredentialInfo info = was_chosen ? |
+ password_manager::CredentialInfo(form) : |
+ password_manager::CredentialInfo(); |
+ credentials_callback_.Run(info); |
+ state_ = password_manager::ui::INACTIVE_STATE; |
+ UpdateBubbleAndIconVisibility(); |
+} |
+ |
void ManagePasswordsUIController::SavePasswordInternal() { |
DCHECK(form_manager_.get()); |
form_manager_->Save(); |
@@ -231,7 +264,7 @@ void ManagePasswordsUIController::WasHidden() { |
} |
const autofill::PasswordForm& ManagePasswordsUIController:: |
- PendingCredentials() const { |
+ PendingPassword() const { |
DCHECK(form_manager_); |
return form_manager_->pending_credentials(); |
} |
@@ -254,6 +287,10 @@ void ManagePasswordsUIController::UpdateIconAndBubbleState( |
} |
} |
+void ManagePasswordsUIController::OnBubbleShown() { |
+ bubble_shown_ = true; |
+} |
+ |
void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
DCHECK(password_manager::ui::IsAutomaticDisplayState(state_)); |
#if !defined(OS_ANDROID) |
@@ -270,8 +307,7 @@ void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
} |
bool ManagePasswordsUIController::PasswordPendingUserDecision() const { |
- return state_ == password_manager::ui::PENDING_PASSWORD_STATE || |
- state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; |
+ return password_manager::ui::IsPendingState(state_); |
} |
void ManagePasswordsUIController::WebContentsDestroyed() { |