OLD | NEW |
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(base::MakeUnique<autofill::PasswordForm>(*form_pair.second)); |
26 ret.push_back(form_pair.second); | |
27 return ret; | 27 return ret; |
28 } | 28 } |
29 | 29 |
30 // Takes a ScopedPtrMap. Returns a vector of non-owned pointers to the elements | 30 void AppendDeepCopyVector( |
31 // inside the scoped_ptrs. | 31 const std::vector<std::unique_ptr<autofill::PasswordForm>>& forms, |
32 template <typename Map> | 32 std::vector<std::unique_ptr<autofill::PasswordForm>>* result) { |
33 std::vector<const typename Map::mapped_type::element_type*> | 33 result->reserve(result->size() + forms.size()); |
34 ScopedPtrMapToVector(const Map& map) { | 34 for (const auto& form : forms) |
35 std::vector<const typename Map::mapped_type::element_type*> ret; | 35 result->push_back(base::MakeUnique<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 } | 36 } |
67 | 37 |
68 // Updates one form in |forms| that has the same unique key as |updated_form|. | 38 // Updates one form in |forms| that has the same unique key as |updated_form|. |
69 // Returns true if the form was found and updated. | 39 // Returns true if the form was found and updated. |
70 bool UpdateFormInVector(const autofill::PasswordForm& updated_form, | 40 bool UpdateFormInVector( |
71 ScopedVector<const autofill::PasswordForm>* forms) { | 41 const autofill::PasswordForm& updated_form, |
72 ScopedVector<const autofill::PasswordForm>::iterator it = std::find_if( | 42 std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) { |
| 43 auto it = std::find_if( |
73 forms->begin(), forms->end(), | 44 forms->begin(), forms->end(), |
74 [&updated_form](const autofill::PasswordForm* form) { | 45 [&updated_form](const std::unique_ptr<autofill::PasswordForm>& form) { |
75 return ArePasswordFormUniqueKeyEqual(*form, updated_form); | 46 return ArePasswordFormUniqueKeyEqual(*form, updated_form); |
76 }); | 47 }); |
77 if (it != forms->end()) { | 48 if (it != forms->end()) { |
78 delete *it; | 49 **it = updated_form; |
79 *it = new autofill::PasswordForm(updated_form); | |
80 return true; | 50 return true; |
81 } | 51 } |
82 return false; | 52 return false; |
83 } | 53 } |
84 | 54 |
85 // Removes a form from |forms| that has the same unique key as |form_to_delete|. | 55 // Removes a form from |forms| that has the same unique key as |form_to_delete|. |
86 template <class Vector> | 56 void RemoveFormFromVector( |
87 void RemoveFormFromVector(const autofill::PasswordForm& form_to_delete, | 57 const autofill::PasswordForm& form_to_delete, |
88 Vector* forms) { | 58 std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) { |
89 typename Vector::iterator it = std::find_if( | 59 auto it = std::find_if( |
90 forms->begin(), forms->end(), | 60 forms->begin(), forms->end(), |
91 [&form_to_delete](const autofill::PasswordForm* form) { | 61 [&form_to_delete](const std::unique_ptr<autofill::PasswordForm>& form) { |
92 return ArePasswordFormUniqueKeyEqual(*form, form_to_delete); | 62 return ArePasswordFormUniqueKeyEqual(*form, form_to_delete); |
93 }); | 63 }); |
94 if (it != forms->end()) | 64 if (it != forms->end()) |
95 forms->erase(it); | 65 forms->erase(it); |
96 } | 66 } |
97 | 67 |
98 } // namespace | 68 } // namespace |
99 | 69 |
100 ManagePasswordsState::ManagePasswordsState() | 70 ManagePasswordsState::ManagePasswordsState() |
101 : state_(password_manager::ui::INACTIVE_STATE), | 71 : state_(password_manager::ui::INACTIVE_STATE), |
102 client_(nullptr) { | 72 client_(nullptr) { |
103 } | 73 } |
104 | 74 |
105 ManagePasswordsState::~ManagePasswordsState() {} | 75 ManagePasswordsState::~ManagePasswordsState() {} |
106 | 76 |
107 void ManagePasswordsState::OnPendingPassword( | 77 void ManagePasswordsState::OnPendingPassword( |
108 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { | 78 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { |
109 ClearData(); | 79 ClearData(); |
110 form_manager_ = std::move(form_manager); | 80 form_manager_ = std::move(form_manager); |
111 current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); | 81 local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches()); |
112 AddRawPtrFromOwningVector(form_manager_->federated_matches(), | 82 AppendDeepCopyVector(form_manager_->federated_matches(), |
113 ¤t_forms_weak_); | 83 &local_credentials_forms_); |
114 origin_ = form_manager_->observed_form().origin; | 84 origin_ = form_manager_->observed_form().origin; |
115 SetState(password_manager::ui::PENDING_PASSWORD_STATE); | 85 SetState(password_manager::ui::PENDING_PASSWORD_STATE); |
116 } | 86 } |
117 | 87 |
118 void ManagePasswordsState::OnUpdatePassword( | 88 void ManagePasswordsState::OnUpdatePassword( |
119 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { | 89 std::unique_ptr<password_manager::PasswordFormManager> form_manager) { |
120 ClearData(); | 90 ClearData(); |
121 form_manager_ = std::move(form_manager); | 91 form_manager_ = std::move(form_manager); |
122 current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); | 92 local_credentials_forms_ = DeepCopyMapToVector(form_manager_->best_matches()); |
123 AddRawPtrFromOwningVector(form_manager_->federated_matches(), | 93 AppendDeepCopyVector(form_manager_->federated_matches(), |
124 ¤t_forms_weak_); | 94 &local_credentials_forms_); |
125 origin_ = form_manager_->observed_form().origin; | 95 origin_ = form_manager_->observed_form().origin; |
126 SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); | 96 SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); |
127 } | 97 } |
128 | 98 |
129 void ManagePasswordsState::OnRequestCredentials( | 99 void ManagePasswordsState::OnRequestCredentials( |
130 ScopedVector<autofill::PasswordForm> local_credentials, | 100 std::vector<std::unique_ptr<autofill::PasswordForm>> local_credentials, |
131 ScopedVector<autofill::PasswordForm> federated_credentials, | 101 std::vector<std::unique_ptr<autofill::PasswordForm>> federation_providers, |
132 const GURL& origin) { | 102 const GURL& origin) { |
133 ClearData(); | 103 ClearData(); |
134 local_credentials_forms_ = ConstifyVector(&local_credentials); | 104 local_credentials_forms_ = std::move(local_credentials); |
135 federated_credentials_forms_ = ConstifyVector(&federated_credentials); | 105 federation_providers_forms_ = std::move(federation_providers); |
136 origin_ = origin; | 106 origin_ = origin; |
137 SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE); | 107 SetState(password_manager::ui::CREDENTIAL_REQUEST_STATE); |
138 } | 108 } |
139 | 109 |
140 void ManagePasswordsState::OnAutoSignin( | 110 void ManagePasswordsState::OnAutoSignin( |
141 ScopedVector<autofill::PasswordForm> local_forms, const GURL& origin) { | 111 std::vector<std::unique_ptr<autofill::PasswordForm>> local_forms, |
| 112 const GURL& origin) { |
142 DCHECK(!local_forms.empty()); | 113 DCHECK(!local_forms.empty()); |
143 ClearData(); | 114 ClearData(); |
144 local_credentials_forms_ = ConstifyVector(&local_forms); | 115 local_credentials_forms_ = std::move(local_forms); |
145 origin_ = origin; | 116 origin_ = origin; |
146 SetState(password_manager::ui::AUTO_SIGNIN_STATE); | 117 SetState(password_manager::ui::AUTO_SIGNIN_STATE); |
147 } | 118 } |
148 | 119 |
149 void ManagePasswordsState::OnAutomaticPasswordSave( | 120 void ManagePasswordsState::OnAutomaticPasswordSave( |
150 std::unique_ptr<PasswordFormManager> form_manager) { | 121 std::unique_ptr<PasswordFormManager> form_manager) { |
151 ClearData(); | 122 ClearData(); |
152 form_manager_ = std::move(form_manager); | 123 form_manager_ = std::move(form_manager); |
153 autofill::ConstPasswordFormMap current_forms; | 124 local_credentials_forms_.reserve(form_manager_->best_matches().size()); |
154 for (const auto& match : form_manager_->best_matches()) { | 125 bool updated = false; |
155 current_forms.insert(std::make_pair(match.first, match.second.get())); | 126 for (const auto& form : form_manager_->best_matches()) { |
| 127 if (form_manager_->pending_credentials().username_value == form.first) { |
| 128 local_credentials_forms_.push_back( |
| 129 base::MakeUnique<autofill::PasswordForm>( |
| 130 form_manager_->pending_credentials())); |
| 131 updated = true; |
| 132 } else { |
| 133 local_credentials_forms_.push_back( |
| 134 base::MakeUnique<autofill::PasswordForm>(*form.second)); |
| 135 } |
156 } | 136 } |
157 current_forms[form_manager_->pending_credentials().username_value] = | 137 if (!updated) { |
158 &form_manager_->pending_credentials(); | 138 local_credentials_forms_.push_back(base::MakeUnique<autofill::PasswordForm>( |
159 current_forms_weak_ = MapToVector(current_forms); | 139 form_manager_->pending_credentials())); |
160 AddRawPtrFromOwningVector(form_manager_->federated_matches(), | 140 } |
161 ¤t_forms_weak_); | 141 AppendDeepCopyVector(form_manager_->federated_matches(), |
| 142 &local_credentials_forms_); |
162 origin_ = form_manager_->observed_form().origin; | 143 origin_ = form_manager_->observed_form().origin; |
163 SetState(password_manager::ui::CONFIRMATION_STATE); | 144 SetState(password_manager::ui::CONFIRMATION_STATE); |
164 } | 145 } |
165 | 146 |
166 void ManagePasswordsState::OnPasswordAutofilled( | 147 void ManagePasswordsState::OnPasswordAutofilled( |
167 const PasswordFormMap& password_form_map, | 148 const PasswordFormMap& password_form_map, |
168 const GURL& origin, | 149 const GURL& origin, |
169 const std::vector<std::unique_ptr<autofill::PasswordForm>>* | 150 const std::vector<std::unique_ptr<autofill::PasswordForm>>* |
170 federated_matches) { | 151 federated_matches) { |
171 DCHECK(!password_form_map.empty()); | 152 DCHECK(!password_form_map.empty()); |
172 ClearData(); | 153 ClearData(); |
173 bool only_PSL_matches = | 154 bool only_PSL_matches = |
174 find_if(password_form_map.begin(), password_form_map.end(), | 155 std::all_of(password_form_map.begin(), password_form_map.end(), |
175 [](const std::pair<const base::string16, | 156 [](const PasswordFormMap::value_type& p) { |
176 std::unique_ptr<autofill::PasswordForm>>& p) { | 157 return p.second->is_public_suffix_match; |
177 return !p.second->is_public_suffix_match; | 158 }); |
178 }) == password_form_map.end(); | |
179 if (only_PSL_matches) { | 159 if (only_PSL_matches) { |
180 // Don't show the UI for PSL matched passwords. They are not stored for this | 160 // Don't show the UI for PSL matched passwords. They are not stored for this |
181 // page and cannot be deleted. | 161 // page and cannot be deleted. |
182 origin_ = GURL(); | 162 origin_ = GURL(); |
183 SetState(password_manager::ui::INACTIVE_STATE); | 163 SetState(password_manager::ui::INACTIVE_STATE); |
184 } else { | 164 } else { |
185 local_credentials_forms_ = DeepCopyMapToVector(password_form_map); | 165 local_credentials_forms_ = DeepCopyMapToVector(password_form_map); |
186 if (federated_matches) { | 166 if (federated_matches) |
187 local_credentials_forms_.reserve(local_credentials_forms_.size() + | 167 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; | 168 origin_ = origin; |
195 SetState(password_manager::ui::MANAGE_STATE); | 169 SetState(password_manager::ui::MANAGE_STATE); |
196 } | 170 } |
197 } | 171 } |
198 | 172 |
199 void ManagePasswordsState::OnInactive() { | 173 void ManagePasswordsState::OnInactive() { |
200 ClearData(); | 174 ClearData(); |
201 origin_ = GURL(); | 175 origin_ = GURL(); |
202 SetState(password_manager::ui::INACTIVE_STATE); | 176 SetState(password_manager::ui::INACTIVE_STATE); |
203 } | 177 } |
204 | 178 |
205 void ManagePasswordsState::TransitionToState( | 179 void ManagePasswordsState::TransitionToState( |
206 password_manager::ui::State state) { | 180 password_manager::ui::State state) { |
207 DCHECK_NE(password_manager::ui::INACTIVE_STATE, state_); | 181 DCHECK_NE(password_manager::ui::INACTIVE_STATE, state_); |
208 DCHECK_EQ(password_manager::ui::MANAGE_STATE, state); | 182 DCHECK_EQ(password_manager::ui::MANAGE_STATE, state); |
209 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { | 183 if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { |
210 if (!credentials_callback_.is_null()) { | 184 if (!credentials_callback_.is_null()) { |
211 credentials_callback_.Run(nullptr); | 185 credentials_callback_.Run(nullptr); |
212 credentials_callback_.Reset(); | 186 credentials_callback_.Reset(); |
213 } | 187 } |
214 federated_credentials_forms_.clear(); | 188 federation_providers_forms_.clear(); |
215 } | 189 } |
216 SetState(state); | 190 SetState(state); |
217 } | 191 } |
218 | 192 |
219 void ManagePasswordsState::ProcessLoginsChanged( | 193 void ManagePasswordsState::ProcessLoginsChanged( |
220 const password_manager::PasswordStoreChangeList& changes) { | 194 const password_manager::PasswordStoreChangeList& changes) { |
221 if (state() == password_manager::ui::INACTIVE_STATE) | 195 if (state() == password_manager::ui::INACTIVE_STATE) |
222 return; | 196 return; |
223 | 197 |
224 for (const password_manager::PasswordStoreChange& change : changes) { | 198 for (const password_manager::PasswordStoreChange& change : changes) { |
(...skipping 15 matching lines...) Expand all Loading... |
240 const autofill::PasswordForm* form) { | 214 const autofill::PasswordForm* form) { |
241 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state()); | 215 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state()); |
242 DCHECK(!credentials_callback().is_null()); | 216 DCHECK(!credentials_callback().is_null()); |
243 | 217 |
244 credentials_callback().Run(form); | 218 credentials_callback().Run(form); |
245 set_credentials_callback(ManagePasswordsState::CredentialsCallback()); | 219 set_credentials_callback(ManagePasswordsState::CredentialsCallback()); |
246 } | 220 } |
247 | 221 |
248 void ManagePasswordsState::ClearData() { | 222 void ManagePasswordsState::ClearData() { |
249 form_manager_.reset(); | 223 form_manager_.reset(); |
250 current_forms_weak_.clear(); | |
251 local_credentials_forms_.clear(); | 224 local_credentials_forms_.clear(); |
252 federated_credentials_forms_.clear(); | 225 federation_providers_forms_.clear(); |
253 credentials_callback_.Reset(); | 226 credentials_callback_.Reset(); |
254 } | 227 } |
255 | 228 |
256 void ManagePasswordsState::AddForm(const autofill::PasswordForm& form) { | 229 void ManagePasswordsState::AddForm(const autofill::PasswordForm& form) { |
257 if (form.origin != origin_) | 230 if (form.origin != origin_) |
258 return; | 231 return; |
259 if (UpdateForm(form)) | 232 if (UpdateForm(form)) |
260 return; | 233 return; |
261 if (form_manager_) { | 234 local_credentials_forms_.push_back( |
262 local_credentials_forms_.push_back(new autofill::PasswordForm(form)); | 235 base::MakeUnique<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 } | 236 } |
268 | 237 |
269 bool ManagePasswordsState::UpdateForm(const autofill::PasswordForm& form) { | 238 bool ManagePasswordsState::UpdateForm(const autofill::PasswordForm& form) { |
270 if (form_manager_) { | 239 bool updated_locals = UpdateFormInVector(form, &local_credentials_forms_); |
271 // |current_forms_weak_| contains the list of current passwords. | 240 return (UpdateFormInVector(form, &federation_providers_forms_) || |
272 std::vector<const autofill::PasswordForm*>::iterator it = std::find_if( | 241 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 } | 242 } |
291 | 243 |
292 void ManagePasswordsState::DeleteForm(const autofill::PasswordForm& form) { | 244 void ManagePasswordsState::DeleteForm(const autofill::PasswordForm& form) { |
293 RemoveFormFromVector(form, ¤t_forms_weak_); | |
294 RemoveFormFromVector(form, &local_credentials_forms_); | 245 RemoveFormFromVector(form, &local_credentials_forms_); |
295 RemoveFormFromVector(form, &federated_credentials_forms_); | 246 RemoveFormFromVector(form, &federation_providers_forms_); |
296 } | 247 } |
297 | 248 |
298 void ManagePasswordsState::SetState(password_manager::ui::State state) { | 249 void ManagePasswordsState::SetState(password_manager::ui::State state) { |
299 DCHECK(client_); | 250 DCHECK(client_); |
300 if (client_->GetLogManager()->IsLoggingActive()) { | 251 if (client_->GetLogManager()->IsLoggingActive()) { |
301 password_manager::BrowserSavePasswordProgressLogger logger( | 252 password_manager::BrowserSavePasswordProgressLogger logger( |
302 client_->GetLogManager()); | 253 client_->GetLogManager()); |
303 logger.LogNumber( | 254 logger.LogNumber( |
304 autofill::SavePasswordProgressLogger::STRING_NEW_UI_STATE, | 255 autofill::SavePasswordProgressLogger::STRING_NEW_UI_STATE, |
305 state); | 256 state); |
306 } | 257 } |
307 state_ = state; | 258 state_ = state; |
308 } | 259 } |
OLD | NEW |