1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_field.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/address_field.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_field.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_regexes.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_scanner.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card_field.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/email_field.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/name_field.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_field.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsCheckable(const AutofillField* field) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return field->is_checkable; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FormField::ParseFormFields(const std::vector<AutofillField*>& fields, 383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeMap* map) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a working copy of the fields to be processed. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AutofillField*> remaining_fields(fields.size()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::copy(fields.begin(), fields.end(), remaining_fields.begin()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore checkable fields as they interfere with parsers assuming context. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Eg., while parsing address, "Is PO box" checkbox after ADDRESS_LINE1 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // interferes with correctly understanding ADDRESS_LINE2. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remaining_fields.erase( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::remove_if(remaining_fields.begin(), remaining_fields.end(), 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsCheckable), 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remaining_fields.end()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Email pass. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseFormFieldsPass(EmailField::Parse, &remaining_fields, map); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Phone pass. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseFormFieldsPass(PhoneField::Parse, &remaining_fields, map); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Address pass. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseFormFieldsPass(AddressField::Parse, &remaining_fields, map); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Credit card pass. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseFormFieldsPass(CreditCardField::Parse, &remaining_fields, map); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Name pass. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseFormFieldsPass(NameField::Parse, &remaining_fields, map); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::ParseField(AutofillScanner* scanner, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& pattern, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutofillField** match) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ParseFieldSpecifics(scanner, pattern, MATCH_DEFAULT, match); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::ParseFieldSpecifics(AutofillScanner* scanner, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& pattern, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_type, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutofillField** match) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (scanner->IsEnd()) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutofillField* field = scanner->Cursor(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!MatchesFormControlType(field->form_control_type, match_type)) 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return MatchAndAdvance(scanner, pattern, match_type, match); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::ParseEmptyLabel(AutofillScanner* scanner, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutofillField** match) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ParseFieldSpecifics(scanner, 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("^$"), 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MATCH_LABEL | MATCH_ALL_INPUTS, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::AddClassification(const AutofillField* field, 1013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type, 1023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeMap* map) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Several fields are optional. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!field) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return map->insert(make_pair(field->unique_name(), type)).second; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::MatchAndAdvance(AutofillScanner* scanner, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& pattern, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_type, 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutofillField** match) { 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AutofillField* field = scanner->Cursor(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FormField::Match(field, pattern, match_type)) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (match) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *match = field; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scanner->Advance(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FormField::Match(const AutofillField* field, 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& pattern, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_type) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((match_type & FormField::MATCH_LABEL) && 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::MatchesPattern(field->label, pattern)) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((match_type & FormField::MATCH_NAME) && 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::MatchesPattern(field->name, pattern)) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((match_type & FormField::MATCH_VALUE) && 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::MatchesPattern(field->value, pattern)) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FormField::ParseFormFieldsPass(ParseFunction parse, 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AutofillField*>* fields, 1513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeMap* map) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store unmatched fields for further processing by the caller. 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AutofillField*> remaining_fields; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillScanner scanner(*fields); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!scanner.IsEnd()) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<FormField> form_field(parse(&scanner)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!form_field.get()) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remaining_fields.push_back(scanner.Cursor()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scanner.Advance(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add entries into the map for each field type found in |form_field|. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = form_field->ClassifyField(map); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ok); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::swap(*fields, remaining_fields); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FormField::MatchesFormControlType(const std::string& type, 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int match_type) { 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((match_type & MATCH_TEXT) && type == "text") 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((match_type & MATCH_EMAIL) && type == "email") 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((match_type & MATCH_TELEPHONE) && type == "tel") 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((match_type & MATCH_SELECT) && type == "select-one") 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((match_type & MATCH_TEXT_AREA) && type == "textarea") 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 193