| Index: components/autofill/browser/name_field.cc
|
| diff --git a/components/autofill/browser/name_field.cc b/components/autofill/browser/name_field.cc
|
| deleted file mode 100644
|
| index 60c5bf27bff1fde77cc3a085fba7c6a9e4a1b6bd..0000000000000000000000000000000000000000
|
| --- a/components/autofill/browser/name_field.cc
|
| +++ /dev/null
|
| @@ -1,217 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "components/autofill/browser/name_field.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "components/autofill/browser/autofill_regex_constants.h"
|
| -#include "components/autofill/browser/autofill_scanner.h"
|
| -#include "components/autofill/browser/autofill_type.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -
|
| -namespace autofill {
|
| -namespace {
|
| -
|
| -// A form field that can parse a full name field.
|
| -class FullNameField : public NameField {
|
| - public:
|
| - static FullNameField* Parse(AutofillScanner* scanner);
|
| -
|
| - protected:
|
| - // FormField:
|
| - virtual bool ClassifyField(FieldTypeMap* map) const OVERRIDE;
|
| -
|
| - private:
|
| - explicit FullNameField(const AutofillField* field);
|
| -
|
| - const AutofillField* field_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FullNameField);
|
| -};
|
| -
|
| -// A form field that can parse a first and last name field.
|
| -class FirstLastNameField : public NameField {
|
| - public:
|
| - static FirstLastNameField* ParseSpecificName(AutofillScanner* scanner);
|
| - static FirstLastNameField* ParseComponentNames(AutofillScanner* scanner);
|
| - static FirstLastNameField* Parse(AutofillScanner* scanner);
|
| -
|
| - protected:
|
| - // FormField:
|
| - virtual bool ClassifyField(FieldTypeMap* map) const OVERRIDE;
|
| -
|
| - private:
|
| - FirstLastNameField();
|
| -
|
| - const AutofillField* first_name_;
|
| - const AutofillField* middle_name_; // Optional.
|
| - const AutofillField* last_name_;
|
| - bool middle_initial_; // True if middle_name_ is a middle initial.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FirstLastNameField);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -FormField* NameField::Parse(AutofillScanner* scanner) {
|
| - if (scanner->IsEnd())
|
| - return NULL;
|
| -
|
| - // Try FirstLastNameField first since it's more specific.
|
| - NameField* field = FirstLastNameField::Parse(scanner);
|
| - if (!field)
|
| - field = FullNameField::Parse(scanner);
|
| - return field;
|
| -}
|
| -
|
| -// This is overriden in concrete subclasses.
|
| -bool NameField::ClassifyField(FieldTypeMap* map) const {
|
| - return false;
|
| -}
|
| -
|
| -FullNameField* FullNameField::Parse(AutofillScanner* scanner) {
|
| - // Exclude e.g. "username" or "nickname" fields.
|
| - scanner->SaveCursor();
|
| - bool should_ignore = ParseField(scanner,
|
| - UTF8ToUTF16(autofill::kNameIgnoredRe), NULL);
|
| - scanner->Rewind();
|
| - if (should_ignore)
|
| - return NULL;
|
| -
|
| - // Searching for any label containing the word "name" is too general;
|
| - // for example, Travelocity_Edit travel profile.html contains a field
|
| - // "Travel Profile Name".
|
| - const AutofillField* field = NULL;
|
| - if (ParseField(scanner, UTF8ToUTF16(autofill::kNameRe), &field))
|
| - return new FullNameField(field);
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -bool FullNameField::ClassifyField(FieldTypeMap* map) const {
|
| - return AddClassification(field_, NAME_FULL, map);
|
| -}
|
| -
|
| -FullNameField::FullNameField(const AutofillField* field)
|
| - : field_(field) {
|
| -}
|
| -
|
| -FirstLastNameField* FirstLastNameField::ParseSpecificName(
|
| - AutofillScanner* scanner) {
|
| - // Some pages (e.g. Overstock_comBilling.html, SmithsonianCheckout.html)
|
| - // have the label "Name" followed by two or three text fields.
|
| - scoped_ptr<FirstLastNameField> v(new FirstLastNameField);
|
| - scanner->SaveCursor();
|
| -
|
| - const AutofillField* next = NULL;
|
| - if (ParseField(scanner,
|
| - UTF8ToUTF16(autofill::kNameSpecificRe), &v->first_name_) &&
|
| - ParseEmptyLabel(scanner, &next)) {
|
| - if (ParseEmptyLabel(scanner, &v->last_name_)) {
|
| - // There are three name fields; assume that the middle one is a
|
| - // middle initial (it is, at least, on SmithsonianCheckout.html).
|
| - v->middle_name_ = next;
|
| - v->middle_initial_ = true;
|
| - } else { // only two name fields
|
| - v->last_name_ = next;
|
| - }
|
| -
|
| - return v.release();
|
| - }
|
| -
|
| - scanner->Rewind();
|
| - return NULL;
|
| -}
|
| -
|
| -FirstLastNameField* FirstLastNameField::ParseComponentNames(
|
| - AutofillScanner* scanner) {
|
| - scoped_ptr<FirstLastNameField> v(new FirstLastNameField);
|
| - scanner->SaveCursor();
|
| -
|
| - // A fair number of pages use the names "fname" and "lname" for naming
|
| - // first and last name fields (examples from the test suite:
|
| - // BESTBUY_COM - Sign In2.html; Crate and Barrel Check Out.html;
|
| - // dell_checkout1.html). At least one UK page (The China Shop2.html)
|
| - // asks, in stuffy English style, for just initials and a surname,
|
| - // so we match "initials" here (and just fill in a first name there,
|
| - // American-style).
|
| - // The ".*first$" matches fields ending in "first" (example in sample8.html).
|
| - // The ".*last$" matches fields ending in "last" (example in sample8.html).
|
| -
|
| - // Allow name fields to appear in any order.
|
| - while (!scanner->IsEnd()) {
|
| - // Skip over any unrelated fields, e.g. "username" or "nickname".
|
| - if (ParseFieldSpecifics(scanner, UTF8ToUTF16(autofill::kNameIgnoredRe),
|
| - MATCH_DEFAULT | MATCH_SELECT, NULL)) {
|
| - continue;
|
| - }
|
| -
|
| - if (!v->first_name_ &&
|
| - ParseField(scanner, UTF8ToUTF16(autofill::kFirstNameRe),
|
| - &v->first_name_)) {
|
| - continue;
|
| - }
|
| -
|
| - // We check for a middle initial before checking for a middle name
|
| - // because at least one page (PC Connection.html) has a field marked
|
| - // as both (the label text is "MI" and the element name is
|
| - // "txtmiddlename"); such a field probably actually represents a
|
| - // middle initial.
|
| - if (!v->middle_name_ &&
|
| - ParseField(scanner, UTF8ToUTF16(autofill::kMiddleInitialRe),
|
| - &v->middle_name_)) {
|
| - v->middle_initial_ = true;
|
| - continue;
|
| - }
|
| -
|
| - if (!v->middle_name_ &&
|
| - ParseField(scanner, UTF8ToUTF16(autofill::kMiddleNameRe),
|
| - &v->middle_name_)) {
|
| - continue;
|
| - }
|
| -
|
| - if (!v->last_name_ &&
|
| - ParseField(scanner, UTF8ToUTF16(autofill::kLastNameRe),
|
| - &v->last_name_)) {
|
| - continue;
|
| - }
|
| -
|
| - break;
|
| - }
|
| -
|
| - // Consider the match to be successful if we detected both first and last name
|
| - // fields.
|
| - if (v->first_name_ && v->last_name_)
|
| - return v.release();
|
| -
|
| - scanner->Rewind();
|
| - return NULL;
|
| -}
|
| -
|
| -FirstLastNameField* FirstLastNameField::Parse(AutofillScanner* scanner) {
|
| - FirstLastNameField* field = ParseSpecificName(scanner);
|
| - if (!field)
|
| - field = ParseComponentNames(scanner);
|
| - return field;
|
| -}
|
| -
|
| -FirstLastNameField::FirstLastNameField()
|
| - : first_name_(NULL),
|
| - middle_name_(NULL),
|
| - last_name_(NULL),
|
| - middle_initial_(false) {
|
| -}
|
| -
|
| -bool FirstLastNameField::ClassifyField(FieldTypeMap* map) const {
|
| - bool ok = AddClassification(first_name_, NAME_FIRST, map);
|
| - ok = ok && AddClassification(last_name_, NAME_LAST, map);
|
| - AutofillFieldType type = middle_initial_ ? NAME_MIDDLE_INITIAL : NAME_MIDDLE;
|
| - ok = ok && AddClassification(middle_name_, type, map);
|
| - return ok;
|
| -}
|
| -
|
| -} // namespace autofill
|
|
|