| OLD | NEW |
| 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/form_field.h" | 5 #include "chrome/browser/autofill/form_field.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 scanner.Advance(); | 163 scanner.Advance(); |
| 164 continue; | 164 continue; |
| 165 } | 165 } |
| 166 | 166 |
| 167 bool ok = form_field->GetFieldInfo(field_type_map); | 167 bool ok = form_field->GetFieldInfo(field_type_map); |
| 168 DCHECK(ok); | 168 DCHECK(ok); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 // static | 172 // static |
| 173 bool FormField::MatchWithType(const AutofillField* field, |
| 174 const string16& pattern, |
| 175 int match_type) { |
| 176 if ((match_type & MATCH_LABEL) && MatchLabel(field, pattern)) |
| 177 return true; |
| 178 |
| 179 // For now, we apply the same pattern to the field's label and the field's |
| 180 // name. Matching the name is a bit of a long shot for many patterns, but |
| 181 // it generally doesn't hurt to try. |
| 182 if ((match_type & MATCH_NAME) && MatchName(field, pattern)) |
| 183 return true; |
| 184 |
| 185 return false; |
| 186 } |
| 187 |
| 188 // static |
| 173 bool FormField::Match(const AutofillField* field, | 189 bool FormField::Match(const AutofillField* field, |
| 174 const string16& pattern, | 190 const string16& pattern, |
| 175 bool match_label_only) { | 191 bool match_label_only) { |
| 176 if (MatchLabel(field, pattern)) | 192 return Match(field, pattern, |
| 177 return true; | 193 MATCH_NAME | (match_label_only ? 0 : MATCH_NAME)); |
| 178 | |
| 179 // For now, we apply the same pattern to the field's label and the field's | |
| 180 // name. Matching the name is a bit of a long shot for many patterns, but | |
| 181 // it generally doesn't hurt to try. | |
| 182 if (!match_label_only && MatchName(field, pattern)) | |
| 183 return true; | |
| 184 | |
| 185 return false; | |
| 186 } | 194 } |
| 187 | 195 |
| 188 // static | 196 // static |
| 189 bool FormField::MatchName(const AutofillField* field, const string16& pattern) { | 197 bool FormField::MatchName(const AutofillField* field, const string16& pattern) { |
| 190 // TODO(jhawkins): Remove StringToLowerASCII. WebRegularExpression needs to | 198 // TODO(jhawkins): Remove StringToLowerASCII. WebRegularExpression needs to |
| 191 // be fixed to take WebTextCaseInsensitive into account. | 199 // be fixed to take WebTextCaseInsensitive into account. |
| 192 WebKit::WebRegularExpression re(WebKit::WebString(pattern), | 200 WebKit::WebRegularExpression re(WebKit::WebString(pattern), |
| 193 WebKit::WebTextCaseInsensitive); | 201 WebKit::WebTextCaseInsensitive); |
| 194 bool match = re.match( | 202 bool match = re.match( |
| 195 WebKit::WebString(StringToLowerASCII(field->name))) != -1; | 203 WebKit::WebString(StringToLowerASCII(field->name))) != -1; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 field = CreditCardField::Parse(scanner, is_ecml); | 236 field = CreditCardField::Parse(scanner, is_ecml); |
| 229 if (field) | 237 if (field) |
| 230 return field; | 238 return field; |
| 231 | 239 |
| 232 // We search for a |NameField| last since it matches the word "name", which is | 240 // We search for a |NameField| last since it matches the word "name", which is |
| 233 // relatively general. | 241 // relatively general. |
| 234 return NameField::Parse(scanner, is_ecml); | 242 return NameField::Parse(scanner, is_ecml); |
| 235 } | 243 } |
| 236 | 244 |
| 237 // static | 245 // static |
| 238 bool FormField::ParseText(AutofillScanner* scanner, const string16& pattern) { | |
| 239 const AutofillField* field; | |
| 240 return ParseText(scanner, pattern, &field); | |
| 241 } | |
| 242 | |
| 243 // static | |
| 244 bool FormField::ParseText(AutofillScanner* scanner, | 246 bool FormField::ParseText(AutofillScanner* scanner, |
| 245 const string16& pattern, | 247 const string16& pattern, |
| 248 int match_type) { |
| 249 const AutofillField* field; |
| 250 return ParseText(scanner, pattern, match_type, &field); |
| 251 } |
| 252 |
| 253 // static |
| 254 bool FormField::ParseText(AutofillScanner* scanner, |
| 255 const string16& pattern, |
| 256 int match_type, |
| 246 const AutofillField** dest) { | 257 const AutofillField** dest) { |
| 247 return ParseText(scanner, pattern, dest, false); | 258 return ParseText(scanner, pattern, dest, match_type); |
| 248 } | 259 } |
| 249 | 260 |
| 250 // static | 261 // static |
| 251 bool FormField::ParseEmptyText(AutofillScanner* scanner, | 262 bool FormField::ParseEmptyText(AutofillScanner* scanner, |
| 252 const AutofillField** dest) { | 263 const AutofillField** dest) { |
| 253 return ParseLabelText(scanner, ASCIIToUTF16("^$"), dest); | 264 return ParseText(scanner, ASCIIToUTF16("^$"), |
| 254 } | 265 MATCH_LABEL | MATCH_TEXT | MATCH_SELECT, dest); |
| 255 | |
| 256 // static | |
| 257 bool FormField::ParseLabelText(AutofillScanner* scanner, | |
| 258 const string16& pattern, | |
| 259 const AutofillField** dest) { | |
| 260 return ParseText(scanner, pattern, dest, true); | |
| 261 } | 266 } |
| 262 | 267 |
| 263 // static | 268 // static |
| 264 bool FormField::ParseText(AutofillScanner* scanner, | 269 bool FormField::ParseText(AutofillScanner* scanner, |
| 265 const string16& pattern, | 270 const string16& pattern, |
| 266 const AutofillField** dest, | 271 const AutofillField** dest, |
| 267 bool match_label_only) { | 272 int match_type) { |
| 268 if (scanner->IsEnd()) | 273 if (scanner->IsEnd()) |
| 269 return false; | 274 return false; |
| 270 | 275 |
| 271 const AutofillField* field = scanner->Cursor(); | 276 const AutofillField* field = scanner->Cursor(); |
| 272 if (Match(field, pattern, match_label_only)) { | 277 |
| 278 if (!(match_type & MATCH_SELECT) && |
| 279 field->form_control_type == ASCIIToUTF16("select-one")) |
| 280 return false; |
| 281 |
| 282 if (!(match_type & MATCH_TEXT) && field->is_text_input) |
| 283 return false; |
| 284 |
| 285 if (MatchWithType(field, pattern, match_type)) { |
| 273 if (dest) | 286 if (dest) |
| 274 *dest = field; | 287 *dest = field; |
| 275 scanner->Advance(); | 288 scanner->Advance(); |
| 276 return true; | 289 return true; |
| 277 } | 290 } |
| 278 | 291 |
| 279 return false; | 292 return false; |
| 280 } | 293 } |
| 281 | 294 |
| 282 // static | 295 // static |
| 283 bool FormField::ParseLabelAndName(AutofillScanner* scanner, | 296 bool FormField::ParseEmpty(AutofillScanner* scanner) { |
| 284 const string16& pattern, | 297 // TODO(jhawkins): Handle select fields. |
| 285 const AutofillField** dest) { | 298 const string16 pattern(ASCIIToUTF16("^$")); |
| 286 const AutofillField* field = scanner->Cursor(); | 299 const AutofillField* field = scanner->Cursor(); |
| 287 if (MatchLabel(field, pattern) && MatchName(field, pattern)) { | 300 if (MatchLabel(field, pattern) && MatchName(field, pattern)) { |
| 288 if (dest) | |
| 289 *dest = field; | |
| 290 scanner->Advance(); | 301 scanner->Advance(); |
| 291 return true; | 302 return true; |
| 292 } | 303 } |
| 293 | 304 |
| 294 return false; | 305 return false; |
| 295 } | 306 } |
| 296 | 307 |
| 297 // static | 308 // static |
| 298 bool FormField::ParseEmpty(AutofillScanner* scanner) { | |
| 299 // TODO(jhawkins): Handle select fields. | |
| 300 return ParseLabelAndName(scanner, ASCIIToUTF16("^$"), NULL); | |
| 301 } | |
| 302 | |
| 303 // static | |
| 304 bool FormField::Add(FieldTypeMap* field_type_map, | 309 bool FormField::Add(FieldTypeMap* field_type_map, |
| 305 const AutofillField* field, | 310 const AutofillField* field, |
| 306 AutofillFieldType type) { | 311 AutofillFieldType type) { |
| 307 // Several fields are optional. | 312 // Several fields are optional. |
| 308 if (!field) | 313 if (!field) |
| 309 return true; | 314 return true; |
| 310 | 315 |
| 311 // TODO(isherman): Is this the intent? | 316 // TODO(isherman): Is this the intent? |
| 312 return field_type_map->insert(make_pair(field->unique_name(), type)).second; | 317 return field_type_map->insert(make_pair(field->unique_name(), type)).second; |
| 313 } | 318 } |
| 314 | 319 |
| 315 string16 FormField::GetEcmlPattern(const char* ecml_name) { | 320 string16 FormField::GetEcmlPattern(const char* ecml_name) { |
| 316 return ASCIIToUTF16(std::string("^") + ecml_name); | 321 return ASCIIToUTF16(std::string("^") + ecml_name); |
| 317 } | 322 } |
| 318 | 323 |
| 319 string16 FormField::GetEcmlPattern(const char* ecml_name1, | 324 string16 FormField::GetEcmlPattern(const char* ecml_name1, |
| 320 const char* ecml_name2, | 325 const char* ecml_name2, |
| 321 char pattern_operator) { | 326 char pattern_operator) { |
| 322 return ASCIIToUTF16(StringPrintf("^%s%c^%s", | 327 return ASCIIToUTF16(StringPrintf("^%s%c^%s", |
| 323 ecml_name1, pattern_operator, ecml_name2)); | 328 ecml_name1, pattern_operator, ecml_name2)); |
| 324 } | 329 } |
| OLD | NEW |