Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" | 5 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "chrome/app/chrome_command_ids.h" | 8 #include "chrome/app/chrome_command_ids.h" |
| 9 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 9 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| 10 #include "chrome/browser/password_manager/chrome_password_manager_client.h" | 10 #include "chrome/browser/password_manager/chrome_password_manager_client.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 password_manager::PasswordStore* GetPasswordStore( | 37 password_manager::PasswordStore* GetPasswordStore( |
| 38 content::WebContents* web_contents) { | 38 content::WebContents* web_contents) { |
| 39 return PasswordStoreFactory::GetForProfile( | 39 return PasswordStoreFactory::GetForProfile( |
| 40 Profile::FromBrowserContext(web_contents->GetBrowserContext()), | 40 Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
| 41 ServiceAccessType::EXPLICIT_ACCESS).get(); | 41 ServiceAccessType::EXPLICIT_ACCESS).get(); |
| 42 } | 42 } |
| 43 | 43 |
| 44 autofill::ConstPasswordFormMap ConstifyMap( | |
| 45 const autofill::PasswordFormMap& map) { | |
| 46 autofill::ConstPasswordFormMap ret; | |
| 47 ret.insert(map.begin(), map.end()); | |
| 48 return ret; | |
| 49 } | |
| 50 | |
| 51 // Performs a deep copy of the PasswordForm pointers in |map|. The resulting map | |
| 52 // is returned via |ret|. |deleter| is populated with these new objects. | |
| 53 void DeepCopyMap(const autofill::PasswordFormMap& map, | |
| 54 autofill::ConstPasswordFormMap* ret, | |
| 55 ScopedVector<autofill::PasswordForm>* deleter) { | |
| 56 ConstifyMap(map).swap(*ret); | |
| 57 deleter->clear(); | |
| 58 for (autofill::ConstPasswordFormMap::iterator i = ret->begin(); | |
| 59 i != ret->end(); ++i) { | |
| 60 deleter->push_back(new autofill::PasswordForm(*i->second)); | |
| 61 i->second = deleter->back(); | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 } // namespace | 44 } // namespace |
| 66 | 45 |
| 67 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); | 46 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); |
| 68 | 47 |
| 69 ManagePasswordsUIController::ManagePasswordsUIController( | 48 ManagePasswordsUIController::ManagePasswordsUIController( |
| 70 content::WebContents* web_contents) | 49 content::WebContents* web_contents) |
| 71 : content::WebContentsObserver(web_contents), | 50 : content::WebContentsObserver(web_contents), |
| 72 state_(password_manager::ui::INACTIVE_STATE), | |
| 73 should_pop_up_bubble_(false) { | 51 should_pop_up_bubble_(false) { |
| 52 passwords_data_.set_client( | |
| 53 ChromePasswordManagerClient::FromWebContents(web_contents)); | |
| 74 password_manager::PasswordStore* password_store = | 54 password_manager::PasswordStore* password_store = |
| 75 GetPasswordStore(web_contents); | 55 GetPasswordStore(web_contents); |
| 76 if (password_store) | 56 if (password_store) |
| 77 password_store->AddObserver(this); | 57 password_store->AddObserver(this); |
| 78 } | 58 } |
| 79 | 59 |
| 80 ManagePasswordsUIController::~ManagePasswordsUIController() {} | 60 ManagePasswordsUIController::~ManagePasswordsUIController() {} |
| 81 | 61 |
| 82 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { | 62 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { |
| 83 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't | 63 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't |
| 84 // display either the bubble or the icon. | 64 // display either the bubble or the icon. |
| 85 if (!BrowsingDataHelper::IsWebScheme( | 65 if (!BrowsingDataHelper::IsWebScheme( |
| 86 web_contents()->GetLastCommittedURL().scheme())) { | 66 web_contents()->GetLastCommittedURL().scheme())) { |
| 87 SetState(password_manager::ui::INACTIVE_STATE); | 67 passwords_data_.OnInactive(); |
| 88 } | 68 } |
| 89 | 69 |
| 90 #if !defined(OS_ANDROID) | 70 #if !defined(OS_ANDROID) |
| 91 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); | 71 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
| 92 if (!browser) | 72 if (!browser) |
| 93 return; | 73 return; |
| 94 LocationBar* location_bar = browser->window()->GetLocationBar(); | 74 LocationBar* location_bar = browser->window()->GetLocationBar(); |
| 95 DCHECK(location_bar); | 75 DCHECK(location_bar); |
| 96 location_bar->UpdateManagePasswordsIconAndBubble(); | 76 location_bar->UpdateManagePasswordsIconAndBubble(); |
| 97 #endif | 77 #endif |
| 98 } | 78 } |
| 99 | 79 |
| 100 void ManagePasswordsUIController:: | 80 void ManagePasswordsUIController:: |
| 101 UpdateAndroidAccountChooserInfoBarVisibility() { | 81 UpdateAndroidAccountChooserInfoBarVisibility() { |
| 102 #if defined(OS_ANDROID) | 82 #if defined(OS_ANDROID) |
| 103 AccountChooserInfoBarDelegateAndroid::Create( | 83 AccountChooserInfoBarDelegateAndroid::Create( |
| 104 InfoBarService::FromWebContents(web_contents()), this); | 84 InfoBarService::FromWebContents(web_contents()), this); |
| 105 should_pop_up_bubble_ = false; | 85 should_pop_up_bubble_ = false; |
| 106 #endif | 86 #endif |
| 107 } | 87 } |
| 108 | 88 |
| 109 base::TimeDelta ManagePasswordsUIController::Elapsed() const { | 89 base::TimeDelta ManagePasswordsUIController::Elapsed() const { |
| 110 return timer_ ? timer_->Elapsed() : base::TimeDelta::Max(); | 90 return timer_ ? timer_->Elapsed() : base::TimeDelta::Max(); |
| 111 } | 91 } |
| 112 | 92 |
| 113 void ManagePasswordsUIController::OnPasswordSubmitted( | 93 void ManagePasswordsUIController::OnPasswordSubmitted( |
| 114 scoped_ptr<PasswordFormManager> form_manager) { | 94 scoped_ptr<PasswordFormManager> form_manager) { |
| 115 form_manager_ = form_manager.Pass(); | 95 passwords_data_.OnPendingPassword(form_manager.Pass()); |
| 116 password_form_map_ = ConstifyMap(form_manager_->best_matches()); | |
| 117 origin_ = PendingPassword().origin; | |
| 118 SetState(password_manager::ui::PENDING_PASSWORD_STATE); | |
| 119 timer_.reset(new base::ElapsedTimer); | 96 timer_.reset(new base::ElapsedTimer); |
| 120 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); | 97 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); |
| 121 UpdateBubbleAndIconVisibility(); | 98 UpdateBubbleAndIconVisibility(); |
| 122 } | 99 } |
| 123 | 100 |
| 124 bool ManagePasswordsUIController::OnChooseCredentials( | 101 bool ManagePasswordsUIController::OnChooseCredentials( |
| 125 ScopedVector<autofill::PasswordForm> local_credentials, | 102 ScopedVector<autofill::PasswordForm> local_credentials, |
| 126 ScopedVector<autofill::PasswordForm> federated_credentials, | 103 ScopedVector<autofill::PasswordForm> federated_credentials, |
| 127 const GURL& origin, | 104 const GURL& origin, |
| 128 base::Callback<void(const password_manager::CredentialInfo&)> callback) { | 105 base::Callback<void(const password_manager::CredentialInfo&)> callback) { |
| 129 DCHECK(!local_credentials.empty() || !federated_credentials.empty()); | 106 DCHECK_IMPLIES(local_credentials.empty(), !federated_credentials.empty()); |
| 130 SaveForms(local_credentials.Pass(), federated_credentials.Pass()); | 107 passwords_data_.OnRequestCredentials(local_credentials.Pass(), |
| 131 origin_ = origin; | 108 federated_credentials.Pass(), |
| 132 SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE); | 109 origin); |
| 133 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); | 110 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); |
| 134 #if defined(OS_ANDROID) | 111 #if defined(OS_ANDROID) |
| 135 UpdateAndroidAccountChooserInfoBarVisibility(); | 112 UpdateAndroidAccountChooserInfoBarVisibility(); |
| 136 #else | 113 #else |
| 137 UpdateBubbleAndIconVisibility(); | 114 UpdateBubbleAndIconVisibility(); |
| 138 #endif | 115 #endif |
| 139 if (!should_pop_up_bubble_) { | 116 if (!should_pop_up_bubble_) { |
| 140 credentials_callback_ = callback; | 117 passwords_data_.set_credentials_callback(callback); |
| 141 return true; | 118 return true; |
| 142 } | 119 } |
| 120 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 143 return false; | 121 return false; |
| 144 } | 122 } |
| 145 | 123 |
| 146 void ManagePasswordsUIController::OnAutoSignin( | 124 void ManagePasswordsUIController::OnAutoSignin( |
| 147 ScopedVector<autofill::PasswordForm> local_forms) { | 125 ScopedVector<autofill::PasswordForm> local_forms) { |
| 148 DCHECK(!local_forms.empty()); | 126 DCHECK(!local_forms.empty()); |
| 149 SaveForms(local_forms.Pass(), ScopedVector<autofill::PasswordForm>()); | 127 passwords_data_.OnAutoSignin(local_forms.Pass()); |
| 150 origin_ = local_credentials_forms_[0]->origin; | |
| 151 SetState(password_manager::ui::AUTO_SIGNIN_STATE); | |
| 152 timer_.reset(new base::ElapsedTimer); | 128 timer_.reset(new base::ElapsedTimer); |
| 153 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); | 129 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); |
| 154 UpdateBubbleAndIconVisibility(); | 130 UpdateBubbleAndIconVisibility(); |
| 155 } | 131 } |
| 156 | 132 |
| 157 void ManagePasswordsUIController::OnAutomaticPasswordSave( | 133 void ManagePasswordsUIController::OnAutomaticPasswordSave( |
| 158 scoped_ptr<PasswordFormManager> form_manager) { | 134 scoped_ptr<PasswordFormManager> form_manager) { |
| 159 form_manager_ = form_manager.Pass(); | 135 passwords_data_.OnAutomaticPasswordSave(form_manager.Pass()); |
| 160 password_form_map_ = ConstifyMap(form_manager_->best_matches()); | |
| 161 password_form_map_[form_manager_->associated_username()] = | |
| 162 &form_manager_->pending_credentials(); | |
| 163 origin_ = form_manager_->pending_credentials().origin; | |
| 164 SetState(password_manager::ui::CONFIRMATION_STATE); | |
| 165 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); | 136 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); |
| 166 UpdateBubbleAndIconVisibility(); | 137 UpdateBubbleAndIconVisibility(); |
| 167 } | 138 } |
| 168 | 139 |
| 169 void ManagePasswordsUIController::OnPasswordAutofilled( | 140 void ManagePasswordsUIController::OnPasswordAutofilled( |
| 170 const PasswordFormMap& password_form_map) { | 141 const PasswordFormMap& password_form_map) { |
| 171 DeepCopyMap(password_form_map, &password_form_map_, &new_password_forms_); | 142 passwords_data_.OnPasswordAutofilled(password_form_map); |
| 172 origin_ = password_form_map_.begin()->second->origin; | |
| 173 // Don't show the UI for PSL matched passwords. They are not stored for this | |
| 174 // page and cannot be deleted. | |
| 175 SetState(password_form_map_.begin()->second->IsPublicSuffixMatch() | |
| 176 ? password_manager::ui::INACTIVE_STATE | |
| 177 : password_manager::ui::MANAGE_STATE); | |
| 178 UpdateBubbleAndIconVisibility(); | 143 UpdateBubbleAndIconVisibility(); |
| 179 } | 144 } |
| 180 | 145 |
| 181 void ManagePasswordsUIController::OnBlacklistBlockedAutofill( | 146 void ManagePasswordsUIController::OnBlacklistBlockedAutofill( |
| 182 const PasswordFormMap& password_form_map) { | 147 const PasswordFormMap& password_form_map) { |
| 183 DeepCopyMap(password_form_map, &password_form_map_, &new_password_forms_); | 148 passwords_data_.OnBlacklistBlockedAutofill(password_form_map); |
| 184 origin_ = password_form_map_.begin()->second->origin; | |
| 185 SetState(password_manager::ui::BLACKLIST_STATE); | |
| 186 UpdateBubbleAndIconVisibility(); | 149 UpdateBubbleAndIconVisibility(); |
| 187 } | 150 } |
| 188 | 151 |
| 189 void ManagePasswordsUIController::OnLoginsChanged( | 152 void ManagePasswordsUIController::OnLoginsChanged( |
| 190 const password_manager::PasswordStoreChangeList& changes) { | 153 const password_manager::PasswordStoreChangeList& changes) { |
| 191 password_manager::ui::State current_state = state_; | 154 password_manager::ui::State current_state = state(); |
| 192 for (password_manager::PasswordStoreChangeList::const_iterator it = | 155 passwords_data_.ProcessLoginsChanged(changes); |
| 193 changes.begin(); | 156 if (current_state != state()) |
| 194 it != changes.end(); | |
| 195 it++) { | |
| 196 const autofill::PasswordForm& changed_form = it->form(); | |
| 197 if (changed_form.origin != origin_) | |
| 198 continue; | |
| 199 | |
| 200 if (it->type() == password_manager::PasswordStoreChange::REMOVE) { | |
| 201 password_form_map_.erase(changed_form.username_value); | |
| 202 if (changed_form.blacklisted_by_user) | |
| 203 SetState(password_manager::ui::MANAGE_STATE); | |
| 204 } else { | |
| 205 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); | |
| 206 password_form_map_[changed_form.username_value] = | |
| 207 new_password_forms_.back(); | |
| 208 if (changed_form.blacklisted_by_user) | |
| 209 SetState(password_manager::ui::BLACKLIST_STATE); | |
| 210 } | |
| 211 } | |
| 212 // TODO(vasilii): handle CREDENTIAL_REQUEST_STATE. | |
| 213 if (current_state != state_) | |
| 214 UpdateBubbleAndIconVisibility(); | 157 UpdateBubbleAndIconVisibility(); |
| 215 } | 158 } |
| 216 | 159 |
| 217 void ManagePasswordsUIController:: | 160 void ManagePasswordsUIController:: |
| 218 NavigateToPasswordManagerSettingsPage() { | 161 NavigateToPasswordManagerSettingsPage() { |
| 219 #if defined(OS_ANDROID) | 162 #if defined(OS_ANDROID) |
| 220 chrome::android::ChromiumApplication::ShowPasswordSettings(); | 163 chrome::android::ChromiumApplication::ShowPasswordSettings(); |
| 221 #else | 164 #else |
| 222 chrome::ShowSettingsSubPage( | 165 chrome::ShowSettingsSubPage( |
| 223 chrome::FindBrowserWithWebContents(web_contents()), | 166 chrome::FindBrowserWithWebContents(web_contents()), |
| 224 chrome::kPasswordManagerSubPage); | 167 chrome::kPasswordManagerSubPage); |
| 225 #endif | 168 #endif |
| 226 } | 169 } |
| 227 | 170 |
| 228 void ManagePasswordsUIController::SavePassword() { | 171 void ManagePasswordsUIController::SavePassword() { |
| 229 DCHECK(PasswordPendingUserDecision()); | 172 DCHECK(PasswordPendingUserDecision()); |
| 230 SavePasswordInternal(); | 173 SavePasswordInternal(); |
| 231 SetState(password_manager::ui::MANAGE_STATE); | 174 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); |
| 232 UpdateBubbleAndIconVisibility(); | 175 UpdateBubbleAndIconVisibility(); |
| 233 } | 176 } |
| 234 | 177 |
| 235 void ManagePasswordsUIController::ChooseCredential( | 178 void ManagePasswordsUIController::ChooseCredential( |
| 236 const autofill::PasswordForm& form, | 179 const autofill::PasswordForm& form, |
| 237 password_manager::CredentialType credential_type) { | 180 password_manager::CredentialType credential_type) { |
| 238 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); | 181 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state()); |
| 239 DCHECK(!credentials_callback_.is_null()); | 182 DCHECK(!passwords_data_.credentials_callback().is_null()); |
| 240 | 183 |
| 241 // Here, |credential_type| refers to whether the credential was originally | 184 // Here, |credential_type| refers to whether the credential was originally |
| 242 // passed into ::OnChooseCredentials as part of the |local_credentials| or | 185 // passed into ::OnChooseCredentials as part of the |local_credentials| or |
| 243 // |federated_credentials| lists (e.g. whether it is an existing credential | 186 // |federated_credentials| lists (e.g. whether it is an existing credential |
| 244 // saved for this origin, or whether we should synthesize a new | 187 // saved for this origin, or whether we should synthesize a new |
| 245 // FederatedCredential). | 188 // FederatedCredential). |
| 246 // | 189 // |
| 247 // If |credential_type| is federated, the credential MUST be returned as | 190 // If |credential_type| is federated, the credential MUST be returned as |
| 248 // a FederatedCredential in order to prevent password information leaking | 191 // a FederatedCredential in order to prevent password information leaking |
| 249 // cross-origin. | 192 // cross-origin. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 260 type_to_return = password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL; | 203 type_to_return = password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL; |
| 261 } else if (credential_type == | 204 } else if (credential_type == |
| 262 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY) { | 205 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY) { |
| 263 type_to_return = password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY; | 206 type_to_return = password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY; |
| 264 } else { | 207 } else { |
| 265 type_to_return = | 208 type_to_return = |
| 266 password_manager::CredentialType::CREDENTIAL_TYPE_FEDERATED; | 209 password_manager::CredentialType::CREDENTIAL_TYPE_FEDERATED; |
| 267 } | 210 } |
| 268 password_manager::CredentialInfo info = | 211 password_manager::CredentialInfo info = |
| 269 password_manager::CredentialInfo(form, type_to_return); | 212 password_manager::CredentialInfo(form, type_to_return); |
| 270 credentials_callback_.Run(info); | 213 passwords_data_.credentials_callback().Run(info); |
| 271 credentials_callback_.Reset(); | 214 passwords_data_.set_credentials_callback( |
| 215 ManagePasswordsState::CredentialsCallback()); | |
| 272 } | 216 } |
| 273 | 217 |
| 274 void ManagePasswordsUIController::SavePasswordInternal() { | 218 void ManagePasswordsUIController::SavePasswordInternal() { |
| 275 DCHECK(form_manager_.get()); | 219 password_manager::PasswordFormManager* form_manager = |
| 276 form_manager_->Save(); | 220 passwords_data_.form_manager(); |
| 221 DCHECK(form_manager); | |
| 222 form_manager->Save(); | |
| 277 } | 223 } |
| 278 | 224 |
| 279 void ManagePasswordsUIController::NeverSavePassword() { | 225 void ManagePasswordsUIController::NeverSavePassword() { |
| 280 DCHECK(PasswordPendingUserDecision()); | 226 DCHECK(PasswordPendingUserDecision()); |
| 281 NeverSavePasswordInternal(); | 227 NeverSavePasswordInternal(); |
| 282 SetState(password_manager::ui::BLACKLIST_STATE); | 228 passwords_data_.TransitionToState(password_manager::ui::BLACKLIST_STATE); |
| 283 UpdateBubbleAndIconVisibility(); | 229 UpdateBubbleAndIconVisibility(); |
| 284 } | 230 } |
| 285 | 231 |
| 286 void ManagePasswordsUIController::NeverSavePasswordInternal() { | 232 void ManagePasswordsUIController::NeverSavePasswordInternal() { |
| 287 DCHECK(form_manager_.get()); | 233 password_manager::PasswordFormManager* form_manager = |
| 288 form_manager_->PermanentlyBlacklist(); | 234 passwords_data_.form_manager(); |
| 235 DCHECK(form_manager); | |
| 236 form_manager->PermanentlyBlacklist(); | |
| 289 } | 237 } |
| 290 | 238 |
| 291 void ManagePasswordsUIController::UnblacklistSite() { | 239 void ManagePasswordsUIController::UnblacklistSite() { |
| 292 // We're in one of two states: either the user _just_ blacklisted the site | 240 // We're in one of two states: either the user _just_ blacklisted the site |
| 293 // by clicking "Never save" in the pending bubble, or the user is visiting | 241 // by clicking "Never save" in the pending bubble, or the user is visiting |
| 294 // a blacklisted site. | 242 // a blacklisted site. |
| 295 // | 243 // |
| 296 // Either way, |password_form_map_| has been populated with the relevant | 244 // Either way, |passwords_data_| has been populated with the relevant form. We |
| 297 // form. We can safely pull it out, send it over to the password store | 245 // can safely pull it out, send it over to the password store for removal, and |
| 298 // for removal, and update our internal state. | 246 // update our internal state. |
| 299 DCHECK(!password_form_map_.empty()); | 247 DCHECK(!passwords_data_.GetCurrentForms().empty()); |
| 300 DCHECK(password_form_map_.begin()->second); | 248 DCHECK_EQ(password_manager::ui::BLACKLIST_STATE, state()); |
| 301 DCHECK(state_ == password_manager::ui::BLACKLIST_STATE); | |
| 302 password_manager::PasswordStore* password_store = | 249 password_manager::PasswordStore* password_store = |
| 303 GetPasswordStore(web_contents()); | 250 GetPasswordStore(web_contents()); |
| 304 if (password_store) | 251 if (password_store) |
| 305 password_store->RemoveLogin(*password_form_map_.begin()->second); | 252 password_store->RemoveLogin(*passwords_data_.GetCurrentForms().front()); |
|
vabr (Chromium)
2015/03/17 11:55:13
nit: Consider adding a DCHECK that the removed cre
vasilii
2015/03/17 12:11:33
Done.
| |
| 306 SetState(password_manager::ui::MANAGE_STATE); | 253 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); |
| 307 UpdateBubbleAndIconVisibility(); | 254 UpdateBubbleAndIconVisibility(); |
| 308 } | 255 } |
| 309 | 256 |
| 310 void ManagePasswordsUIController::DidNavigateMainFrame( | 257 void ManagePasswordsUIController::DidNavigateMainFrame( |
| 311 const content::LoadCommittedDetails& details, | 258 const content::LoadCommittedDetails& details, |
| 312 const content::FrameNavigateParams& params) { | 259 const content::FrameNavigateParams& params) { |
| 313 // Don't react to in-page (fragment) navigations. | 260 // Don't react to in-page (fragment) navigations. |
| 314 if (details.is_in_page) | 261 if (details.is_in_page) |
| 315 return; | 262 return; |
| 316 | 263 |
| 317 // Don't do anything if a navigation occurs before a user could reasonably | 264 // Don't do anything if a navigation occurs before a user could reasonably |
| 318 // interact with the password bubble. | 265 // interact with the password bubble. |
| 319 if (Elapsed() < base::TimeDelta::FromSeconds(1)) | 266 if (Elapsed() < base::TimeDelta::FromSeconds(1)) |
| 320 return; | 267 return; |
| 321 | 268 |
| 322 // Otherwise, reset the password manager and the timer. | 269 // Otherwise, reset the password manager and the timer. |
| 323 SetState(password_manager::ui::INACTIVE_STATE); | 270 passwords_data_.OnInactive(); |
| 324 UpdateBubbleAndIconVisibility(); | 271 UpdateBubbleAndIconVisibility(); |
| 325 // This allows the bubble to survive several redirects in case the whole | 272 // This allows the bubble to survive several redirects in case the whole |
| 326 // process of navigating to the landing page is longer than 1 second. | 273 // process of navigating to the landing page is longer than 1 second. |
| 327 timer_.reset(new base::ElapsedTimer()); | 274 timer_.reset(new base::ElapsedTimer()); |
| 328 } | 275 } |
| 329 | 276 |
| 330 void ManagePasswordsUIController::WasHidden() { | 277 void ManagePasswordsUIController::WasHidden() { |
| 331 #if !defined(OS_ANDROID) | 278 #if !defined(OS_ANDROID) |
| 332 TabDialogs::FromWebContents(web_contents())->HideManagePasswordsBubble(); | 279 TabDialogs::FromWebContents(web_contents())->HideManagePasswordsBubble(); |
| 333 #endif | 280 #endif |
| 334 } | 281 } |
| 335 | 282 |
| 336 void ManagePasswordsUIController::SetState(password_manager::ui::State state) { | |
| 337 password_manager::PasswordManagerClient* client = | |
| 338 ChromePasswordManagerClient::FromWebContents(web_contents()); | |
| 339 // |client| might be NULL in tests. | |
| 340 if (client && client->IsLoggingActive()) { | |
| 341 password_manager::BrowserSavePasswordProgressLogger logger(client); | |
| 342 logger.LogNumber( | |
| 343 autofill::SavePasswordProgressLogger::STRING_NEW_UI_STATE, | |
| 344 state); | |
| 345 } | |
| 346 state_ = state; | |
| 347 } | |
| 348 | |
| 349 const autofill::PasswordForm& ManagePasswordsUIController:: | 283 const autofill::PasswordForm& ManagePasswordsUIController:: |
| 350 PendingPassword() const { | 284 PendingPassword() const { |
| 351 DCHECK(form_manager_); | 285 DCHECK(state() == password_manager::ui::PENDING_PASSWORD_STATE || |
| 352 return form_manager_->pending_credentials(); | 286 state() == password_manager::ui::CONFIRMATION_STATE) << state(); |
| 287 password_manager::PasswordFormManager* form_manager = | |
| 288 passwords_data_.form_manager(); | |
| 289 DCHECK(form_manager); | |
| 290 return form_manager->pending_credentials(); | |
| 353 } | 291 } |
| 354 | 292 |
| 355 void ManagePasswordsUIController::UpdateIconAndBubbleState( | 293 void ManagePasswordsUIController::UpdateIconAndBubbleState( |
| 356 ManagePasswordsIcon* icon) { | 294 ManagePasswordsIcon* icon) { |
| 357 if (should_pop_up_bubble_) { | 295 if (should_pop_up_bubble_) { |
| 358 // We must display the icon before showing the bubble, as the bubble would | 296 // We must display the icon before showing the bubble, as the bubble would |
| 359 // be otherwise unanchored. | 297 // be otherwise unanchored. |
| 360 icon->SetState(state_); | 298 icon->SetState(state()); |
| 361 ShowBubbleWithoutUserInteraction(); | 299 ShowBubbleWithoutUserInteraction(); |
| 362 } else { | 300 } else { |
| 363 icon->SetState(state_); | 301 icon->SetState(state()); |
| 364 } | 302 } |
| 365 } | 303 } |
| 366 | 304 |
| 367 void ManagePasswordsUIController::OnBubbleShown() { | 305 void ManagePasswordsUIController::OnBubbleShown() { |
| 368 should_pop_up_bubble_ = false; | 306 should_pop_up_bubble_ = false; |
| 369 } | 307 } |
| 370 | 308 |
| 371 void ManagePasswordsUIController::OnBubbleHidden() { | 309 void ManagePasswordsUIController::OnBubbleHidden() { |
| 372 password_manager::ui::State next_state = state_; | 310 password_manager::ui::State next_state = state(); |
| 373 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) | 311 if (state() == password_manager::ui::CREDENTIAL_REQUEST_STATE) |
| 374 next_state = password_manager::ui::INACTIVE_STATE; | |
| 375 else if (state_ == password_manager::ui::CONFIRMATION_STATE) | |
| 376 next_state = password_manager::ui::MANAGE_STATE; | 312 next_state = password_manager::ui::MANAGE_STATE; |
| 377 else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) | 313 else if (state() == password_manager::ui::CONFIRMATION_STATE) |
| 314 next_state = password_manager::ui::MANAGE_STATE; | |
| 315 else if (state() == password_manager::ui::AUTO_SIGNIN_STATE) | |
| 378 next_state = password_manager::ui::INACTIVE_STATE; | 316 next_state = password_manager::ui::INACTIVE_STATE; |
| 379 | 317 |
| 380 if (next_state != state_) { | 318 if (next_state != state()) { |
| 381 SetState(next_state); | 319 if (next_state == password_manager::ui::INACTIVE_STATE) |
| 320 passwords_data_.OnInactive(); | |
| 321 else | |
| 322 passwords_data_.TransitionToState(next_state); | |
| 382 UpdateBubbleAndIconVisibility(); | 323 UpdateBubbleAndIconVisibility(); |
| 383 } | 324 } |
| 384 } | 325 } |
| 385 | 326 |
| 386 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { | 327 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
| 387 DCHECK(should_pop_up_bubble_); | 328 DCHECK(should_pop_up_bubble_); |
| 388 #if !defined(OS_ANDROID) | 329 #if !defined(OS_ANDROID) |
| 389 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); | 330 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
| 390 if (!browser || browser->toolbar_model()->input_in_progress()) | 331 if (!browser || browser->toolbar_model()->input_in_progress()) |
| 391 return; | 332 return; |
| 392 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && | 333 if (state() == password_manager::ui::PENDING_PASSWORD_STATE && |
| 393 !password_bubble_experiment::ShouldShowBubble( | 334 !password_bubble_experiment::ShouldShowBubble( |
| 394 browser->profile()->GetPrefs())) | 335 browser->profile()->GetPrefs())) |
| 395 return; | 336 return; |
| 396 CommandUpdater* updater = browser->command_controller()->command_updater(); | 337 CommandUpdater* updater = browser->command_controller()->command_updater(); |
| 397 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); | 338 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); |
| 398 #endif | 339 #endif |
| 399 } | 340 } |
| 400 | 341 |
| 401 bool ManagePasswordsUIController::PasswordPendingUserDecision() const { | |
| 402 return state_ == password_manager::ui::PENDING_PASSWORD_STATE; | |
| 403 } | |
| 404 | |
| 405 void ManagePasswordsUIController::WebContentsDestroyed() { | 342 void ManagePasswordsUIController::WebContentsDestroyed() { |
| 406 password_manager::PasswordStore* password_store = | 343 password_manager::PasswordStore* password_store = |
| 407 GetPasswordStore(web_contents()); | 344 GetPasswordStore(web_contents()); |
| 408 if (password_store) | 345 if (password_store) |
| 409 password_store->RemoveObserver(this); | 346 password_store->RemoveObserver(this); |
| 410 } | 347 } |
| 411 | |
| 412 void ManagePasswordsUIController::SaveForms( | |
| 413 ScopedVector<autofill::PasswordForm> local_forms, | |
| 414 ScopedVector<autofill::PasswordForm> federated_forms) { | |
| 415 form_manager_.reset(); | |
| 416 origin_ = GURL(); | |
| 417 local_credentials_forms_.swap(local_forms); | |
| 418 federated_credentials_forms_.swap(federated_forms); | |
| 419 // The map is useless because usernames may overlap. | |
| 420 password_form_map_.clear(); | |
| 421 new_password_forms_.clear(); | |
| 422 } | |
| OLD | NEW |