Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(480)

Side by Side Diff: chrome/browser/autofill/credit_card_field.cc

Issue 7014011: Change heuristic regex and order to match grabber-continental. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Move IsTextInput() check. Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/autofill/address_field.cc ('k') | chrome/browser/autofill/email_field.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/autofill/credit_card_field.h" 5 #include "chrome/browser/autofill/credit_card_field.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 if (fields == 0 || credit_card_field->expiration_month_) { 61 if (fields == 0 || credit_card_field->expiration_month_) {
62 // at beginning or end 62 // at beginning or end
63 name_pattern = l10n_util::GetStringUTF16( 63 name_pattern = l10n_util::GetStringUTF16(
64 IDS_AUTOFILL_NAME_ON_CARD_RE); 64 IDS_AUTOFILL_NAME_ON_CARD_RE);
65 } else { 65 } else {
66 name_pattern = l10n_util::GetStringUTF16( 66 name_pattern = l10n_util::GetStringUTF16(
67 IDS_AUTOFILL_NAME_ON_CARD_CONTEXTUAL_RE); 67 IDS_AUTOFILL_NAME_ON_CARD_CONTEXTUAL_RE);
68 } 68 }
69 } 69 }
70 70
71 if (ParseText(scanner, name_pattern, &credit_card_field->cardholder_)) 71 if (ParseText(scanner, name_pattern,
72 MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
73 &credit_card_field->cardholder_))
72 continue; 74 continue;
73 75
74 // As a hard-coded hack for Expedia's billing pages (expedia_checkout.html 76 // As a hard-coded hack for Expedia's billing pages (expedia_checkout.html
75 // and ExpediaBilling.html in our test suite), recognize separate fields 77 // and ExpediaBilling.html in our test suite), recognize separate fields
76 // for the cardholder's first and last name if they have the labels "cfnm" 78 // for the cardholder's first and last name if they have the labels "cfnm"
77 // and "clnm". 79 // and "clnm".
78 scanner->SaveCursor(); 80 scanner->SaveCursor();
79 const AutofillField* first; 81 const AutofillField* first;
80 if (!is_ecml && ParseText(scanner, ASCIIToUTF16("^cfnm"), &first) && 82 if (!is_ecml && ParseText(scanner, ASCIIToUTF16("^cfnm"),
83 MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
84 &first) &&
81 ParseText(scanner, ASCIIToUTF16("^clnm"), 85 ParseText(scanner, ASCIIToUTF16("^clnm"),
86 MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
82 &credit_card_field->cardholder_last_)) { 87 &credit_card_field->cardholder_last_)) {
83 credit_card_field->cardholder_ = first; 88 credit_card_field->cardholder_ = first;
84 continue; 89 continue;
85 } 90 }
86 scanner->Rewind(); 91 scanner->Rewind();
87 } 92 }
88 93
89 // We look for a card security code before we look for a credit 94 // We look for a card security code before we look for a credit
90 // card number and match the general term "number". The security code 95 // card number and match the general term "number". The security code
91 // has a plethora of names; we've seen "verification #", 96 // has a plethora of names; we've seen "verification #",
92 // "verification number", "card identification number" and others listed 97 // "verification number", "card identification number" and others listed
93 // in the |pattern| below. 98 // in the |pattern| below.
94 string16 pattern; 99 string16 pattern;
95 if (is_ecml) 100 if (is_ecml)
96 pattern = GetEcmlPattern(kEcmlCardVerification); 101 pattern = GetEcmlPattern(kEcmlCardVerification);
97 else 102 else
98 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_CVC_RE); 103 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_CVC_RE);
99 104
100 if (!credit_card_field->verification_ && 105 if (!credit_card_field->verification_ &&
101 ParseText(scanner, pattern, &credit_card_field->verification_)) 106 ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
107 &credit_card_field->verification_))
102 continue; 108 continue;
103 109
104 // TODO(jhawkins): Parse the type select control. 110 // TODO(jhawkins): Parse the type select control.
105 111
106 if (is_ecml) 112 if (is_ecml)
107 pattern = GetEcmlPattern(kEcmlCardNumber); 113 pattern = GetEcmlPattern(kEcmlCardNumber);
108 else 114 else
109 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_NUMBER_RE); 115 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_NUMBER_RE);
110 116
111 if (!credit_card_field->number_ && 117 if (!credit_card_field->number_ &&
112 ParseText(scanner, pattern, &credit_card_field->number_)) 118 ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
119 &credit_card_field->number_))
113 continue; 120 continue;
114 121
115 if (LowerCaseEqualsASCII(scanner->Cursor()->form_control_type, "month")) { 122 if (LowerCaseEqualsASCII(scanner->Cursor()->form_control_type, "month")) {
116 credit_card_field->expiration_month_ = scanner->Cursor(); 123 credit_card_field->expiration_month_ = scanner->Cursor();
117 scanner->Advance(); 124 scanner->Advance();
118 } else { 125 } else {
119 // "Expiration date" is the most common label here, but some pages have 126 // "Expiration date" is the most common label here, but some pages have
120 // "Expires", "exp. date" or "exp. month" and "exp. year". We also look 127 // "Expires", "exp. date" or "exp. month" and "exp. year". We also look
121 // for the field names ccmonth and ccyear, which appear on at least 4 of 128 // for the field names ccmonth and ccyear, which appear on at least 4 of
122 // our test pages. 129 // our test pages.
123 // 130 //
124 // -> On at least one page (The China Shop2.html) we find only the labels 131 // -> On at least one page (The China Shop2.html) we find only the labels
125 // "month" and "year". So for now we match these words directly; we'll 132 // "month" and "year". So for now we match these words directly; we'll
126 // see if this turns out to be too general. 133 // see if this turns out to be too general.
127 // 134 //
128 // Toolbar Bug 51451: indeed, simply matching "month" is too general for 135 // Toolbar Bug 51451: indeed, simply matching "month" is too general for
129 // https://rps.fidelity.com/ftgw/rps/RtlCust/CreatePIN/Init. 136 // https://rps.fidelity.com/ftgw/rps/RtlCust/CreatePIN/Init.
130 // Instead, we match only words beginning with "month". 137 // Instead, we match only words beginning with "month".
131 if (is_ecml) 138 if (is_ecml)
132 pattern = GetEcmlPattern(kEcmlCardExpireMonth); 139 pattern = GetEcmlPattern(kEcmlCardExpireMonth);
133 else 140 else
134 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_EXPIRATION_MONTH_RE); 141 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_EXPIRATION_MONTH_RE);
135 142
136 if ((!credit_card_field->expiration_month_ || 143 if ((!credit_card_field->expiration_month_ ||
137 credit_card_field->expiration_month_->IsEmpty()) && 144 credit_card_field->expiration_month_->IsEmpty()) &&
138 ParseText(scanner, pattern, &credit_card_field->expiration_month_)) { 145 ParseText(scanner, pattern,
146 MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT,
147 &credit_card_field->expiration_month_)) {
139 if (is_ecml) 148 if (is_ecml)
140 pattern = GetEcmlPattern(kEcmlCardExpireYear); 149 pattern = GetEcmlPattern(kEcmlCardExpireYear);
141 else 150 else
142 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_EXPIRATION_DATE_RE); 151 pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_EXPIRATION_DATE_RE);
143 152
144 if (!ParseText(scanner, pattern, 153 if (!ParseText(scanner, pattern,
154 MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT,
145 &credit_card_field->expiration_year_)) { 155 &credit_card_field->expiration_year_)) {
146 scanner->Rewind(); 156 scanner->Rewind();
147 return NULL; 157 return NULL;
148 } 158 }
149 continue; 159 continue;
150 } 160 }
151 } 161 }
152 162
153 if (ParseText(scanner, GetEcmlPattern(kEcmlCardExpireDay))) 163 if (ParseText(scanner,
164 GetEcmlPattern(kEcmlCardExpireDay),
165 MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT))
154 continue; 166 continue;
155 167
156 // Some pages (e.g. ExpediaBilling.html) have a "card description" 168 // Some pages (e.g. ExpediaBilling.html) have a "card description"
157 // field; we parse this field but ignore it. 169 // field; we parse this field but ignore it.
158 // We also ignore any other fields within a credit card block that 170 // We also ignore any other fields within a credit card block that
159 // start with "card", under the assumption that they are related to 171 // start with "card", under the assumption that they are related to
160 // the credit card section being processed but are uninteresting to us. 172 // the credit card section being processed but are uninteresting to us.
161 if (ParseText(scanner, 173 if (ParseText(scanner,
162 l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_IGNORED_RE))) 174 l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_IGNORED_RE),
175 MATCH_NAME | MATCH_LABEL | MATCH_TEXT))
163 continue; 176 continue;
164 177
165 break; 178 break;
166 } 179 }
167 180
168 // Some pages have a billing address field after the cardholder name field. 181 // Some pages have a billing address field after the cardholder name field.
169 // For that case, allow only just the cardholder name field. The remaining 182 // For that case, allow only just the cardholder name field. The remaining
170 // CC fields will be picked up in a following CreditCardField. 183 // CC fields will be picked up in a following CreditCardField.
171 if (credit_card_field->cardholder_) 184 if (credit_card_field->cardholder_)
172 return credit_card_field.release(); 185 return credit_card_field.release();
(...skipping 20 matching lines...) Expand all
193 206
194 CreditCardField::CreditCardField() 207 CreditCardField::CreditCardField()
195 : cardholder_(NULL), 208 : cardholder_(NULL),
196 cardholder_last_(NULL), 209 cardholder_last_(NULL),
197 type_(NULL), 210 type_(NULL),
198 number_(NULL), 211 number_(NULL),
199 verification_(NULL), 212 verification_(NULL),
200 expiration_month_(NULL), 213 expiration_month_(NULL),
201 expiration_year_(NULL) { 214 expiration_year_(NULL) {
202 } 215 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/address_field.cc ('k') | chrome/browser/autofill/email_field.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698