blob: 1992c905e6cee8009e7fc075f6d2995af4738c18 [file] [log] [blame]
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/autofill/data_model_wrapper.h"
6
7#include "base/callback.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01008#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01009#include "chrome/browser/browser_process.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000010#include "chrome/browser/ui/autofill/autofill_dialog_models.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010011#include "components/autofill/content/browser/wallet/full_wallet.h"
12#include "components/autofill/content/browser/wallet/wallet_address.h"
13#include "components/autofill/content/browser/wallet/wallet_items.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010014#include "components/autofill/core/browser/autofill_data_model.h"
15#include "components/autofill/core/browser/autofill_profile.h"
16#include "components/autofill/core/browser/autofill_type.h"
17#include "components/autofill/core/browser/credit_card.h"
18#include "components/autofill/core/browser/form_structure.h"
19#include "components/autofill/core/browser/validation.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000020#include "ui/base/resource/resource_bundle.h"
21#include "ui/gfx/image/image.h"
22
23namespace autofill {
24
25DataModelWrapper::~DataModelWrapper() {}
26
27string16 DataModelWrapper::GetDisplayText() {
28 string16 comma = ASCIIToUTF16(", ");
Ben Murdoch32409262013-08-07 11:04:47 +010029 string16 label =
30 GetInfo(AutofillType(NAME_FULL)) + comma +
31 GetInfo(AutofillType(ADDRESS_HOME_LINE1));
32 string16 address2 = GetInfo(AutofillType(ADDRESS_HOME_LINE2));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000033 if (!address2.empty())
34 label += comma + address2;
35 label += ASCIIToUTF16("\n") +
Ben Murdoch32409262013-08-07 11:04:47 +010036 GetInfo(AutofillType(ADDRESS_HOME_CITY)) + comma +
37 GetInfo(AutofillType(ADDRESS_HOME_STATE)) + ASCIIToUTF16(" ") +
38 GetInfo(AutofillType(ADDRESS_HOME_ZIP));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000039 return label;
40}
41
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010042bool DataModelWrapper::FillFormStructure(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000043 const DetailInputs& inputs,
44 const InputFieldComparator& compare,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010045 FormStructure* form_structure) const {
46 bool filled_something = false;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000047 for (size_t i = 0; i < form_structure->field_count(); ++i) {
48 AutofillField* field = form_structure->field(i);
49 for (size_t j = 0; j < inputs.size(); ++j) {
50 if (compare.Run(inputs[j], *field)) {
51 FillFormField(field);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010052 filled_something = true;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000053 break;
54 }
55 }
56 }
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010057 return filled_something;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000058}
59
60void DataModelWrapper::FillInputs(DetailInputs* inputs) {
61 for (size_t i = 0; i < inputs->size(); ++i) {
Ben Murdoch32409262013-08-07 11:04:47 +010062 (*inputs)[i].initial_value = GetInfo(AutofillType((*inputs)[i].type));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000063 }
64}
65
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010066void DataModelWrapper::FillFormField(AutofillField* field) const {
Ben Murdoch32409262013-08-07 11:04:47 +010067 field->value = GetInfo(field->Type());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000068}
69
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010070DataModelWrapper::DataModelWrapper() {}
71
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000072gfx::Image DataModelWrapper::GetIcon() {
73 return gfx::Image();
74}
75
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010076// EmptyDataModelWrapper
77
78EmptyDataModelWrapper::EmptyDataModelWrapper() {}
79EmptyDataModelWrapper::~EmptyDataModelWrapper() {}
80
Ben Murdoch32409262013-08-07 11:04:47 +010081string16 EmptyDataModelWrapper::GetInfo(const AutofillType& type) const {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010082 return string16();
83}
84
85void EmptyDataModelWrapper::FillFormField(AutofillField* field) const {}
86
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010087// AutofillDataModelWrapper
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000088
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010089AutofillDataModelWrapper::AutofillDataModelWrapper(
90 const AutofillDataModel* data_model,
91 size_t variant)
92 : data_model_(data_model),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000093 variant_(variant) {}
94
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010095AutofillDataModelWrapper::~AutofillDataModelWrapper() {}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000096
Ben Murdoch32409262013-08-07 11:04:47 +010097string16 AutofillDataModelWrapper::GetInfo(const AutofillType& type) const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010098 return data_model_->GetInfo(type, g_browser_process->GetApplicationLocale());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000099}
100
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100101void AutofillDataModelWrapper::FillFormField(AutofillField* field) const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100102 data_model_->FillFormField(
103 *field, variant_, g_browser_process->GetApplicationLocale(), field);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000104}
105
106// AutofillProfileWrapper
107
108AutofillProfileWrapper::AutofillProfileWrapper(
109 const AutofillProfile* profile, size_t variant)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100110 : AutofillDataModelWrapper(profile, variant),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000111 profile_(profile) {}
112
113AutofillProfileWrapper::~AutofillProfileWrapper() {}
114
115void AutofillProfileWrapper::FillInputs(DetailInputs* inputs) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100116 const std::string app_locale = g_browser_process->GetApplicationLocale();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000117 for (size_t j = 0; j < inputs->size(); ++j) {
118 std::vector<string16> values;
Ben Murdoch32409262013-08-07 11:04:47 +0100119 profile_->GetMultiInfo(
120 AutofillType((*inputs)[j].type), app_locale, &values);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100121 (*inputs)[j].initial_value = values[variant()];
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000122 }
123}
124
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100125void AutofillProfileWrapper::FillFormField(AutofillField* field) const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100126 if (field->Type().GetStorableType() == CREDIT_CARD_NAME) {
127 // Cache the field's true type.
128 HtmlFieldType original_type = field->html_type();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100129
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100130 // Requests for the user's credit card are filled from the billing address,
131 // but the AutofillProfile class doesn't know how to fill credit card
132 // fields. So, temporarily set the type to the corresponding profile type.
Ben Murdochbb1529c2013-08-08 10:24:53 +0100133 field->SetHtmlType(HTML_TYPE_NAME, field->html_mode());
134 AutofillDataModelWrapper::FillFormField(field);
135
136 // Restore the field's true type.
137 field->SetHtmlType(original_type, field->html_mode());
138 } else {
139 AutofillDataModelWrapper::FillFormField(field);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100140 }
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100141}
142
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000143// AutofillCreditCardWrapper
144
145AutofillCreditCardWrapper::AutofillCreditCardWrapper(const CreditCard* card)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100146 : AutofillDataModelWrapper(card, 0),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000147 card_(card) {}
148
149AutofillCreditCardWrapper::~AutofillCreditCardWrapper() {}
150
Ben Murdoch32409262013-08-07 11:04:47 +0100151string16 AutofillCreditCardWrapper::GetInfo(const AutofillType& type) const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100152 if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000153 return MonthComboboxModel::FormatMonth(card_->expiration_month());
154
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100155 return AutofillDataModelWrapper::GetInfo(type);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000156}
157
158gfx::Image AutofillCreditCardWrapper::GetIcon() {
159 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100160 return rb.GetImageNamed(CreditCard::IconResourceId(card_->type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000161}
162
163string16 AutofillCreditCardWrapper::GetDisplayText() {
Ben Murdocheb525c52013-07-10 11:40:50 +0100164 if (!card_->IsValid())
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100165 return string16();
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100166
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000167 return card_->TypeAndLastFourDigits();
168}
169
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000170// WalletAddressWrapper
171
172WalletAddressWrapper::WalletAddressWrapper(
173 const wallet::Address* address) : address_(address) {}
174
175WalletAddressWrapper::~WalletAddressWrapper() {}
176
Ben Murdoch32409262013-08-07 11:04:47 +0100177string16 WalletAddressWrapper::GetInfo(const AutofillType& type) const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100178 return address_->GetInfo(type, g_browser_process->GetApplicationLocale());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000179}
180
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100181string16 WalletAddressWrapper::GetDisplayText() {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100182 if (!address_->is_complete_address() ||
Ben Murdoch32409262013-08-07 11:04:47 +0100183 GetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER)).empty()) {
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100184 return string16();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100185 }
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100186
187 return DataModelWrapper::GetDisplayText();
188}
189
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000190// WalletInstrumentWrapper
191
192WalletInstrumentWrapper::WalletInstrumentWrapper(
193 const wallet::WalletItems::MaskedInstrument* instrument)
194 : instrument_(instrument) {}
195
196WalletInstrumentWrapper::~WalletInstrumentWrapper() {}
197
Ben Murdoch32409262013-08-07 11:04:47 +0100198string16 WalletInstrumentWrapper::GetInfo(const AutofillType& type) const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100199 if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000200 return MonthComboboxModel::FormatMonth(instrument_->expiration_month());
201
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100202 return instrument_->GetInfo(type, g_browser_process->GetApplicationLocale());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000203}
204
205gfx::Image WalletInstrumentWrapper::GetIcon() {
206 return instrument_->CardIcon();
207}
208
209string16 WalletInstrumentWrapper::GetDisplayText() {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100210 // TODO(dbeam): handle other instrument statuses? http://crbug.com/233048
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100211 if (instrument_->status() == wallet::WalletItems::MaskedInstrument::EXPIRED ||
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100212 !instrument_->address().is_complete_address() ||
Ben Murdoch32409262013-08-07 11:04:47 +0100213 GetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER)).empty()) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100214 return string16();
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100215 }
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100216
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000217 // TODO(estade): descriptive_name() is user-provided. Should we use it or
218 // just type + last 4 digits?
219 string16 line1 = instrument_->descriptive_name();
220 return line1 + ASCIIToUTF16("\n") + DataModelWrapper::GetDisplayText();
221}
222
223// FullWalletBillingWrapper
224
225FullWalletBillingWrapper::FullWalletBillingWrapper(
226 wallet::FullWallet* full_wallet)
227 : full_wallet_(full_wallet) {
228 DCHECK(full_wallet_);
229}
230
231FullWalletBillingWrapper::~FullWalletBillingWrapper() {}
232
Ben Murdoch32409262013-08-07 11:04:47 +0100233string16 FullWalletBillingWrapper::GetInfo(const AutofillType& type) const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100234 if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
Ben Murdoch558790d2013-07-30 15:19:42 +0100235 return MonthComboboxModel::FormatMonth(full_wallet_->expiration_month());
236
Ben Murdoch32409262013-08-07 11:04:47 +0100237 if (type.group() == CREDIT_CARD)
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000238 return full_wallet_->GetInfo(type);
239
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100240 return full_wallet_->billing_address()->GetInfo(
241 type, g_browser_process->GetApplicationLocale());
242}
243
244string16 FullWalletBillingWrapper::GetDisplayText() {
245 // TODO(dbeam): handle other required actions? http://crbug.com/163508
246 if (full_wallet_->HasRequiredAction(wallet::UPDATE_EXPIRATION_DATE))
247 return string16();
248
249 return DataModelWrapper::GetDisplayText();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000250}
251
252// FullWalletShippingWrapper
253
254FullWalletShippingWrapper::FullWalletShippingWrapper(
255 wallet::FullWallet* full_wallet)
256 : full_wallet_(full_wallet) {
257 DCHECK(full_wallet_);
258}
259
260FullWalletShippingWrapper::~FullWalletShippingWrapper() {}
261
Ben Murdoch32409262013-08-07 11:04:47 +0100262string16 FullWalletShippingWrapper::GetInfo(const AutofillType& type) const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100263 return full_wallet_->shipping_address()->GetInfo(
264 type, g_browser_process->GetApplicationLocale());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000265}
266
Ben Murdocheb525c52013-07-10 11:40:50 +0100267DetailOutputWrapper::DetailOutputWrapper(const DetailOutputMap& outputs)
268 : outputs_(outputs) {}
269
270DetailOutputWrapper::~DetailOutputWrapper() {}
271
Ben Murdoch32409262013-08-07 11:04:47 +0100272base::string16 DetailOutputWrapper::GetInfo(const AutofillType& type) const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100273 ServerFieldType storable_type = type.GetStorableType();
Ben Murdocheb525c52013-07-10 11:40:50 +0100274 for (DetailOutputMap::const_iterator it = outputs_.begin();
275 it != outputs_.end(); ++it) {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100276 if (storable_type == AutofillType(it->first->type).GetStorableType())
Ben Murdocheb525c52013-07-10 11:40:50 +0100277 return it->second;
278 }
279 return base::string16();
280}
281
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000282} // namespace autofill