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