| Index: chrome/browser/autofill/autofill_profile.cc
|
| diff --git a/chrome/browser/autofill/autofill_profile.cc b/chrome/browser/autofill/autofill_profile.cc
|
| index fbdb0da73b61316bf131dced7a033b5b30596bb7..f30aba4464d3e3c92e0919a42874e3a6fcd04bbd 100644
|
| --- a/chrome/browser/autofill/autofill_profile.cc
|
| +++ b/chrome/browser/autofill/autofill_profile.cc
|
| @@ -102,12 +102,10 @@ void GetFieldsForDistinguishingProfiles(
|
|
|
| AutoFillProfile::AutoFillProfile(const std::string& guid)
|
| : guid_(guid) {
|
| - InitPersonalInfo(&personal_info_);
|
| }
|
|
|
| AutoFillProfile::AutoFillProfile()
|
| : guid_(guid::GenerateGUID()) {
|
| - InitPersonalInfo(&personal_info_);
|
| }
|
|
|
| AutoFillProfile::AutoFillProfile(const AutoFillProfile& source)
|
| @@ -116,77 +114,82 @@ AutoFillProfile::AutoFillProfile(const AutoFillProfile& source)
|
| }
|
|
|
| AutoFillProfile::~AutoFillProfile() {
|
| - STLDeleteContainerPairSecondPointers(personal_info_.begin(),
|
| - personal_info_.end());
|
| +}
|
| +
|
| +AutoFillProfile& AutoFillProfile::operator=(const AutoFillProfile& profile) {
|
| + if (this == &profile)
|
| + return *this;
|
| +
|
| + label_ = profile.label_;
|
| + guid_ = profile.guid_;
|
| +
|
| + name_ = profile.name_;
|
| + email_ = profile.email_;
|
| + company_ = profile.company_;
|
| + home_number_ = profile.home_number_;
|
| + fax_number_ = profile.fax_number_;
|
| + address_ = profile.address_;
|
| +
|
| + return *this;
|
| }
|
|
|
| void AutoFillProfile::GetPossibleFieldTypes(
|
| const string16& text,
|
| FieldTypeSet* possible_types) const {
|
| - for (FormGroupMap::const_iterator iter = personal_info_.begin();
|
| - iter != personal_info_.end(); ++iter) {
|
| - FormGroup* data = iter->second;
|
| - DCHECK(data != NULL);
|
| - data->GetPossibleFieldTypes(text, possible_types);
|
| - }
|
| + FormGroupList info = info_list();
|
| + for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it)
|
| + (*it)->GetPossibleFieldTypes(text, possible_types);
|
| }
|
|
|
| void AutoFillProfile::GetAvailableFieldTypes(
|
| FieldTypeSet* available_types) const {
|
| - for (FormGroupMap::const_iterator iter = personal_info_.begin();
|
| - iter != personal_info_.end(); ++iter) {
|
| - FormGroup* data = iter->second;
|
| - DCHECK(data != NULL);
|
| - data->GetAvailableFieldTypes(available_types);
|
| - }
|
| + FormGroupList info = info_list();
|
| + for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it)
|
| + (*it)->GetAvailableFieldTypes(available_types);
|
| }
|
|
|
| string16 AutoFillProfile::GetFieldText(const AutofillType& type) const {
|
| AutofillType return_type(
|
| AutofillType::GetEquivalentFieldType(type.field_type()));
|
|
|
| - FormGroupMap::const_iterator iter = personal_info_.find(return_type.group());
|
| - if (iter == personal_info_.end() || iter->second == NULL)
|
| + FormGroupMap info = info_map();
|
| + FormGroupMap::const_iterator it = info.find(return_type.group());
|
| + if (it == info.end())
|
| return string16();
|
|
|
| - return iter->second->GetFieldText(return_type);
|
| + return it->second->GetFieldText(return_type);
|
| }
|
|
|
| void AutoFillProfile::FindInfoMatches(
|
| const AutofillType& type,
|
| - const string16& info,
|
| + const string16& value,
|
| std::vector<string16>* matched_text) const {
|
| if (matched_text == NULL) {
|
| DLOG(ERROR) << "NULL matched text passed in";
|
| return;
|
| }
|
|
|
| - string16 clean_info = StringToLowerASCII(CollapseWhitespace(info, false));
|
| + string16 clean_info = StringToLowerASCII(CollapseWhitespace(value, false));
|
|
|
| // If the field_type is unknown, then match against all field types.
|
| if (type.field_type() == UNKNOWN_TYPE) {
|
| - FormGroupMap::const_iterator iter;
|
| - for (iter = personal_info_.begin(); iter != personal_info_.end(); ++iter) {
|
| - iter->second->FindInfoMatches(type, clean_info, matched_text);
|
| - }
|
| + FormGroupList info = info_list();
|
| + for (FormGroupList::const_iterator it = info.begin();
|
| + it != info.end(); ++it)
|
| + (*it)->FindInfoMatches(type, clean_info, matched_text);
|
| } else {
|
| - FormGroupMap::const_iterator iter = personal_info_.find(type.group());
|
| - DCHECK(iter != personal_info_.end() && iter->second != NULL);
|
| - if (iter != personal_info_.end() && iter->second != NULL)
|
| - iter->second->FindInfoMatches(type, clean_info, matched_text);
|
| + FormGroupMap info = info_map();
|
| + FormGroupMap::const_iterator it = info.find(type.group());
|
| + DCHECK(it != info.end());
|
| + it->second->FindInfoMatches(type, clean_info, matched_text);
|
| }
|
| }
|
|
|
| void AutoFillProfile::SetInfo(const AutofillType& type, const string16& value) {
|
| - FormGroupMap::const_iterator iter = personal_info_.find(type.group());
|
| - if (iter == personal_info_.end() || iter->second == NULL)
|
| - return;
|
| -
|
| - iter->second->SetInfo(type, CollapseWhitespace(value, false));
|
| -}
|
| -
|
| -FormGroup* AutoFillProfile::Clone() const {
|
| - return new AutoFillProfile(*this);
|
| + MutableFormGroupMap info = mutable_info_map();
|
| + MutableFormGroupMap::iterator it = info.find(type.group());
|
| + DCHECK(it != info.end());
|
| + it->second->SetInfo(type, CollapseWhitespace(value, false));
|
| }
|
|
|
| const string16 AutoFillProfile::Label() const {
|
| @@ -194,19 +197,11 @@ const string16 AutoFillProfile::Label() const {
|
| }
|
|
|
| const std::string AutoFillProfile::CountryCode() const {
|
| - FormGroup* form_group =
|
| - personal_info_.find(AutofillType::ADDRESS_HOME)->second;
|
| - DCHECK(form_group);
|
| - Address* address = static_cast<Address*>(form_group);
|
| - return address->country_code();
|
| + return address_.country_code();
|
| }
|
|
|
| void AutoFillProfile::SetCountryCode(const std::string& country_code) {
|
| - FormGroup* form_group =
|
| - personal_info_.find(AutofillType::ADDRESS_HOME)->second;
|
| - DCHECK(form_group);
|
| - Address* address = static_cast<Address*>(form_group);
|
| - address->set_country_code(country_code);
|
| + address_.set_country_code(country_code);
|
| }
|
|
|
| // static
|
| @@ -278,25 +273,6 @@ bool AutoFillProfile::IsEmpty() const {
|
| return types.empty();
|
| }
|
|
|
| -void AutoFillProfile::operator=(const AutoFillProfile& source) {
|
| - if (this == &source)
|
| - return;
|
| -
|
| - label_ = source.label_;
|
| - guid_ = source.guid_;
|
| -
|
| - STLDeleteContainerPairSecondPointers(personal_info_.begin(),
|
| - personal_info_.end());
|
| - personal_info_.clear();
|
| -
|
| - FormGroupMap::const_iterator iter;
|
| - for (iter = source.personal_info_.begin();
|
| - iter != source.personal_info_.end();
|
| - ++iter) {
|
| - personal_info_[iter->first] = iter->second->Clone();
|
| - }
|
| -}
|
| -
|
| int AutoFillProfile::Compare(const AutoFillProfile& profile) const {
|
| // The following AutoFill field types are the only types we store in the WebDB
|
| // so far, so we're only concerned with matching these types in the profile.
|
| @@ -446,12 +422,36 @@ void AutoFillProfile::CreateDifferentiatingLabels(
|
| }
|
| }
|
|
|
| -// static
|
| -void AutoFillProfile::InitPersonalInfo(FormGroupMap* personal_info) {
|
| - (*personal_info)[AutofillType::CONTACT_INFO] = new ContactInfo();
|
| - (*personal_info)[AutofillType::PHONE_HOME] = new HomePhoneNumber();
|
| - (*personal_info)[AutofillType::PHONE_FAX] = new FaxNumber();
|
| - (*personal_info)[AutofillType::ADDRESS_HOME] = new Address();
|
| +AutoFillProfile::FormGroupList AutoFillProfile::info_list() const {
|
| + FormGroupList v(6);
|
| + v[0] = &name_;
|
| + v[1] = &email_;
|
| + v[2] = &company_;
|
| + v[3] = &home_number_;
|
| + v[4] = &fax_number_;
|
| + v[5] = &address_;
|
| + return v;
|
| +}
|
| +
|
| +AutoFillProfile::FormGroupMap AutoFillProfile::info_map() const {
|
| + FormGroupMap m;
|
| + m[AutofillType::NAME] = &name_;
|
| + m[AutofillType::EMAIL] = &email_;
|
| + m[AutofillType::COMPANY] = &company_;
|
| + m[AutofillType::PHONE_HOME] = &home_number_;
|
| + m[AutofillType::PHONE_FAX] = &fax_number_;
|
| + m[AutofillType::ADDRESS_HOME] = &address_;
|
| + return m;
|
| +}
|
| +
|
| +AutoFillProfile::MutableFormGroupMap AutoFillProfile::mutable_info_map() {
|
| + FormGroupMap m_const = info_map();
|
| + MutableFormGroupMap m;
|
| + for (FormGroupMap::const_iterator it = m_const.begin();
|
| + it != m_const.end(); ++it) {
|
| + m[it->first] = const_cast<FormGroup*>(it->second);
|
| + }
|
| + return m;
|
| }
|
|
|
| // So we can compare AutoFillProfiles with EXPECT_EQ().
|
|
|