Index: chrome/browser/ui/passwords/manage_passwords_state.cc |
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.cc b/chrome/browser/ui/passwords/manage_passwords_state.cc |
index cbdeb66082b2cff5d0fcf03fa720f4620cbd315a..9e5c73c1a411fd467702940262cf9d8079ac693a 100644 |
--- a/chrome/browser/ui/passwords/manage_passwords_state.cc |
+++ b/chrome/browser/ui/passwords/manage_passwords_state.cc |
@@ -6,6 +6,7 @@ |
#include <utility> |
+#include "base/memory/ptr_util.h" |
#include "components/password_manager/core/browser/browser_save_password_progress_logger.h" |
#include "components/password_manager/core/browser/log_manager.h" |
#include "components/password_manager/core/browser/password_form_manager.h" |
@@ -17,80 +18,49 @@ using autofill::PasswordFormMap; |
namespace { |
-// Returns a vector containing the values of a map. |
-template <typename Map> |
-std::vector<typename Map::mapped_type> MapToVector(const Map& map) { |
- std::vector<typename Map::mapped_type> ret; |
- ret.reserve(map.size()); |
- for (const auto& form_pair : map) |
- ret.push_back(form_pair.second); |
- return ret; |
-} |
- |
-// Takes a ScopedPtrMap. Returns a vector of non-owned pointers to the elements |
-// inside the scoped_ptrs. |
-template <typename Map> |
-std::vector<const typename Map::mapped_type::element_type*> |
-ScopedPtrMapToVector(const Map& map) { |
- std::vector<const typename Map::mapped_type::element_type*> ret; |
- ret.reserve(map.size()); |
- for (const auto& form_pair : map) |
- ret.push_back(form_pair.second.get()); |
- return ret; |
-} |
- |
-void AddRawPtrFromOwningVector( |
- const std::vector<std::unique_ptr<autofill::PasswordForm>>& owning_vector, |
- std::vector<const autofill::PasswordForm*>* destination) { |
- destination->reserve(destination->size() + owning_vector.size()); |
- for (const auto& owning_ptr : owning_vector) { |
- destination->push_back(owning_ptr.get()); |
- } |
-} |
- |
-ScopedVector<const autofill::PasswordForm> DeepCopyMapToVector( |
+std::vector<std::unique_ptr<autofill::PasswordForm>> DeepCopyMapToVector( |
const PasswordFormMap& password_form_map) { |
- ScopedVector<const autofill::PasswordForm> ret; |
+ std::vector<std::unique_ptr<autofill::PasswordForm>> ret; |
ret.reserve(password_form_map.size()); |
for (const auto& form_pair : password_form_map) |
- ret.push_back(new autofill::PasswordForm(*form_pair.second)); |
+ ret.push_back(base::MakeUnique<autofill::PasswordForm>(*form_pair.second)); |
return ret; |
} |
-ScopedVector<const autofill::PasswordForm> ConstifyVector( |
- ScopedVector<autofill::PasswordForm>* forms) { |
- ScopedVector<const autofill::PasswordForm> ret; |
- ret.assign(forms->begin(), forms->end()); |
- forms->weak_clear(); |
- return ret; |
+void AppendDeepCopyVector( |
+ const std::vector<std::unique_ptr<autofill::PasswordForm>>& forms, |
+ std::vector<std::unique_ptr<autofill::PasswordForm>>* result) { |
+ result->reserve(result->size() + forms.size()); |
+ for (const auto& form : forms) |
+ result->push_back(base::MakeUnique<autofill::PasswordForm>(*form)); |
} |
// Updates one form in |forms| that has the same unique key as |updated_form|. |
// Returns true if the form was found and updated. |
-bool UpdateFormInVector(const autofill::PasswordForm& updated_form, |
- ScopedVector<const autofill::PasswordForm>* forms) { |
- ScopedVector<const autofill::PasswordForm>::iterator it = std::find_if( |
+bool UpdateFormInVector( |
+ const autofill::PasswordForm& updated_form, |
+ std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) { |
+ auto it = std::find_if( |
forms->begin(), forms->end(), |
- [&updated_form](const autofill::PasswordForm* form) { |
- return ArePasswordFormUniqueKeyEqual(*form, updated_form); |
- }); |
+ [&updated_form](const std::unique_ptr<autofill::PasswordForm>& form) { |
+ return ArePasswordFormUniqueKeyEqual(*form, updated_form); |
+ }); |
if (it != forms->end()) { |
- delete *it; |
- *it = new autofill::PasswordForm(updated_form); |
+ **it = updated_form; |
return true; |
} |
return false; |
} |
// Removes a form from |forms| that has the same unique key as |form_to_delete|. |
-template <class Vector> |
-void RemoveFormFromVector(const autofill::PasswordForm& form_to_delete, |
- Vector* forms) { |
- typename Vector::iterator it = std::find_if( |
+void RemoveFormFromVector( |
+ const autofill::PasswordForm& form_to_delete, |
+ std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) { |
+ auto it = std::find_if( |
forms->begin(), forms->end(), |
- [&form_to_delete](const autofill::PasswordForm* form) { |
- return ArePasswordFormUniqueKeyEqual(*form, form_to_delete); |
- }); |
+ [&form_to_delete](const std::unique_ptr<autofill::PasswordForm>& form) { |
+ return ArePasswordFormUniqueKeyEqual(*form, form_to_delete); |
+ }); |
if (it != forms->end()) |
forms->erase(it); |
} |
@@ -108,9 +78,9 @@ void ManagePasswordsState::OnPendingPassword( |
std::unique_ptr<password_manager::PasswordFormManager> form_manager) { |
ClearData(); |
form_manager_ = std::move(form_manager); |
- current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); |
- AddRawPtrFromOwningVector(form_manager_->federated_matches(), |
- ¤t_forms_weak_); |
+ local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches()); |
+ AppendDeepCopyVector(form_manager_->federated_matches(), |
+ &local_credentials_forms_); |
origin_ = form_manager_->observed_form().origin; |
SetState(password_manager::ui::PENDING_PASSWORD_STATE); |
} |
@@ -119,29 +89,30 @@ void ManagePasswordsState::OnUpdatePassword( |
std::unique_ptr<password_manager::PasswordFormManager> form_manager) { |
ClearData(); |
form_manager_ = std::move(form_manager); |
- current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); |
- AddRawPtrFromOwningVector(form_manager_->federated_matches(), |
- ¤t_forms_weak_); |
+ local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches()); |
+ AppendDeepCopyVector(form_manager_->federated_matches(), |
+ &local_credentials_forms_); |
origin_ = form_manager_->observed_form().origin; |
SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); |
} |
void ManagePasswordsState::OnRequestCredentials( |
- ScopedVector<autofill::PasswordForm> local_credentials, |
- ScopedVector<autofill::PasswordForm> federated_credentials, |
+ std::vector<std::unique_ptr<autofill::PasswordForm>> local_credentials, |
+ std::vector<std::unique_ptr<autofill::PasswordForm>> federation_providers, |
const GURL& origin) { |
ClearData(); |
- local_credentials_forms_ = ConstifyVector(&local_credentials); |
- federated_credentials_forms_ = ConstifyVector(&federated_credentials); |
+ local_credentials_forms_ = std::move(local_credentials); |
+ federation_providers_forms_ = std::move(federation_providers); |
origin_ = origin; |
SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE); |
} |
void ManagePasswordsState::OnAutoSignin( |
- ScopedVector<autofill::PasswordForm> local_forms, const GURL& origin) { |
+ std::vector<std::unique_ptr<autofill::PasswordForm>> local_forms, |
+ const GURL& origin) { |
DCHECK(!local_forms.empty()); |
ClearData(); |
- local_credentials_forms_ = ConstifyVector(&local_forms); |
+ local_credentials_forms_ = std::move(local_forms); |
origin_ = origin; |
SetState(password_manager::ui::AUTO_SIGNIN_STATE); |
} |
@@ -150,15 +121,25 @@ void ManagePasswordsState::OnAutomaticPasswordSave( |
std::unique_ptr<PasswordFormManager> form_manager) { |
ClearData(); |
form_manager_ = std::move(form_manager); |
- autofill::ConstPasswordFormMap current_forms; |
- for (const auto& match : form_manager_->best_matches()) { |
- current_forms.insert(std::make_pair(match.first, match.second.get())); |
+ local_credentials_forms_.reserve(form_manager_->best_matches().size()); |
+ bool updated = false; |
+ for (const auto& form : form_manager_->best_matches()) { |
+ if (form_manager_->pending_credentials().username_value == form.first) { |
+ local_credentials_forms_.push_back( |
+ base::MakeUnique<autofill::PasswordForm>( |
+ form_manager_->pending_credentials())); |
+ updated = true; |
+ } else { |
+ local_credentials_forms_.push_back( |
+ base::MakeUnique<autofill::PasswordForm>(*form.second)); |
+ } |
+ } |
+ if (!updated) { |
+ local_credentials_forms_.push_back(base::MakeUnique<autofill::PasswordForm>( |
+ form_manager_->pending_credentials())); |
} |
- current_forms[form_manager_->pending_credentials().username_value] = |
- &form_manager_->pending_credentials(); |
- current_forms_weak_ = MapToVector(current_forms); |
- AddRawPtrFromOwningVector(form_manager_->federated_matches(), |
- ¤t_forms_weak_); |
+ AppendDeepCopyVector(form_manager_->federated_matches(), |
+ &local_credentials_forms_); |
origin_ = form_manager_->observed_form().origin; |
SetState(password_manager::ui::CONFIRMATION_STATE); |
} |
@@ -171,11 +152,10 @@ void ManagePasswordsState::OnPasswordAutofilled( |
DCHECK(!password_form_map.empty()); |
ClearData(); |
bool only_PSL_matches = |
- find_if(password_form_map.begin(), password_form_map.end(), |
- [](const std::pair<const base::string16, |
- std::unique_ptr<autofill::PasswordForm>>& p) { |
- return !p.second->is_public_suffix_match; |
- }) == password_form_map.end(); |
+ std::all_of(password_form_map.begin(), password_form_map.end(), |
+ [](const PasswordFormMap::value_type& p) { |
+ return p.second->is_public_suffix_match; |
+ }); |
if (only_PSL_matches) { |
// Don't show the UI for PSL matched passwords. They are not stored for this |
// page and cannot be deleted. |
@@ -183,14 +163,8 @@ void ManagePasswordsState::OnPasswordAutofilled( |
SetState(password_manager::ui::INACTIVE_STATE); |
} else { |
local_credentials_forms_ = DeepCopyMapToVector(password_form_map); |
- if (federated_matches) { |
- local_credentials_forms_.reserve(local_credentials_forms_.size() + |
- federated_matches->size()); |
- for (const auto& owned_form : *federated_matches) { |
- local_credentials_forms_.push_back( |
- new autofill::PasswordForm(*owned_form)); |
- } |
- } |
+ if (federated_matches) |
+ AppendDeepCopyVector(*federated_matches, &local_credentials_forms_); |
origin_ = origin; |
SetState(password_manager::ui::MANAGE_STATE); |
} |
@@ -211,7 +185,7 @@ void ManagePasswordsState::TransitionToState( |
credentials_callback_.Run(nullptr); |
credentials_callback_.Reset(); |
} |
- federated_credentials_forms_.clear(); |
+ federation_providers_forms_.clear(); |
} |
SetState(state); |
} |
@@ -247,9 +221,8 @@ void ManagePasswordsState::ChooseCredential( |
void ManagePasswordsState::ClearData() { |
form_manager_.reset(); |
- current_forms_weak_.clear(); |
local_credentials_forms_.clear(); |
- federated_credentials_forms_.clear(); |
+ federation_providers_forms_.clear(); |
credentials_callback_.Reset(); |
} |
@@ -258,41 +231,19 @@ void ManagePasswordsState::AddForm(const autofill::PasswordForm& form) { |
return; |
if (UpdateForm(form)) |
return; |
- if (form_manager_) { |
- local_credentials_forms_.push_back(new autofill::PasswordForm(form)); |
- current_forms_weak_.push_back(local_credentials_forms_.back()); |
- } else { |
- local_credentials_forms_.push_back(new autofill::PasswordForm(form)); |
- } |
+ local_credentials_forms_.push_back( |
+ base::MakeUnique<autofill::PasswordForm>(form)); |
} |
bool ManagePasswordsState::UpdateForm(const autofill::PasswordForm& form) { |
- if (form_manager_) { |
- // |current_forms_weak_| contains the list of current passwords. |
- std::vector<const autofill::PasswordForm*>::iterator it = std::find_if( |
- current_forms_weak_.begin(), current_forms_weak_.end(), |
- [&form](const autofill::PasswordForm* current_form) { |
- return ArePasswordFormUniqueKeyEqual(form, *current_form); |
- }); |
- if (it != current_forms_weak_.end()) { |
- RemoveFormFromVector(form, &local_credentials_forms_); |
- local_credentials_forms_.push_back(new autofill::PasswordForm(form)); |
- *it = local_credentials_forms_.back(); |
- return true; |
- } |
- } else { |
- // |current_forms_weak_| isn't used. |
- bool updated_locals = UpdateFormInVector(form, &local_credentials_forms_); |
- return (UpdateFormInVector(form, &federated_credentials_forms_) || |
- updated_locals); |
- } |
- return false; |
+ bool updated_locals = UpdateFormInVector(form, &local_credentials_forms_); |
+ return (UpdateFormInVector(form, &federation_providers_forms_) || |
+ updated_locals); |
} |
void ManagePasswordsState::DeleteForm(const autofill::PasswordForm& form) { |
- RemoveFormFromVector(form, ¤t_forms_weak_); |
RemoveFormFromVector(form, &local_credentials_forms_); |
- RemoveFormFromVector(form, &federated_credentials_forms_); |
+ RemoveFormFromVector(form, &federation_providers_forms_); |
} |
void ManagePasswordsState::SetState(password_manager::ui::State state) { |