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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 ScopedVector<autofill::PasswordForm>* deleter) { | 55 ScopedVector<autofill::PasswordForm>* deleter) { |
56 ConstifyMap(map).swap(*ret); | 56 ConstifyMap(map).swap(*ret); |
57 deleter->clear(); | 57 deleter->clear(); |
58 for (autofill::ConstPasswordFormMap::iterator i = ret->begin(); | 58 for (autofill::ConstPasswordFormMap::iterator i = ret->begin(); |
59 i != ret->end(); ++i) { | 59 i != ret->end(); ++i) { |
60 deleter->push_back(new autofill::PasswordForm(*i->second)); | 60 deleter->push_back(new autofill::PasswordForm(*i->second)); |
61 i->second = deleter->back(); | 61 i->second = deleter->back(); |
62 } | 62 } |
63 } | 63 } |
64 | 64 |
| 65 void RemoveFormFromVector(const autofill::PasswordForm& form_to_delete, |
| 66 ScopedVector<autofill::PasswordForm>* forms) { |
| 67 ScopedVector<autofill::PasswordForm>::iterator it = std::find_if( |
| 68 forms->begin(), forms->end(), |
| 69 [&form_to_delete](autofill::PasswordForm* form) { |
| 70 return IsEqualUniqueKey(*form, form_to_delete); |
| 71 }); |
| 72 if (it != forms->end()) |
| 73 forms->erase(it); |
| 74 } |
| 75 |
65 } // namespace | 76 } // namespace |
66 | 77 |
67 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); | 78 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); |
68 | 79 |
69 ManagePasswordsUIController::ManagePasswordsUIController( | 80 ManagePasswordsUIController::ManagePasswordsUIController( |
70 content::WebContents* web_contents) | 81 content::WebContents* web_contents) |
71 : content::WebContentsObserver(web_contents), | 82 : content::WebContentsObserver(web_contents), |
72 state_(password_manager::ui::INACTIVE_STATE), | 83 state_(password_manager::ui::INACTIVE_STATE), |
73 should_pop_up_bubble_(false) { | 84 should_pop_up_bubble_(false) { |
74 password_manager::PasswordStore* password_store = | 85 password_manager::PasswordStore* password_store = |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 const password_manager::PasswordStoreChangeList& changes) { | 209 const password_manager::PasswordStoreChangeList& changes) { |
199 password_manager::ui::State current_state = state_; | 210 password_manager::ui::State current_state = state_; |
200 for (password_manager::PasswordStoreChangeList::const_iterator it = | 211 for (password_manager::PasswordStoreChangeList::const_iterator it = |
201 changes.begin(); | 212 changes.begin(); |
202 it != changes.end(); | 213 it != changes.end(); |
203 it++) { | 214 it++) { |
204 const autofill::PasswordForm& changed_form = it->form(); | 215 const autofill::PasswordForm& changed_form = it->form(); |
205 if (changed_form.origin != origin_) | 216 if (changed_form.origin != origin_) |
206 continue; | 217 continue; |
207 | 218 |
| 219 // TODO(vasilii): refactor this messy code after deciding how to transition |
| 220 // within the new Credential Manager API states. |
208 if (it->type() == password_manager::PasswordStoreChange::REMOVE) { | 221 if (it->type() == password_manager::PasswordStoreChange::REMOVE) { |
209 password_form_map_.erase(changed_form.username_value); | 222 if (current_state == password_manager::ui::AUTO_SIGNIN_STATE || |
| 223 current_state == password_manager::ui::MANAGE_ACCOUNTS_STATE) { |
| 224 RemoveFormFromVector(changed_form, &local_credentials_forms_); |
| 225 } else { |
| 226 password_form_map_.erase(changed_form.username_value); |
| 227 } |
210 if (changed_form.blacklisted_by_user) | 228 if (changed_form.blacklisted_by_user) |
211 SetState(password_manager::ui::MANAGE_STATE); | 229 SetState(password_manager::ui::MANAGE_STATE); |
212 } else { | 230 } else { |
213 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); | 231 if (current_state == password_manager::ui::AUTO_SIGNIN_STATE || |
214 password_form_map_[changed_form.username_value] = | 232 current_state == password_manager::ui::MANAGE_ACCOUNTS_STATE) { |
215 new_password_forms_.back(); | 233 if (it->type() == password_manager::PasswordStoreChange::UPDATE) { |
| 234 RemoveFormFromVector(changed_form, &local_credentials_forms_); |
| 235 } |
| 236 local_credentials_forms_.push_back( |
| 237 new autofill::PasswordForm(changed_form)); |
| 238 } else { |
| 239 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); |
| 240 password_form_map_[changed_form.username_value] = |
| 241 new_password_forms_.back(); |
| 242 } |
216 if (changed_form.blacklisted_by_user) | 243 if (changed_form.blacklisted_by_user) |
217 SetState(password_manager::ui::BLACKLIST_STATE); | 244 SetState(password_manager::ui::BLACKLIST_STATE); |
218 } | 245 } |
219 } | 246 } |
220 // TODO(vasilii): handle CREDENTIAL_REQUEST_STATE. | |
221 if (current_state != state_) | 247 if (current_state != state_) |
222 UpdateBubbleAndIconVisibility(); | 248 UpdateBubbleAndIconVisibility(); |
223 } | 249 } |
224 | 250 |
225 void ManagePasswordsUIController:: | 251 void ManagePasswordsUIController:: |
226 NavigateToPasswordManagerSettingsPage() { | 252 NavigateToPasswordManagerSettingsPage() { |
227 #if defined(OS_ANDROID) | 253 #if defined(OS_ANDROID) |
228 chrome::android::ChromiumApplication::ShowPasswordSettings(); | 254 chrome::android::ChromiumApplication::ShowPasswordSettings(); |
229 #else | 255 #else |
230 chrome::ShowSettingsSubPage( | 256 chrome::ShowSettingsSubPage( |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 DCHECK(password_form_map_.begin()->second); | 334 DCHECK(password_form_map_.begin()->second); |
309 DCHECK(state_ == password_manager::ui::BLACKLIST_STATE); | 335 DCHECK(state_ == password_manager::ui::BLACKLIST_STATE); |
310 password_manager::PasswordStore* password_store = | 336 password_manager::PasswordStore* password_store = |
311 GetPasswordStore(web_contents()); | 337 GetPasswordStore(web_contents()); |
312 if (password_store) | 338 if (password_store) |
313 password_store->RemoveLogin(*password_form_map_.begin()->second); | 339 password_store->RemoveLogin(*password_form_map_.begin()->second); |
314 SetState(password_manager::ui::MANAGE_STATE); | 340 SetState(password_manager::ui::MANAGE_STATE); |
315 UpdateBubbleAndIconVisibility(); | 341 UpdateBubbleAndIconVisibility(); |
316 } | 342 } |
317 | 343 |
| 344 void ManagePasswordsUIController::ManageAccounts() { |
| 345 DCHECK_EQ(password_manager::ui::AUTO_SIGNIN_STATE, state_); |
| 346 SetState(password_manager::ui::MANAGE_ACCOUNTS_STATE); |
| 347 base::AutoReset<bool> resetter(&should_pop_up_bubble_, true); |
| 348 UpdateBubbleAndIconVisibility(); |
| 349 } |
| 350 |
318 void ManagePasswordsUIController::DidNavigateMainFrame( | 351 void ManagePasswordsUIController::DidNavigateMainFrame( |
319 const content::LoadCommittedDetails& details, | 352 const content::LoadCommittedDetails& details, |
320 const content::FrameNavigateParams& params) { | 353 const content::FrameNavigateParams& params) { |
321 // Don't react to in-page (fragment) navigations. | 354 // Don't react to in-page (fragment) navigations. |
322 if (details.is_in_page) | 355 if (details.is_in_page) |
323 return; | 356 return; |
324 | 357 |
325 // Don't do anything if a navigation occurs before a user could reasonably | 358 // Don't do anything if a navigation occurs before a user could reasonably |
326 // interact with the password bubble. | 359 // interact with the password bubble. |
327 if (Elapsed() < base::TimeDelta::FromSeconds(1)) | 360 if (Elapsed() < base::TimeDelta::FromSeconds(1)) |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 should_pop_up_bubble_ = false; | 419 should_pop_up_bubble_ = false; |
387 } | 420 } |
388 | 421 |
389 void ManagePasswordsUIController::OnBubbleHidden() { | 422 void ManagePasswordsUIController::OnBubbleHidden() { |
390 password_manager::ui::State next_state = state_; | 423 password_manager::ui::State next_state = state_; |
391 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) | 424 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) |
392 next_state = password_manager::ui::INACTIVE_STATE; | 425 next_state = password_manager::ui::INACTIVE_STATE; |
393 else if (state_ == password_manager::ui::CONFIRMATION_STATE) | 426 else if (state_ == password_manager::ui::CONFIRMATION_STATE) |
394 next_state = password_manager::ui::MANAGE_STATE; | 427 next_state = password_manager::ui::MANAGE_STATE; |
395 else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) | 428 else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) |
396 next_state = password_manager::ui::INACTIVE_STATE; | 429 next_state = password_manager::ui::MANAGE_ACCOUNTS_STATE; |
397 | 430 |
398 if (next_state != state_) { | 431 if (next_state != state_) { |
399 SetState(next_state); | 432 SetState(next_state); |
400 UpdateBubbleAndIconVisibility(); | 433 UpdateBubbleAndIconVisibility(); |
401 } | 434 } |
402 } | 435 } |
403 | 436 |
404 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { | 437 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
405 DCHECK(should_pop_up_bubble_); | 438 DCHECK(should_pop_up_bubble_); |
406 #if !defined(OS_ANDROID) | 439 #if !defined(OS_ANDROID) |
(...skipping 24 matching lines...) Expand all Loading... |
431 ScopedVector<autofill::PasswordForm> local_forms, | 464 ScopedVector<autofill::PasswordForm> local_forms, |
432 ScopedVector<autofill::PasswordForm> federated_forms) { | 465 ScopedVector<autofill::PasswordForm> federated_forms) { |
433 form_manager_.reset(); | 466 form_manager_.reset(); |
434 origin_ = GURL(); | 467 origin_ = GURL(); |
435 local_credentials_forms_.swap(local_forms); | 468 local_credentials_forms_.swap(local_forms); |
436 federated_credentials_forms_.swap(federated_forms); | 469 federated_credentials_forms_.swap(federated_forms); |
437 // The map is useless because usernames may overlap. | 470 // The map is useless because usernames may overlap. |
438 password_form_map_.clear(); | 471 password_form_map_.clear(); |
439 new_password_forms_.clear(); | 472 new_password_forms_.clear(); |
440 } | 473 } |
OLD | NEW |