1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOFILL_AUTOFILL_PROFILE_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOFILL_AUTOFILL_PROFILE_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <stddef.h> 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <list> 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <ostream> 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#ifdef ANDROID 16a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#include "base/base_api.h" 17a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#endif 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/address.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/autofill_type.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/contact_info.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/fax_number.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/field_types.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/form_group.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/home_phone_number.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A collection of FormGroups stored in a profile. AutofillProfile also 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implements the FormGroup interface so that owners of this object can request 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// form information from the profile, and the profile will delegate the request 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to the requested form group type. 31a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsenclass 32a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#ifdef ANDROID 33a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian MonsenBASE_API 34a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian Monsen#endif 35a1fe9c0450e6d56112949b33ef2f7491e0cf0f60Kristian MonsenAutofillProfile : public FormGroup { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen explicit AutofillProfile(const std::string& guid); 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For use in STL containers. 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile(); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile(const AutofillProfile& profile); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~AutofillProfile(); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile& operator=(const AutofillProfile& profile); 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // FormGroup: 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void GetPossibleFieldTypes(const string16& text, 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FieldTypeSet* possible_types) const; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void GetAvailableFieldTypes(FieldTypeSet* available_types) const; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual string16 GetInfo(AutofillFieldType type) const; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SetInfo(AutofillFieldType type, const string16& value); 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Multi-value equivalents to |GetInfo| and |SetInfo|. 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetMultiInfo(AutofillFieldType type, 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<string16>& values); 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void GetMultiInfo(AutofillFieldType type, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16>* values) const; 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns |true| if |type| accepts multi-values. 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static bool SupportsMultiValue(AutofillFieldType type); 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The user-visible label of the profile, generated in relation to other 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // profiles. Shows at least 2 fields that differentiate profile from other 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // profiles. See AdjustInferredLabels() further down for more description. 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual const string16 Label() const; 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This guid is the primary identifier for |AutofillProfile| objects. 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string guid() const { return guid_; } 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void set_guid(const std::string& guid) { guid_ = guid; } 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Accessors for the stored address's country code. 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string CountryCode() const; 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SetCountryCode(const std::string& country_code); 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adjusts the labels according to profile data. 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Labels contain minimal different combination of: 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 1. Full name. 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 2. Address. 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 3. E-mail. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 4. Phone. 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 5. Fax. 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 6. Company name. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Profile labels are changed accordingly to these rules. 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if any of the profiles were updated. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This function is useful if you want to adjust unique labels for all 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // profiles. For non permanent situations (selection of profile, when user 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // started typing in the field, for example) use CreateInferredLabels(). 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static bool AdjustInferredLabels(std::vector<AutofillProfile*>* profiles); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Creates inferred labels for |profiles|, according to the rules above and 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // stores them in |created_labels|. If |suggested_fields| is not NULL, the 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // resulting label fields are drawn from |suggested_fields|, except excluding 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |excluded_field|. Otherwise, the label fields are drawn from a default set, 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // and |excluded_field| is ignored; by convention, it should be of 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |UNKNOWN_TYPE| when |suggested_fields| is NULL. Each label includes at 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // least |minimal_fields_shown| fields, if possible. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void CreateInferredLabels( 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<AutofillProfile*>* profiles, 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<AutofillFieldType>* suggested_fields, 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillFieldType excluded_field, 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t minimal_fields_shown, 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::vector<string16>* created_labels); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if there are no values (field types) set. 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool IsEmpty() const; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Comparison for Sync. Returns 0 if the profile is the same as |this|, 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // or < 0, or > 0 if it is different. The implied ordering can be used for 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // culling duplicates. The ordering is based on collation order of the 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // textual contents of the fields. 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // GUIDs are not compared, only the values of the contents themselves. 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // DEPRECATED: Use |CompareMulti| instead. |Compare| does not compare 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // multi-valued items. 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int Compare(const AutofillProfile& profile) const; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Comparison for Sync. Same as |Compare| but includes multi-valued fields. 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int CompareMulti(const AutofillProfile& profile) const; 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Equality operators compare GUIDs and the contents in the comparison. 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(dhollowa): This needs to be made multi-profile once Sync updates. 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool operator==(const AutofillProfile& profile) const; 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool operator!=(const AutofillProfile& profile) const; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns concatenation of full name and address line 1. This acts as the 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // basis of comparison for new values that are submitted through forms to 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // aid with correct aggregation of new data. 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const string16 PrimaryValue() const; 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overwrites the single-valued field data in |profile| with this 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Profile. Or, for multi-valued fields append the new values. 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OverwriteWithOrAddTo(const AutofillProfile& profile); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen typedef std::vector<const FormGroup*> FormGroupList; 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Builds inferred label from the first |num_fields_to_include| non-empty 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // fields in |label_fields|. Uses as many fields as possible if there are not 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // enough non-empty fields. 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 ConstructInferredLabel( 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<AutofillFieldType>& label_fields, 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen size_t num_fields_to_include) const; 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Creates inferred labels for |profiles| at indices corresponding to 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |indices|, and stores the results to the corresponding elements of 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |created_labels|. These labels include enough fields to differentiate among 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the profiles, if possible; and also at least |num_fields_to_include| 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // fields, if possible. The label fields are drawn from |fields|. 14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static void CreateDifferentiatingLabels( 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<AutofillProfile*>& profiles, 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::list<size_t>& indices, 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<AutofillFieldType>& fields, 15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen size_t num_fields_to_include, 15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::vector<string16>* created_labels); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Utilities for listing and lookup of the data members that constitute 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // user-visible profile information. 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FormGroupList FormGroups() const; 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FormGroup* FormGroupForType(AutofillFieldType type) const; 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FormGroup* MutableFormGroupForType(AutofillFieldType type); 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The label presented to the user when selecting a profile. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 label_; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The guid of this profile. 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string guid_; 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Personal information for this profile. 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<NameInfo> name_; 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<EmailInfo> email_; 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CompanyInfo company_; 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<HomePhoneNumber> home_number_; 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<FaxNumber> fax_number_; 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Address address_; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// So we can compare AutofillProfiles with EXPECT_EQ(). 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::ostream& operator<<(std::ostream& os, const AutofillProfile& profile); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_AUTOFILL_AUTOFILL_PROFILE_H_ 180