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