1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iosfwd> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/address.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/contact_info.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct FormFieldData; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A collection of FormGroups stored in a profile. AutofillProfile also 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implements the FormGroup interface so that owners of this object can request 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// form information from the profile, and the profile will delegate the request 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the requested form group type. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillProfile : public AutofillDataModel { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillProfile(const std::string& guid, const std::string& origin); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For use in STL containers. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillProfile(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillProfile(const AutofillProfile& profile); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AutofillProfile(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillProfile& operator=(const AutofillProfile& profile); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FormGroup: 433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void GetMatchingTypes( 443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const base::string16& text, 453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::string& app_locale, 463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeSet* matching_types) const OVERRIDE; 473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual base::string16 GetRawInfo(ServerFieldType type) const OVERRIDE; 483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void SetRawInfo(ServerFieldType type, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& value) OVERRIDE; 503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual base::string16 GetInfo(const AutofillType& type, 513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::string& app_locale) const OVERRIDE; 523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual bool SetInfo(const AutofillType& type, 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& value, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& app_locale) OVERRIDE; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // AutofillDataModel: 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual base::string16 GetInfoForVariant( 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const AutofillType& type, 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) size_t variant, 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& app_locale) const OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multi-value equivalents to |GetInfo| and |SetInfo|. 633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void SetRawMultiInfo(ServerFieldType type, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<base::string16>& values); 653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void GetRawMultiInfo(ServerFieldType type, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values) const; 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetMultiInfo(const AutofillType& type, 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<base::string16>& values, 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& app_locale); 703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void GetMultiInfo(const AutofillType& type, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& app_locale, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values) const; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there are no values (field types) set. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IsEmpty(const std::string& app_locale) const; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns true if the |type| of data in this profile is present, but invalid. 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Otherwise returns false. 793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool IsPresentButInvalid(ServerFieldType type) const; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparison for Sync. Returns 0 if the profile is the same as |this|, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or < 0, or > 0 if it is different. The implied ordering can be used for 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // culling duplicates. The ordering is based on collation order of the 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // textual contents of the fields. Full profile comparison, comparison 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // includes multi-valued fields. 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // GUIDs, origins, and language codes are not compared, only the contents 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // themselves. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Compare(const AutofillProfile& profile) const; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Same as operator==, but ignores differences in origin. 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool EqualsSansOrigin(const AutofillProfile& profile) const; 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Same as operator==, but ignores differences in GUID. 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool EqualsSansGuid(const AutofillProfile& profile) const; 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Equality operators compare GUIDs, origins, language code, and the contents 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // in the comparison. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const AutofillProfile& profile) const; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool operator!=(const AutofillProfile& profile) const; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns concatenation of full name and address line 1. This acts as the 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // basis of comparison for new values that are submitted through forms to 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aid with correct aggregation of new data. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16 PrimaryValue() const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the data in this AutofillProfile is a subset of the data in 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |profile|. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool IsSubsetOf(const AutofillProfile& profile, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale) const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overwrites the single-valued field data in |profile| with this 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Profile. Or, for multi-valued fields append the new values. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OverwriteWithOrAddTo(const AutofillProfile& profile, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns |true| if |type| accepts multi-values. 1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch static bool SupportsMultiValue(ServerFieldType type); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Creates a differentiating label for each of the |profiles|. 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Labels consist of the minimal differentiating combination of: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1. Full name. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2. Address. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 3. E-mail. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 4. Phone. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 5. Company name. 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static void CreateDifferentiatingLabels( 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<AutofillProfile*>& profiles, 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_locale, 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::string16>* labels); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates inferred labels for |profiles|, according to the rules above and 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // stores them in |created_labels|. If |suggested_fields| is not NULL, the 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resulting label fields are drawn from |suggested_fields|, except excluding 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |excluded_field|. Otherwise, the label fields are drawn from a default set, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and |excluded_field| is ignored; by convention, it should be of 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |UNKNOWN_TYPE| when |suggested_fields| is NULL. Each label includes at 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // least |minimal_fields_shown| fields, if possible. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void CreateInferredLabels( 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<AutofillProfile*>& profiles, 1413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::vector<ServerFieldType>* suggested_fields, 1423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType excluded_field, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t minimal_fields_shown, 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_locale, 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::string16>* labels); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& language_code() const { return language_code_; } 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_language_code(const std::string& language_code) { 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch language_code_ = language_code; 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<const FormGroup*> FormGroupList; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FormGroup: 1563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void GetSupportedTypes( 1573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeSet* supported_types) const OVERRIDE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shared implementation for GetRawMultiInfo() and GetMultiInfo(). Pass an 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // empty |app_locale| to get the raw info; otherwise, the returned info is 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // canonicalized according to the given |app_locale|, if appropriate. 1623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void GetMultiInfoImpl(const AutofillType& type, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& app_locale, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values) const; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builds inferred label from the first |num_fields_to_include| non-empty 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fields in |label_fields|. Uses as many fields as possible if there are not 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough non-empty fields. 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 ConstructInferredLabel( 1703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::vector<ServerFieldType>& label_fields, 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t num_fields_to_include, 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_locale) const; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates inferred labels for |profiles| at indices corresponding to 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |indices|, and stores the results to the corresponding elements of 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |labels|. These labels include enough fields to differentiate among the 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // profiles, if possible; and also at least |num_fields_to_include| fields, if 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // possible. The label fields are drawn from |fields|. 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static void CreateInferredLabelsHelper( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<AutofillProfile*>& profiles, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::list<size_t>& indices, 1823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::vector<ServerFieldType>& fields, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_fields_to_include, 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_locale, 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::string16>* labels); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Utilities for listing and lookup of the data members that constitute 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user-visible profile information. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormGroupList FormGroups() const; 1903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const FormGroup* FormGroupForType(const AutofillType& type) const; 1913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch FormGroup* MutableFormGroupForType(const AutofillType& type); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Appends unique names from |names| onto the |name_| list, dropping 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // duplicates. If a name in |names| has the same full name representation 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // as a name in |name_|, keeps the variant that has more information (i.e. 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // is not reconstructible via a heuristic parse of the full name string). 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OverwriteOrAppendNames(const std::vector<NameInfo>& names, 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_locale); 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Personal information for this profile. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<NameInfo> name_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<EmailInfo> email_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompanyInfo company_; 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<PhoneNumber> phone_number_; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Address address_; 206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The BCP 47 language code that can be used to format |address_| for display. 208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string language_code_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So we can compare AutofillProfiles with EXPECT_EQ(). 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const AutofillProfile& profile); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_H_ 217