Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: chrome/browser/ui/passwords/manage_passwords_state.cc

Issue 2253233005: Change ScopedVector to vector<unique_ptr> in the password's UI code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mac Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_state.h" 5 #include "chrome/browser/ui/passwords/manage_passwords_state.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/memory/ptr_util.h"
9 #include "components/password_manager/core/browser/browser_save_password_progres s_logger.h" 10 #include "components/password_manager/core/browser/browser_save_password_progres s_logger.h"
10 #include "components/password_manager/core/browser/log_manager.h" 11 #include "components/password_manager/core/browser/log_manager.h"
11 #include "components/password_manager/core/browser/password_form_manager.h" 12 #include "components/password_manager/core/browser/password_form_manager.h"
12 #include "components/password_manager/core/browser/password_manager.h" 13 #include "components/password_manager/core/browser/password_manager.h"
13 #include "components/password_manager/core/browser/password_manager_client.h" 14 #include "components/password_manager/core/browser/password_manager_client.h"
14 15
15 using password_manager::PasswordFormManager; 16 using password_manager::PasswordFormManager;
16 using autofill::PasswordFormMap; 17 using autofill::PasswordFormMap;
17 18
18 namespace { 19 namespace {
19 20
20 // Returns a vector containing the values of a map. 21 std::vector<std::unique_ptr<autofill::PasswordForm>> DeepCopyMapToVector(
21 template <typename Map> 22 const PasswordFormMap& password_form_map) {
22 std::vector<typename Map::mapped_type> MapToVector(const Map& map) { 23 std::vector<std::unique_ptr<autofill::PasswordForm>> ret;
23 std::vector<typename Map::mapped_type> ret; 24 ret.reserve(password_form_map.size());
24 ret.reserve(map.size()); 25 for (const auto& form_pair : password_form_map) {
25 for (const auto& form_pair : map) 26 ret.push_back(
26 ret.push_back(form_pair.second); 27 base::WrapUnique(new autofill::PasswordForm(*form_pair.second)));
vabr (Chromium) 2016/08/18 18:39:19 nit: base::MakeUnique again, or the emplace_back y
vasilii 2016/08/19 09:52:30 Done.
28 }
27 return ret; 29 return ret;
28 } 30 }
29 31
30 // Takes a ScopedPtrMap. Returns a vector of non-owned pointers to the elements 32 void AppendDeepCopyVector(
31 // inside the scoped_ptrs. 33 const std::vector<std::unique_ptr<autofill::PasswordForm>>& forms,
32 template <typename Map> 34 std::vector<std::unique_ptr<autofill::PasswordForm>>* result) {
33 std::vector<const typename Map::mapped_type::element_type*> 35 result->reserve(result->size() + forms.size());
34 ScopedPtrMapToVector(const Map& map) { 36 for (const auto& form : forms)
35 std::vector<const typename Map::mapped_type::element_type*> ret; 37 result->push_back(base::WrapUnique(new autofill::PasswordForm(*form)));
36 ret.reserve(map.size());
37 for (const auto& form_pair : map)
38 ret.push_back(form_pair.second.get());
39 return ret;
40 }
41
42 void AddRawPtrFromOwningVector(
43 const std::vector<std::unique_ptr<autofill::PasswordForm>>& owning_vector,
44 std::vector<const autofill::PasswordForm*>* destination) {
45 destination->reserve(destination->size() + owning_vector.size());
46 for (const auto& owning_ptr : owning_vector) {
47 destination->push_back(owning_ptr.get());
48 }
49 }
50
51 ScopedVector<const autofill::PasswordForm> DeepCopyMapToVector(
52 const PasswordFormMap& password_form_map) {
53 ScopedVector<const autofill::PasswordForm> ret;
54 ret.reserve(password_form_map.size());
55 for (const auto& form_pair : password_form_map)
56 ret.push_back(new autofill::PasswordForm(*form_pair.second));
57 return ret;
58 }
59
60 ScopedVector<const autofill::PasswordForm> ConstifyVector(
61 ScopedVector<autofill::PasswordForm>* forms) {
62 ScopedVector<const autofill::PasswordForm> ret;
63 ret.assign(forms->begin(), forms->end());
64 forms->weak_clear();
65 return ret;
66 } 38 }
67 39
68 // Updates one form in |forms| that has the same unique key as |updated_form|. 40 // Updates one form in |forms| that has the same unique key as |updated_form|.
69 // Returns true if the form was found and updated. 41 // Returns true if the form was found and updated.
70 bool UpdateFormInVector(const autofill::PasswordForm& updated_form, 42 bool UpdateFormInVector(
71 ScopedVector<const autofill::PasswordForm>* forms) { 43 const autofill::PasswordForm& updated_form,
72 ScopedVector<const autofill::PasswordForm>::iterator it = std::find_if( 44 std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) {
45 auto it = std::find_if(
73 forms->begin(), forms->end(), 46 forms->begin(), forms->end(),
74 [&updated_form](const autofill::PasswordForm* form) { 47 [&updated_form](const std::unique_ptr<autofill::PasswordForm>& form) {
75 return ArePasswordFormUniqueKeyEqual(*form, updated_form); 48 return ArePasswordFormUniqueKeyEqual(*form, updated_form);
76 }); 49 });
77 if (it != forms->end()) { 50 if (it != forms->end()) {
78 delete *it; 51 **it = updated_form;
79 *it = new autofill::PasswordForm(updated_form);
80 return true; 52 return true;
81 } 53 }
82 return false; 54 return false;
83 } 55 }
84 56
85 // Removes a form from |forms| that has the same unique key as |form_to_delete|. 57 // Removes a form from |forms| that has the same unique key as |form_to_delete|.
86 template <class Vector> 58 void RemoveFormFromVector(
87 void RemoveFormFromVector(const autofill::PasswordForm& form_to_delete, 59 const autofill::PasswordForm& form_to_delete,
88 Vector* forms) { 60 std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) {
89 typename Vector::iterator it = std::find_if( 61 auto it = std::find_if(
90 forms->begin(), forms->end(), 62 forms->begin(), forms->end(),
91 [&form_to_delete](const autofill::PasswordForm* form) { 63 [&form_to_delete](const std::unique_ptr<autofill::PasswordForm>& form) {
92 return ArePasswordFormUniqueKeyEqual(*form, form_to_delete); 64 return ArePasswordFormUniqueKeyEqual(*form, form_to_delete);
93 }); 65 });
94 if (it != forms->end()) 66 if (it != forms->end())
95 forms->erase(it); 67 forms->erase(it);
96 } 68 }
97 69
98 } // namespace 70 } // namespace
99 71
100 ManagePasswordsState::ManagePasswordsState() 72 ManagePasswordsState::ManagePasswordsState()
101 : state_(password_manager::ui::INACTIVE_STATE), 73 : state_(password_manager::ui::INACTIVE_STATE),
102 client_(nullptr) { 74 client_(nullptr) {
103 } 75 }
104 76
105 ManagePasswordsState::~ManagePasswordsState() {} 77 ManagePasswordsState::~ManagePasswordsState() {}
106 78
107 void ManagePasswordsState::OnPendingPassword( 79 void ManagePasswordsState::OnPendingPassword(
108 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { 80 std::unique_ptr<password_manager::PasswordFormManager> form_manager) {
109 ClearData(); 81 ClearData();
110 form_manager_ = std::move(form_manager); 82 form_manager_ = std::move(form_manager);
111 current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); 83 local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches());
112 AddRawPtrFromOwningVector(form_manager_->federated_matches(), 84 AppendDeepCopyVector(form_manager_->federated_matches(),
113 &current_forms_weak_); 85 &local_credentials_forms_);
114 origin_ = form_manager_->observed_form().origin; 86 origin_ = form_manager_->observed_form().origin;
115 SetState(password_manager::ui::PENDING_PASSWORD_STATE); 87 SetState(password_manager::ui::PENDING_PASSWORD_STATE);
116 } 88 }
117 89
118 void ManagePasswordsState::OnUpdatePassword( 90 void ManagePasswordsState::OnUpdatePassword(
119 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { 91 std::unique_ptr<password_manager::PasswordFormManager> form_manager) {
120 ClearData(); 92 ClearData();
121 form_manager_ = std::move(form_manager); 93 form_manager_ = std::move(form_manager);
122 current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); 94 local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches());
123 AddRawPtrFromOwningVector(form_manager_->federated_matches(), 95 AppendDeepCopyVector(form_manager_->federated_matches(),
124 &current_forms_weak_); 96 &local_credentials_forms_);
125 origin_ = form_manager_->observed_form().origin; 97 origin_ = form_manager_->observed_form().origin;
126 SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); 98 SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE);
127 } 99 }
128 100
129 void ManagePasswordsState::OnRequestCredentials( 101 void ManagePasswordsState::OnRequestCredentials(
130 ScopedVector<autofill::PasswordForm> local_credentials, 102 std::vector<std::unique_ptr<autofill::PasswordForm>> local_credentials,
131 ScopedVector<autofill::PasswordForm> federated_credentials, 103 std::vector<std::unique_ptr<autofill::PasswordForm>> federation_providers,
132 const GURL& origin) { 104 const GURL& origin) {
133 ClearData(); 105 ClearData();
134 local_credentials_forms_ = ConstifyVector(&local_credentials); 106 local_credentials_forms_ = std::move(local_credentials);
135 federated_credentials_forms_ = ConstifyVector(&federated_credentials); 107 federation_providers_forms_ = std::move(federation_providers);
136 origin_ = origin; 108 origin_ = origin;
137 SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE); 109 SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE);
138 } 110 }
139 111
140 void ManagePasswordsState::OnAutoSignin( 112 void ManagePasswordsState::OnAutoSignin(
141 ScopedVector<autofill::PasswordForm> local_forms, const GURL& origin) { 113 std::vector<std::unique_ptr<autofill::PasswordForm>> local_forms,
114 const GURL& origin) {
142 DCHECK(!local_forms.empty()); 115 DCHECK(!local_forms.empty());
143 ClearData(); 116 ClearData();
144 local_credentials_forms_ = ConstifyVector(&local_forms); 117 local_credentials_forms_ = std::move(local_forms);
145 origin_ = origin; 118 origin_ = origin;
146 SetState(password_manager::ui::AUTO_SIGNIN_STATE); 119 SetState(password_manager::ui::AUTO_SIGNIN_STATE);
147 } 120 }
148 121
149 void ManagePasswordsState::OnAutomaticPasswordSave( 122 void ManagePasswordsState::OnAutomaticPasswordSave(
150 std::unique_ptr<PasswordFormManager> form_manager) { 123 std::unique_ptr<PasswordFormManager> form_manager) {
151 ClearData(); 124 ClearData();
152 form_manager_ = std::move(form_manager); 125 form_manager_ = std::move(form_manager);
153 autofill::ConstPasswordFormMap current_forms; 126 local_credentials_forms_.reserve(form_manager_->best_matches().size());
154 for (const auto& match : form_manager_->best_matches()) { 127 bool updated = false;
155 current_forms.insert(std::make_pair(match.first, match.second.get())); 128 for (const auto& form : form_manager_->best_matches()) {
129 if (form_manager_->pending_credentials().username_value == form.first) {
130 local_credentials_forms_.push_back(base::WrapUnique(
131 new autofill::PasswordForm(form_manager_->pending_credentials())));
132 updated = true;
133 } else {
134 local_credentials_forms_.push_back(
135 base::WrapUnique(new autofill::PasswordForm(*form.second)));
136 }
156 } 137 }
157 current_forms[form_manager_->pending_credentials().username_value] = 138 if (!updated) {
158 &form_manager_->pending_credentials(); 139 local_credentials_forms_.push_back(base::WrapUnique(
159 current_forms_weak_ = MapToVector(current_forms); 140 new autofill::PasswordForm(form_manager_->pending_credentials())));
160 AddRawPtrFromOwningVector(form_manager_->federated_matches(), 141 }
161 &current_forms_weak_); 142 AppendDeepCopyVector(form_manager_->federated_matches(),
143 &local_credentials_forms_);
162 origin_ = form_manager_->observed_form().origin; 144 origin_ = form_manager_->observed_form().origin;
163 SetState(password_manager::ui::CONFIRMATION_STATE); 145 SetState(password_manager::ui::CONFIRMATION_STATE);
164 } 146 }
165 147
166 void ManagePasswordsState::OnPasswordAutofilled( 148 void ManagePasswordsState::OnPasswordAutofilled(
167 const PasswordFormMap& password_form_map, 149 const PasswordFormMap& password_form_map,
168 const GURL& origin, 150 const GURL& origin,
169 const std::vector<std::unique_ptr<autofill::PasswordForm>>* 151 const std::vector<std::unique_ptr<autofill::PasswordForm>>*
170 federated_matches) { 152 federated_matches) {
171 DCHECK(!password_form_map.empty()); 153 DCHECK(!password_form_map.empty());
172 ClearData(); 154 ClearData();
173 bool only_PSL_matches = 155 bool only_PSL_matches =
174 find_if(password_form_map.begin(), password_form_map.end(), 156 std::all_of(password_form_map.begin(), password_form_map.end(),
175 [](const std::pair<const base::string16, 157 [](const PasswordFormMap::value_type& p) {
176 std::unique_ptr<autofill::PasswordForm>>& p) { 158 return p.second->is_public_suffix_match;
177 return !p.second->is_public_suffix_match; 159 });
178 }) == password_form_map.end();
179 if (only_PSL_matches) { 160 if (only_PSL_matches) {
180 // Don't show the UI for PSL matched passwords. They are not stored for this 161 // Don't show the UI for PSL matched passwords. They are not stored for this
181 // page and cannot be deleted. 162 // page and cannot be deleted.
182 origin_ = GURL(); 163 origin_ = GURL();
183 SetState(password_manager::ui::INACTIVE_STATE); 164 SetState(password_manager::ui::INACTIVE_STATE);
184 } else { 165 } else {
185 local_credentials_forms_ = DeepCopyMapToVector(password_form_map); 166 local_credentials_forms_ = DeepCopyMapToVector(password_form_map);
186 if (federated_matches) { 167 if (federated_matches)
187 local_credentials_forms_.reserve(local_credentials_forms_.size() + 168 AppendDeepCopyVector(*federated_matches, &local_credentials_forms_);
188 federated_matches->size());
189 for (const auto& owned_form : *federated_matches) {
190 local_credentials_forms_.push_back(
191 new autofill::PasswordForm(*owned_form));
192 }
193 }
194 origin_ = origin; 169 origin_ = origin;
195 SetState(password_manager::ui::MANAGE_STATE); 170 SetState(password_manager::ui::MANAGE_STATE);
196 } 171 }
197 } 172 }
198 173
199 void ManagePasswordsState::OnInactive() { 174 void ManagePasswordsState::OnInactive() {
200 ClearData(); 175 ClearData();
201 origin_ = GURL(); 176 origin_ = GURL();
202 SetState(password_manager::ui::INACTIVE_STATE); 177 SetState(password_manager::ui::INACTIVE_STATE);
203 } 178 }
204 179
205 void ManagePasswordsState::TransitionToState( 180 void ManagePasswordsState::TransitionToState(
206 password_manager::ui::State state) { 181 password_manager::ui::State state) {
207 DCHECK_NE(password_manager::ui::INACTIVE_STATE, state_); 182 DCHECK_NE(password_manager::ui::INACTIVE_STATE, state_);
208 DCHECK_EQ(password_manager::ui::MANAGE_STATE, state); 183 DCHECK_EQ(password_manager::ui::MANAGE_STATE, state);
209 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { 184 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) {
210 if (!credentials_callback_.is_null()) { 185 if (!credentials_callback_.is_null()) {
211 credentials_callback_.Run(nullptr); 186 credentials_callback_.Run(nullptr);
212 credentials_callback_.Reset(); 187 credentials_callback_.Reset();
213 } 188 }
214 federated_credentials_forms_.clear(); 189 federation_providers_forms_.clear();
215 } 190 }
216 SetState(state); 191 SetState(state);
217 } 192 }
218 193
219 void ManagePasswordsState::ProcessLoginsChanged( 194 void ManagePasswordsState::ProcessLoginsChanged(
220 const password_manager::PasswordStoreChangeList& changes) { 195 const password_manager::PasswordStoreChangeList& changes) {
221 if (state() == password_manager::ui::INACTIVE_STATE) 196 if (state() == password_manager::ui::INACTIVE_STATE)
222 return; 197 return;
223 198
224 for (const password_manager::PasswordStoreChange& change : changes) { 199 for (const password_manager::PasswordStoreChange& change : changes) {
(...skipping 15 matching lines...) Expand all
240 const autofill::PasswordForm* form) { 215 const autofill::PasswordForm* form) {
241 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state()); 216 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state());
242 DCHECK(!credentials_callback().is_null()); 217 DCHECK(!credentials_callback().is_null());
243 218
244 credentials_callback().Run(form); 219 credentials_callback().Run(form);
245 set_credentials_callback(ManagePasswordsState::CredentialsCallback()); 220 set_credentials_callback(ManagePasswordsState::CredentialsCallback());
246 } 221 }
247 222
248 void ManagePasswordsState::ClearData() { 223 void ManagePasswordsState::ClearData() {
249 form_manager_.reset(); 224 form_manager_.reset();
250 current_forms_weak_.clear();
251 local_credentials_forms_.clear(); 225 local_credentials_forms_.clear();
252 federated_credentials_forms_.clear(); 226 federation_providers_forms_.clear();
253 credentials_callback_.Reset(); 227 credentials_callback_.Reset();
254 } 228 }
255 229
256 void ManagePasswordsState::AddForm(const autofill::PasswordForm& form) { 230 void ManagePasswordsState::AddForm(const autofill::PasswordForm& form) {
257 if (form.origin != origin_) 231 if (form.origin != origin_)
258 return; 232 return;
259 if (UpdateForm(form)) 233 if (UpdateForm(form))
260 return; 234 return;
261 if (form_manager_) { 235 local_credentials_forms_.push_back(
262 local_credentials_forms_.push_back(new autofill::PasswordForm(form)); 236 base::WrapUnique(new autofill::PasswordForm(form)));
263 current_forms_weak_.push_back(local_credentials_forms_.back());
264 } else {
265 local_credentials_forms_.push_back(new autofill::PasswordForm(form));
266 }
267 } 237 }
268 238
269 bool ManagePasswordsState::UpdateForm(const autofill::PasswordForm& form) { 239 bool ManagePasswordsState::UpdateForm(const autofill::PasswordForm& form) {
270 if (form_manager_) { 240 bool updated_locals = UpdateFormInVector(form, &local_credentials_forms_);
271 // |current_forms_weak_| contains the list of current passwords. 241 return (UpdateFormInVector(form, &federation_providers_forms_) ||
272 std::vector<const autofill::PasswordForm*>::iterator it = std::find_if( 242 updated_locals);
273 current_forms_weak_.begin(), current_forms_weak_.end(),
274 [&form](const autofill::PasswordForm* current_form) {
275 return ArePasswordFormUniqueKeyEqual(form, *current_form);
276 });
277 if (it != current_forms_weak_.end()) {
278 RemoveFormFromVector(form, &local_credentials_forms_);
279 local_credentials_forms_.push_back(new autofill::PasswordForm(form));
280 *it = local_credentials_forms_.back();
281 return true;
282 }
283 } else {
284 // |current_forms_weak_| isn't used.
285 bool updated_locals = UpdateFormInVector(form, &local_credentials_forms_);
286 return (UpdateFormInVector(form, &federated_credentials_forms_) ||
287 updated_locals);
288 }
289 return false;
290 } 243 }
291 244
292 void ManagePasswordsState::DeleteForm(const autofill::PasswordForm& form) { 245 void ManagePasswordsState::DeleteForm(const autofill::PasswordForm& form) {
293 RemoveFormFromVector(form, &current_forms_weak_);
294 RemoveFormFromVector(form, &local_credentials_forms_); 246 RemoveFormFromVector(form, &local_credentials_forms_);
295 RemoveFormFromVector(form, &federated_credentials_forms_); 247 RemoveFormFromVector(form, &federation_providers_forms_);
296 } 248 }
297 249
298 void ManagePasswordsState::SetState(password_manager::ui::State state) { 250 void ManagePasswordsState::SetState(password_manager::ui::State state) {
299 DCHECK(client_); 251 DCHECK(client_);
300 if (client_->GetLogManager()->IsLoggingActive()) { 252 if (client_->GetLogManager()->IsLoggingActive()) {
301 password_manager::BrowserSavePasswordProgressLogger logger( 253 password_manager::BrowserSavePasswordProgressLogger logger(
302 client_->GetLogManager()); 254 client_->GetLogManager());
303 logger.LogNumber( 255 logger.LogNumber(
304 autofill::SavePasswordProgressLogger::STRING_NEW_UI_STATE, 256 autofill::SavePasswordProgressLogger::STRING_NEW_UI_STATE,
305 state); 257 state);
306 } 258 }
307 state_ = state; 259 state_ = state;
308 } 260 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698