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/name_field.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_regex_constants.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_scanner.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF8ToUTF16;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A form field that can parse a full name field.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullNameField : public NameField {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FullNameField* Parse(AutofillScanner* scanner);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FormField:
283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool ClassifyField(ServerFieldTypeMap* map) const OVERRIDE;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit FullNameField(AutofillField* field);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* field_;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FullNameField);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A form field that can parse a first and last name field.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FirstLastNameField : public NameField {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FirstLastNameField* ParseSpecificName(AutofillScanner* scanner);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FirstLastNameField* ParseComponentNames(AutofillScanner* scanner);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FirstLastNameField* Parse(AutofillScanner* scanner);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FormField:
473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool ClassifyField(ServerFieldTypeMap* map) const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FirstLastNameField();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* first_name_;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* middle_name_;  // Optional.
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* last_name_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool middle_initial_;  // True if middle_name_ is a middle initial.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FirstLastNameField);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FormField* NameField::Parse(AutofillScanner* scanner) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (scanner->IsEnd())
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try FirstLastNameField first since it's more specific.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NameField* field = FirstLastNameField::Parse(scanner);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!field)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field = FullNameField::Parse(scanner);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return field;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is overriden in concrete subclasses.
743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool NameField::ClassifyField(ServerFieldTypeMap* map) const {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullNameField* FullNameField::Parse(AutofillScanner* scanner) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exclude e.g. "username" or "nickname" fields.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->SaveCursor();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_ignore = ParseField(scanner,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  UTF8ToUTF16(autofill::kNameIgnoredRe), NULL);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->Rewind();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (should_ignore)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Searching for any label containing the word "name" is too general;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for example, Travelocity_Edit travel profile.html contains a field
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Travel Profile Name".
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* field = NULL;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ParseField(scanner, UTF8ToUTF16(autofill::kNameRe), &field))
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new FullNameField(field);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool FullNameField::ClassifyField(ServerFieldTypeMap* map) const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddClassification(field_, NAME_FULL, map);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFullNameField::FullNameField(AutofillField* field) : field_(field) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstLastNameField* FirstLastNameField::ParseSpecificName(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillScanner* scanner) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some pages (e.g. Overstock_comBilling.html, SmithsonianCheckout.html)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have the label "Name" followed by two or three text fields.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FirstLastNameField> v(new FirstLastNameField);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->SaveCursor();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutofillField* next = NULL;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ParseField(scanner,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 UTF8ToUTF16(autofill::kNameSpecificRe), &v->first_name_) &&
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ParseEmptyLabel(scanner, &next)) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ParseEmptyLabel(scanner, &v->last_name_)) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // There are three name fields; assume that the middle one is a
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // middle initial (it is, at least, on SmithsonianCheckout.html).
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->middle_name_ = next;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->middle_initial_ = true;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {  // only two name fields
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->last_name_ = next;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return v.release();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->Rewind();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstLastNameField* FirstLastNameField::ParseComponentNames(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillScanner* scanner) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FirstLastNameField> v(new FirstLastNameField);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->SaveCursor();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A fair number of pages use the names "fname" and "lname" for naming
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first and last name fields (examples from the test suite:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BESTBUY_COM - Sign In2.html; Crate and Barrel Check Out.html;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dell_checkout1.html).  At least one UK page (The China Shop2.html)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // asks, in stuffy English style, for just initials and a surname,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we match "initials" here (and just fill in a first name there,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // American-style).
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ".*first$" matches fields ending in "first" (example in sample8.html).
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ".*last$" matches fields ending in "last" (example in sample8.html).
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow name fields to appear in any order.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!scanner->IsEnd()) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Skip over any unrelated fields, e.g. "username" or "nickname".
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ParseFieldSpecifics(scanner, UTF8ToUTF16(autofill::kNameIgnoredRe),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            MATCH_DEFAULT | MATCH_SELECT, NULL)) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!v->first_name_ &&
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ParseField(scanner, UTF8ToUTF16(autofill::kFirstNameRe),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &v->first_name_)) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We check for a middle initial before checking for a middle name
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // because at least one page (PC Connection.html) has a field marked
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as both (the label text is "MI" and the element name is
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // "txtmiddlename"); such a field probably actually represents a
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // middle initial.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!v->middle_name_ &&
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ParseField(scanner, UTF8ToUTF16(autofill::kMiddleInitialRe),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &v->middle_name_)) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->middle_initial_ = true;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!v->middle_name_ &&
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ParseField(scanner, UTF8ToUTF16(autofill::kMiddleNameRe),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &v->middle_name_)) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!v->last_name_ &&
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ParseField(scanner, UTF8ToUTF16(autofill::kLastNameRe),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &v->last_name_)) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consider the match to be successful if we detected both first and last name
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fields.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v->first_name_ && v->last_name_)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return v.release();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scanner->Rewind();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstLastNameField* FirstLastNameField::Parse(AutofillScanner* scanner) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FirstLastNameField* field = ParseSpecificName(scanner);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!field)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field = ParseComponentNames(scanner);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return field;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FirstLastNameField::FirstLastNameField()
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : first_name_(NULL),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      middle_name_(NULL),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_name_(NULL),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      middle_initial_(false) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool FirstLastNameField::ClassifyField(ServerFieldTypeMap* map) const {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ok = AddClassification(first_name_, NAME_FIRST, map);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ok = ok && AddClassification(last_name_, NAME_LAST, map);
2133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldType type = middle_initial_ ? NAME_MIDDLE_INITIAL : NAME_MIDDLE;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ok = ok && AddClassification(middle_name_, type, map);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ok;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
219