// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_COMPONENT_H_ #define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_COMPONENT_H_ #include <map> #include <memory> #include <optional> #include <string> #include <vector> #include "base/memory/raw_ptr.h" #include "components/autofill/core/browser/country_type.h" #include "components/autofill/core/browser/data_model/autofill_i18n_parsing_expression_components.h" #include "components/autofill/core/browser/field_types.h" namespace re2 { class RE2; } // namespace re2 namespace autofill { struct AddressToken; struct SortedTokenComparisonResult; // Represents the validation status of value stored in the AutofillProfile. // The associated integer values used to store the verification code in SQL and // should not be modified. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.autofill enum class VerificationStatus { … }; // Prints the string representation of |status| to |os|. std::ostream& operator<<(std::ostream& os, VerificationStatus status); // Returns true if |left| has a less significant verification status compared to // |right|. bool IsLessSignificantVerificationStatus(VerificationStatus left, VerificationStatus right); // Returns the more significant verification status according to // |IsLessSignificantVerificationStatus|. VerificationStatus GetMoreSignificantVerificationStatus( VerificationStatus left, VerificationStatus right); // The merge mode defines if and how two components are merged. // The merge operations are applied in the order defined here. // If one merge operation succeeds, the subsequent ones are not tested. // Therefore, if |KUseBetterOrMoreRecentIfDifferent| is active, // |kMergeChildrenAndReformatIfNeeded| will not be applied because // |kUseBetterOrMostRecentIfDifferent| is always applicable. enum MergeMode { … }; // An AddressComponent is a tree structure that represents a semi-structured // address token. Such an address token can either be an atomic leaf node or // have a set of children, each representing a more granular subtoken of the // component. // // An AddressComponent has a string representation stored in |value_| and a // VerificationStatus stored in |verification_status_|. // The latter indicates if the value was user-verified, observed in a form // submission event, parsed from its parent component or was formatted from its // child components. // // In a proper component tree, each AddressComponent has a unique // FieldType. Additionally, an AddressComponent may be associated with a // list of additional field types that allow for retrieving and setting the // Component's value in specific formats. For example, NAME_MIDDLE may be the // storage type and NAME_MIDDLE_INITIAL is an additional field type. // // The usage pattern of such an address tree is as follows: // // * Create a tree from an observed form submission or a profile editing or // creation event in the Chrome settings. It is assumed that the created // tree does not have values for competing field types. Two types are competing // iff they are on a common root-to-leaf path. For example, an imported profile // with a value for NAME_FULL and NAME_LAST has conflicting types that // carry redundant information. // // * After the creation of the tree, the values of unassigned nodes in the tree // are deducted from the values of assigned nodes. This happens by parsing // (taking a string and splitting it into components) or by formatting (taking // one or multiple strings and combining them into one string). // // * After the completion, there should be no need to modify the tree. // // * A tree may be mergeable with another tree of the same type. This // operation incorporates complementing observations. For example, in the first // tree NAME_FIRST, NAME_MIDDLE and NAME_LAST may be parsed from an observed // unstructured name (NAME_FULL). The second tree may be built from observing // the structured name, and contain observed NAME_FIRST, NAME_MIDDLE and // NAME_LAST values but only a formatted NAME_FULL value. class AddressComponent { … }; } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_COMPONENT_H_