Chromium Code Reviews| 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( |
| 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 ¤t_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 ¤t_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 ¤t_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 Loading... | |
| 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, ¤t_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 } |
| OLD | NEW |