blob: 62c21e13b39a069547b3a084980b97769395229a [file] [log] [blame]
// Copyright (c) 2009 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 "chrome/browser/autofill/phone_field.h"
#ifdef ANDROID
#include "app/l10n_util.h"
#endif
#include "base/logging.h"
#include "base/scoped_ptr.h"
#include "base/string16.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/autofill/autofill_field.h"
// static
PhoneField* PhoneField::Parse(std::vector<AutoFillField*>::const_iterator* iter,
bool is_ecml) {
DCHECK(iter);
if (!iter)
return NULL;
if (is_ecml)
return ParseECML(iter);
std::vector<AutoFillField*>::const_iterator q = *iter;
AutoFillField* phone = NULL;
AutoFillField* phone2 = NULL;
AutoFillField* phone3 = NULL;
bool area_code; // true if we've parsed an area code field.
// Some pages, such as BloomingdalesShipping.html, have a field labeled
// "Area Code and Phone"; we want to parse this as a phone number field so
// we look for "phone" before we look for "area code".
if (ParseText(&q, l10n_util::GetStringUTF16(IDS_AUTOFILL_PHONE_RE), &phone)) {
area_code = false;
} else {
if (!ParseText(&q,
l10n_util::GetStringUTF16(IDS_AUTOFILL_AREA_CODE_RE),
&phone))
return NULL;
area_code = true;
ParseText(&q, l10n_util::GetStringUTF16(IDS_AUTOFILL_PHONE_RE), &phone2);
}
// Sometimes phone number fields are separated by "-" (e.g. test page
// Crate and Barrel Check Out.html). Also, area codes are sometimes
// surrounded by parentheses, so a ")" may appear after the area code field.
//
// We used to match "tel" here, which we've seen in field names (e.g. on
// Newegg2.html), but that's too general: some pages (e.g.
// uk/Furniture123-1.html) have several phone numbers in succession and we
// don't want those to be parsed as components of a single phone number.
if (phone2 == NULL)
ParseText(&q,
l10n_util::GetStringUTF16(IDS_AUTOFILL_PHONE_PREFIX_RE),
&phone2);
// Look for a third text box.
if (phone2)
ParseText(&q,
l10n_util::GetStringUTF16(IDS_AUTOFILL_PHONE_SUFFIX_RE),
&phone3);
// Now we have one, two, or three phone number text fields. Package them
// up into a PhoneField object.
scoped_ptr<PhoneField> phone_field(new PhoneField);
if (phone2 == NULL) { // only one field
if (area_code) // it's an area code
return NULL; // doesn't make sense
phone_field->phone_ = phone;
} else {
phone_field->area_code_ = phone;
if (phone3 == NULL) { // two fields
phone_field->phone_ = phone2;
} else { // three boxes: area code, prefix and suffix
phone_field->prefix_ = phone2;
phone_field->phone_ = phone3;
}
}
// Now look for an extension.
ParseText(&q,
l10n_util::GetStringUTF16(IDS_AUTOFILL_PHONE_EXTENSION_RE),
&phone_field->extension_);
*iter = q;
return phone_field.release();
}
// static
PhoneField* PhoneField::ParseECML(
std::vector<AutoFillField*>::const_iterator* iter) {
string16 pattern(GetEcmlPattern(kEcmlShipToPhone, kEcmlBillToPhone, '|'));
AutoFillField* field;
if (ParseText(iter, pattern, &field)) {
PhoneField* phone_field = new PhoneField();
phone_field->phone_ = field;
return phone_field;
}
return NULL;
}
bool PhoneField::GetFieldInfo(FieldTypeMap* field_type_map) const {
bool ok;
if (area_code_ != NULL) {
ok = Add(field_type_map, area_code_, AutoFillType(PHONE_HOME_CITY_CODE));
DCHECK(ok);
if (prefix_ != NULL) {
// We tag the prefix as PHONE_HOME_NUMBER, then when filling the form
// we fill only the prefix depending on the size of the input field.
ok = ok && Add(field_type_map,
prefix_,
AutoFillType(PHONE_HOME_NUMBER));
DCHECK(ok);
// We tag the suffix as PHONE_HOME_NUMBER, then when filling the form
// we fill only the suffix depending on the size of the input field.
ok = ok && Add(field_type_map,
phone_,
AutoFillType(PHONE_HOME_NUMBER));
DCHECK(ok);
} else {
ok = ok && Add(field_type_map, phone_, AutoFillType(PHONE_HOME_NUMBER));
DCHECK(ok);
}
} else {
ok = Add(field_type_map, phone_, AutoFillType(PHONE_HOME_WHOLE_NUMBER));
DCHECK(ok);
}
return ok;
}
PhoneField::PhoneField()
: phone_(NULL),
area_code_(NULL),
prefix_(NULL),
extension_(NULL) {
}