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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/autofill/data_model_wrapper.h"
#include <stddef.h>
#include "base/bind.h"
#include "base/callback.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h"
#include "chrome/browser/ui/autofill/autofill_dialog_models.h"
#include "components/autofill/core/browser/address_i18n.h"
#include "components/autofill/core/browser/autofill_country.h"
#include "components/autofill/core/browser/autofill_data_model.h"
#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_profile.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/form_structure.h"
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h"
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_formatter.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
namespace autofill {
DataModelWrapper::~DataModelWrapper() {}
void DataModelWrapper::FillInputs(DetailInputs* inputs) {
for (size_t i = 0; i < inputs->size(); ++i) {
(*inputs)[i].initial_value =
GetInfoForDisplay(AutofillType((*inputs)[i].type));
}
}
base::string16 DataModelWrapper::GetInfoForDisplay(const AutofillType& type)
const {
return GetInfo(type);
}
gfx::Image DataModelWrapper::GetIcon() {
return gfx::Image();
}
bool DataModelWrapper::GetDisplayText(
base::string16* vertically_compact,
base::string16* horizontally_compact) {
base::string16 phone =
GetInfoForDisplay(AutofillType(PHONE_HOME_WHOLE_NUMBER));
if (phone.empty())
return false;
// Format the address.
scoped_ptr< ::i18n::addressinput::AddressData> address_data =
i18n::CreateAddressData(
base::Bind(&DataModelWrapper::GetInfo, base::Unretained(this)));
address_data->language_code = GetLanguageCode();
// Interactive autofill dialog does not display organization field.
address_data->organization.clear();
std::vector<std::string> lines;
::i18n::addressinput::GetFormattedNationalAddress(*address_data, &lines);
std::string single_line;
::i18n::addressinput::GetFormattedNationalAddressLine(
*address_data, &single_line);
// Email and phone number aren't part of address formatting.
base::string16 non_address_info;
base::string16 email = GetInfoForDisplay(AutofillType(EMAIL_ADDRESS));
if (!email.empty())
non_address_info += base::ASCIIToUTF16("\n") + email;
non_address_info += base::ASCIIToUTF16("\n") + phone;
*vertically_compact = base::UTF8ToUTF16(single_line) + non_address_info;
*horizontally_compact = base::UTF8ToUTF16(base::JoinString(lines, "\n")) +
non_address_info;
return true;
}
bool DataModelWrapper::FillFormStructure(
const std::vector<ServerFieldType>& types,
const FormStructure::InputFieldComparator& compare,
FormStructure* form_structure) const {
return form_structure->FillFields(
types,
compare,
base::Bind(&DataModelWrapper::GetInfo, base::Unretained(this)),
GetLanguageCode(),
g_browser_process->GetApplicationLocale());
}
DataModelWrapper::DataModelWrapper() {}
// AutofillProfileWrapper
AutofillProfileWrapper::AutofillProfileWrapper(const AutofillProfile* profile)
: profile_(profile) {}
AutofillProfileWrapper::~AutofillProfileWrapper() {}
base::string16 AutofillProfileWrapper::GetInfo(const AutofillType& type) const {
// Requests for the user's credit card are filled from the billing address,
// but the AutofillProfile class doesn't know how to fill credit card
// fields. So, request for the corresponding profile type instead.
AutofillType effective_type = type;
if (type.GetStorableType() == CREDIT_CARD_NAME_FULL)
effective_type = AutofillType(NAME_BILLING_FULL);
const std::string& app_locale = g_browser_process->GetApplicationLocale();
return profile_->GetInfo(effective_type, app_locale);
}
base::string16 AutofillProfileWrapper::GetInfoForDisplay(
const AutofillType& type) const {
// We display the "raw" phone number which contains user-defined formatting.
if (type.GetStorableType() == PHONE_HOME_WHOLE_NUMBER) {
base::string16 phone_number = profile_->GetRawInfo(type.GetStorableType());
// If there is no user-defined formatting at all, add some standard
// formatting.
if (base::ContainsOnlyChars(phone_number,
base::ASCIIToUTF16("+0123456789"))) {
std::string region = base::UTF16ToASCII(
GetInfo(AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE)));
i18n::PhoneObject phone(phone_number, region);
base::string16 formatted_number = phone.GetFormattedNumber();
// Formatting may fail.
if (!formatted_number.empty())
return formatted_number;
}
return phone_number;
}
return DataModelWrapper::GetInfoForDisplay(type);
}
const std::string& AutofillProfileWrapper::GetLanguageCode() const {
return profile_->language_code();
}
// AutofillShippingAddressWrapper
AutofillShippingAddressWrapper::AutofillShippingAddressWrapper(
const AutofillProfile* profile)
: AutofillProfileWrapper(profile) {}
AutofillShippingAddressWrapper::~AutofillShippingAddressWrapper() {}
base::string16 AutofillShippingAddressWrapper::GetInfo(
const AutofillType& type) const {
// Shipping addresses don't have email addresses associated with them.
if (type.GetStorableType() == EMAIL_ADDRESS)
return base::string16();
return AutofillProfileWrapper::GetInfo(type);
}
// AutofillCreditCardWrapper
AutofillCreditCardWrapper::AutofillCreditCardWrapper(const CreditCard* card)
: card_(card) {}
AutofillCreditCardWrapper::~AutofillCreditCardWrapper() {}
base::string16 AutofillCreditCardWrapper::GetInfo(const AutofillType& type)
const {
if (type.group() != CREDIT_CARD)
return base::string16();
if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
return MonthComboboxModel::FormatMonth(card_->expiration_month());
return card_->GetInfo(type, g_browser_process->GetApplicationLocale());
}
gfx::Image AutofillCreditCardWrapper::GetIcon() {
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
return rb.GetImageNamed(CreditCard::IconResourceId(card_->type()));
}
bool AutofillCreditCardWrapper::GetDisplayText(
base::string16* vertically_compact,
base::string16* horizontally_compact) {
if (!card_->IsValid())
return false;
*vertically_compact = *horizontally_compact = card_->TypeAndLastFourDigits();
return true;
}
const std::string& AutofillCreditCardWrapper::GetLanguageCode() const {
// Formatting a credit card for display does not depend on language code.
return base::EmptyString();
}
// I18nAddressDataWrapper
I18nAddressDataWrapper::I18nAddressDataWrapper(
const ::i18n::addressinput::AddressData* address)
: address_(address) {}
I18nAddressDataWrapper::~I18nAddressDataWrapper() {}
base::string16 I18nAddressDataWrapper::GetInfo(const AutofillType& type) const {
::i18n::addressinput::AddressField field;
if (!i18n::FieldForType(type.GetStorableType(), &field))
return base::string16();
if (field == ::i18n::addressinput::STREET_ADDRESS)
return base::string16();
if (field == ::i18n::addressinput::COUNTRY) {
return AutofillCountry(address_->region_code,
g_browser_process->GetApplicationLocale()).name();
}
return base::UTF8ToUTF16(address_->GetFieldValue(field));
}
const std::string& I18nAddressDataWrapper::GetLanguageCode() const {
return address_->language_code;
}
} // namespace autofill
|