1 // Copyright 2013 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 "components/autofill/content/browser/wallet/form_field_error.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/values.h"
11
12 namespace autofill {
13 namespace wallet {
14
15 namespace {
16
ErrorTypeFromString(const std::string & error_type)17 FormFieldError::ErrorType ErrorTypeFromString(const std::string& error_type) {
18 if (LowerCaseEqualsASCII(error_type, "unknown_error"))
19 return FormFieldError::UNKNOWN_ERROR;
20 if (LowerCaseEqualsASCII(error_type, "invalid_phone_number"))
21 return FormFieldError::INVALID_PHONE_NUMBER;
22 if (LowerCaseEqualsASCII(error_type, "invalid_postal_code"))
23 return FormFieldError::INVALID_POSTAL_CODE;
24 if (LowerCaseEqualsASCII(error_type, "invalid_address"))
25 return FormFieldError::INVALID_ADDRESS;
26 if (LowerCaseEqualsASCII(error_type, "invalid_card_details"))
27 return FormFieldError::INVALID_CARD_DETAILS;
28 if (LowerCaseEqualsASCII(error_type, "invalid_city"))
29 return FormFieldError::INVALID_CITY;
30 if (LowerCaseEqualsASCII(error_type, "invalid_instrument"))
31 return FormFieldError::INVALID_INSTRUMENT;
32 if (LowerCaseEqualsASCII(error_type, "invalid_state"))
33 return FormFieldError::INVALID_STATE;
34 if (LowerCaseEqualsASCII(error_type, "required_field_not_set"))
35 return FormFieldError::REQUIRED_FIELD_NOT_SET;
36 return FormFieldError::UNKNOWN_ERROR;
37 }
38
LocationFromString(const std::string & location)39 FormFieldError::Location LocationFromString(const std::string& location) {
40 if (LowerCaseEqualsASCII(location, "unknown_location"))
41 return FormFieldError::UNKNOWN_LOCATION;
42 if (LowerCaseEqualsASCII(location, "payment_instrument"))
43 return FormFieldError::PAYMENT_INSTRUMENT;
44 if (LowerCaseEqualsASCII(location, "shipping_address"))
45 return FormFieldError::SHIPPING_ADDRESS;
46 if (LowerCaseEqualsASCII(location, "legal_address"))
47 return FormFieldError::LEGAL_ADDRESS;
48 return FormFieldError::UNKNOWN_LOCATION;
49 }
50
51 } // namespace
52
FormFieldError(ErrorType error_type,Location location)53 FormFieldError::FormFieldError(ErrorType error_type, Location location)
54 : error_type_(error_type),
55 location_(location) {}
56
~FormFieldError()57 FormFieldError::~FormFieldError() {}
58
GetAutofillType() const59 ServerFieldType FormFieldError::GetAutofillType() const {
60 switch (error_type_) {
61 case INVALID_PHONE_NUMBER:
62 if (location_ == LEGAL_ADDRESS || location_ == PAYMENT_INSTRUMENT)
63 return PHONE_BILLING_WHOLE_NUMBER;
64 if (location_ == SHIPPING_ADDRESS)
65 return PHONE_HOME_WHOLE_NUMBER;
66 break;
67
68 case INVALID_POSTAL_CODE:
69 case INVALID_CITY:
70 case INVALID_STATE:
71 if (location_ == LEGAL_ADDRESS || location_ == PAYMENT_INSTRUMENT)
72 return ADDRESS_BILLING_ZIP;
73 if (location_ == SHIPPING_ADDRESS)
74 return ADDRESS_HOME_ZIP;
75 break;
76
77 case INVALID_ADDRESS:
78 if (location_ == LEGAL_ADDRESS || location_ == PAYMENT_INSTRUMENT)
79 return ADDRESS_BILLING_LINE1;
80 if (location_ == SHIPPING_ADDRESS)
81 return ADDRESS_HOME_LINE1;
82 break;
83
84 case INVALID_CARD_DETAILS:
85 return CREDIT_CARD_VERIFICATION_CODE;
86
87 case INVALID_INSTRUMENT:
88 return CREDIT_CARD_NUMBER;
89
90 case REQUIRED_FIELD_NOT_SET:
91 case UNKNOWN_ERROR:
92 return MAX_VALID_FIELD_TYPE;
93 }
94
95 return MAX_VALID_FIELD_TYPE;
96 }
97
98 // TODO(ahutter): L10n after UX provides strings.
GetErrorMessage() const99 base::string16 FormFieldError::GetErrorMessage() const {
100 switch (error_type_) {
101 case INVALID_PHONE_NUMBER:
102 return base::ASCIIToUTF16("Not a valid phone number");
103
104 case INVALID_POSTAL_CODE:
105 return base::ASCIIToUTF16("Not a valid zip code");
106
107 case INVALID_CITY:
108 return base::ASCIIToUTF16("Zip code is not valid for the entered city");
109
110 case INVALID_STATE:
111 return base::ASCIIToUTF16("Zip code is not valid for the entered state");
112
113 case INVALID_ADDRESS:
114 return base::ASCIIToUTF16("Not a valid street address");
115
116 case INVALID_CARD_DETAILS:
117 return base::ASCIIToUTF16("Not a valid CVN");
118
119 case INVALID_INSTRUMENT:
120 return base::ASCIIToUTF16("Not a valid CC#");
121
122 case REQUIRED_FIELD_NOT_SET:
123 return base::ASCIIToUTF16("Required field is missing");
124
125 case UNKNOWN_ERROR:
126 return base::ASCIIToUTF16("An unknown error occurred");
127 }
128
129 NOTREACHED();
130 return base::string16();
131 }
132
133 // static
CreateFormFieldError(const base::DictionaryValue & dictionary)134 FormFieldError FormFieldError::CreateFormFieldError(
135 const base::DictionaryValue& dictionary) {
136 FormFieldError form_field_error(UNKNOWN_ERROR, UNKNOWN_LOCATION);
137
138 std::string error_type;
139 if (dictionary.GetString("type", &error_type))
140 form_field_error.error_type_ = ErrorTypeFromString(error_type);
141
142 std::string location;
143 if (dictionary.GetString("location", &location))
144 form_field_error.location_ = LocationFromString(location);
145
146 return form_field_error;
147 }
148
operator ==(const FormFieldError & other) const149 bool FormFieldError::operator==(const FormFieldError& other) const {
150 return error_type_ == other.error_type_ && location_ == other.location_;
151 }
152
153 } // namespace wallet
154 } // namespace autofill
155