account_select_fill_data.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/password_manager/ios/account_select_fill_data.h"
  5. #include "base/strings/string_util.h"
  6. #include "components/autofill/core/common/password_form_fill_data.h"
  7. using autofill::FieldRendererId;
  8. using autofill::FormRendererId;
  9. namespace password_manager {
  10. FillData::FillData() = default;
  11. FillData::~FillData() = default;
  12. FormInfo::FormInfo() = default;
  13. FormInfo::~FormInfo() = default;
  14. FormInfo::FormInfo(const FormInfo&) = default;
  15. Credential::Credential(const std::u16string& username,
  16. const std::u16string& password,
  17. const std::string& realm)
  18. : username(username), password(password), realm(realm) {}
  19. Credential::~Credential() = default;
  20. AccountSelectFillData::AccountSelectFillData() = default;
  21. AccountSelectFillData::~AccountSelectFillData() = default;
  22. void AccountSelectFillData::Add(
  23. const autofill::PasswordFormFillData& form_data) {
  24. auto iter_ok = forms_.insert(
  25. std::make_pair(form_data.form_renderer_id.value(), FormInfo()));
  26. FormInfo& form_info = iter_ok.first->second;
  27. form_info.origin = form_data.url;
  28. form_info.form_id = form_data.form_renderer_id;
  29. form_info.username_element_id = form_data.username_field.unique_renderer_id;
  30. form_info.password_element_id = form_data.password_field.unique_renderer_id;
  31. // Suggested credentials don't depend on a clicked form. It's better to use
  32. // the latest known credentials, since credentials can be updated between
  33. // loading of different forms.
  34. credentials_.clear();
  35. credentials_.push_back({form_data.username_field.value,
  36. form_data.password_field.value,
  37. form_data.preferred_realm});
  38. for (const auto& username_password_and_realm : form_data.additional_logins) {
  39. const std::u16string& username = username_password_and_realm.username;
  40. const std::u16string& password = username_password_and_realm.password;
  41. const std::string& realm = username_password_and_realm.realm;
  42. credentials_.push_back({username, password, realm});
  43. }
  44. }
  45. void AccountSelectFillData::Reset() {
  46. forms_.clear();
  47. credentials_.clear();
  48. last_requested_form_ = nullptr;
  49. }
  50. bool AccountSelectFillData::Empty() const {
  51. return credentials_.empty();
  52. }
  53. bool AccountSelectFillData::IsSuggestionsAvailable(
  54. FormRendererId form_identifier,
  55. FieldRendererId field_identifier,
  56. bool is_password_field) const {
  57. return GetFormInfo(form_identifier, field_identifier, is_password_field) !=
  58. nullptr;
  59. }
  60. std::vector<UsernameAndRealm> AccountSelectFillData::RetrieveSuggestions(
  61. FormRendererId form_identifier,
  62. FieldRendererId field_identifier,
  63. bool is_password_field) {
  64. last_requested_form_ =
  65. GetFormInfo(form_identifier, field_identifier, is_password_field);
  66. DCHECK(last_requested_form_);
  67. last_requested_password_field_id_ =
  68. is_password_field ? field_identifier : FieldRendererId();
  69. std::vector<UsernameAndRealm> result;
  70. for (const Credential& credential : credentials_)
  71. result.push_back({credential.username, credential.realm});
  72. return result;
  73. }
  74. std::unique_ptr<FillData> AccountSelectFillData::GetFillData(
  75. const std::u16string& username) const {
  76. if (!last_requested_form_) {
  77. NOTREACHED();
  78. return nullptr;
  79. }
  80. auto it = std::find_if(credentials_.begin(), credentials_.end(),
  81. [&username](const auto& credential) {
  82. return credential.username == username;
  83. });
  84. if (it == credentials_.end())
  85. return nullptr;
  86. const Credential& credential = *it;
  87. auto result = std::make_unique<FillData>();
  88. result->origin = last_requested_form_->origin;
  89. result->form_id = last_requested_form_->form_id;
  90. result->username_element_id = last_requested_form_->username_element_id;
  91. result->username_value = credential.username;
  92. result->password_element_id = last_requested_password_field_id_.is_null()
  93. ? last_requested_form_->password_element_id
  94. : last_requested_password_field_id_;
  95. result->password_value = credential.password;
  96. return result;
  97. }
  98. const FormInfo* AccountSelectFillData::GetFormInfo(
  99. FormRendererId form_identifier,
  100. FieldRendererId field_identifier,
  101. bool is_password_field) const {
  102. auto it = forms_.find(form_identifier);
  103. if (it == forms_.end())
  104. return nullptr;
  105. return is_password_field || it->second.username_element_id == field_identifier
  106. ? &it->second
  107. : nullptr;
  108. }
  109. } // namespace password_manager