1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/common/field_data_manager.h"
#include <utility>
#include "base/check.h"
#include "base/i18n/case_conversion.h"
namespace autofill {
FieldDataManager::FieldDataManager() = default;
void FieldDataManager::ClearData() {
field_value_and_properties_map_.clear();
}
bool FieldDataManager::HasFieldData(FieldRendererId id) const {
return field_value_and_properties_map_.find(id) !=
field_value_and_properties_map_.end();
}
std::u16string FieldDataManager::GetUserInput(FieldRendererId id) const {
DCHECK(HasFieldData(id));
return field_value_and_properties_map_.at(id).first.value_or(
std::u16string());
}
FieldPropertiesMask FieldDataManager::GetFieldPropertiesMask(
FieldRendererId id) const {
DCHECK(HasFieldData(id));
return field_value_and_properties_map_.at(id).second;
}
bool FieldDataManager::FindMatchedValue(const std::u16string& value) const {
constexpr size_t kMinMatchSize = 3u;
const auto lowercase = base::i18n::ToLower(value);
for (const auto& map_key : field_value_and_properties_map_) {
const std::u16string typed_from_key =
map_key.second.first.value_or(std::u16string());
if (typed_from_key.empty())
continue;
if (typed_from_key.size() >= kMinMatchSize &&
lowercase.find(base::i18n::ToLower(typed_from_key)) !=
std::u16string::npos)
return true;
}
return false;
}
void FieldDataManager::UpdateFieldDataMap(FieldRendererId id,
std::u16string value,
FieldPropertiesMask mask) {
const bool is_empty = value.empty();
if (HasFieldData(id)) {
field_value_and_properties_map_[id].first = std::move(value);
field_value_and_properties_map_[id].second |= mask;
} else {
field_value_and_properties_map_[id] = {std::move(value), mask};
}
// Reset kUserTyped and kAutofilled flags if the value is empty.
if (is_empty) {
field_value_and_properties_map_[id].second &=
~(FieldPropertiesFlags::kUserTyped | FieldPropertiesFlags::kAutofilled);
}
}
void FieldDataManager::UpdateFieldDataMapWithNullValue(
FieldRendererId id,
FieldPropertiesMask mask) {
if (HasFieldData(id)) {
field_value_and_properties_map_[id].second |= mask;
} else {
field_value_and_properties_map_[id] = {std::nullopt, mask};
}
}
bool FieldDataManager::DidUserType(FieldRendererId id) const {
return HasFieldData(id) &&
(GetFieldPropertiesMask(id) & FieldPropertiesFlags::kUserTyped);
}
bool FieldDataManager::WasAutofilledOnUserTrigger(FieldRendererId id) const {
return HasFieldData(id) &&
(GetFieldPropertiesMask(id) &
(FieldPropertiesFlags::kAutofilledOnUserTrigger |
FieldPropertiesFlags::kAutofilledChangePasswordFormOnPageLoad));
}
FieldDataManager::~FieldDataManager() = default;
} // namespace autofill
|