1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// 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.
#ifndef CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_
#define CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_
#pragma once
#include <vector>
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/autofill/autofill_type.h"
#include "chrome/browser/autofill/form_field.h"
#include "chrome/browser/autofill/phone_number.h"
class AutofillField;
class AutofillScanner;
// A phone number in one of the following formats:
// - area code, prefix, suffix
// - area code, number
// - number
class PhoneField : public FormField {
public:
virtual ~PhoneField();
static FormField* Parse(AutofillScanner* scanner);
protected:
// FormField:
virtual bool ClassifyField(FieldTypeMap* map) const OVERRIDE;
private:
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ParseOneLinePhone);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ParseTwoLinePhone);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ThreePartPhoneNumber);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix2);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ParseOneLineFax);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ParseTwoLineFax);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, ThreePartFaxNumberPrefixSuffix);
FRIEND_TEST_ALL_PREFIXES(PhoneFieldTest, CountryAndCityAndPhoneNumber);
PhoneField();
enum PhoneType {
PHONE_TYPE_FIRST = 0,
HOME_PHONE = PHONE_TYPE_FIRST,
FAX_PHONE,
// Must be last.
PHONE_TYPE_MAX,
};
// Some field names are different for phone and fax.
string16 GetCountryRegex() const;
// This string includes all area code separators, including NoText.
string16 GetAreaRegex() const;
// Separator of the area code in the case fields are formatted without
// any text indicating what fields are (e.g. field1 "(" field2 ")" field3 "-"
// field4 means Country Code, Area Code, Prefix, Suffix)
string16 GetAreaNoTextRegex() const;
string16 GetPhoneRegex() const;
string16 GetPrefixSeparatorRegex() const;
string16 GetPrefixRegex() const;
string16 GetSuffixSeparatorRegex() const;
string16 GetSuffixRegex() const;
string16 GetExtensionRegex() const;
// This is for easy description of the possible parsing paths of the phone
// fields.
enum RegexType {
REGEX_COUNTRY,
REGEX_AREA,
REGEX_AREA_NOTEXT,
REGEX_PHONE,
REGEX_PREFIX_SEPARATOR,
REGEX_PREFIX,
REGEX_SUFFIX_SEPARATOR,
REGEX_SUFFIX,
REGEX_EXTENSION,
// Separates regexps in grammar.
REGEX_SEPARATOR,
};
string16 GetRegExp(RegexType regex_id) const;
// |field| - field to fill up on successful parsing.
// |iter| - in/out. Form field iterator, points to the first field that is
// attempted to be parsed. If parsing successful, points to the first field
// after parsed fields.
// |regular_phone| - true if the parsed phone is a HOME phone, false
// otherwise.
static bool ParseInternal(PhoneField* field,
AutofillScanner* scanner,
bool regular_phone);
void SetPhoneType(PhoneType phone_type);
// Field types are different as well, so we create a temporary phone number,
// to get relevant field types.
scoped_ptr<PhoneNumber> number_;
PhoneType phone_type_;
// Parsed fields.
enum PhonePart {
FIELD_NONE = -1,
FIELD_COUNTRY_CODE,
FIELD_AREA_CODE,
FIELD_PHONE,
FIELD_SUFFIX,
FIELD_EXTENSION,
FIELD_MAX,
};
// FIELD_PHONE is always present; holds suffix if prefix is present.
// The rest could be NULL.
const AutofillField* parsed_phone_fields_[FIELD_MAX];
static struct Parser {
RegexType regex; // Field matching reg-ex.
PhonePart phone_part; // Index of the field.
int max_size; // Max size of the field to match. 0 means any.
} phone_field_grammars_[];
DISALLOW_COPY_AND_ASSIGN(PhoneField);
};
#endif // CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_
|