Index: chrome/browser/autofill/address_field.cc |
diff --git a/chrome/browser/autofill/address_field.cc b/chrome/browser/autofill/address_field.cc |
index 4624fa515ce2e8279e9cb88e09c9506e71942716..437d413ebf3c1b6caf7e8c7d68acdc6a5a23751f 100644 |
--- a/chrome/browser/autofill/address_field.cc |
+++ b/chrome/browser/autofill/address_field.cc |
@@ -13,6 +13,8 @@ |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/autofill/autofill_field.h" |
#include "chrome/browser/autofill/autofill_scanner.h" |
+#include "chrome/browser/autofill/email_field.h" |
+#include "chrome/browser/autofill/phone_field.h" |
#include "grit/autofill_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
@@ -78,6 +80,22 @@ AddressField* AddressField::Parse(AutofillScanner* scanner, bool is_ecml) { |
// Allow address fields to appear in any order. |
while (!scanner->IsEnd()) { |
+ // Every loop, we have to parse email and phone, and if we find it, we |
+ // break the loop even while continuing address. Because we want to give |
+ // email and phone more priority than address. We have to rewind |scanner| |
+ // position after the email and phone parsing. |
+ size_t cursor_position = scanner->SaveCursor(); |
+ bool is_email = EmailField::Parse(scanner, is_ecml); |
+ scanner->RewindTo(cursor_position); |
+ if (is_email) |
+ break; |
+ |
+ cursor_position = scanner->SaveCursor(); |
+ bool is_phone = PhoneField::Parse(scanner, is_ecml); |
+ scanner->RewindTo(cursor_position); |
+ if (is_phone) |
+ break; |
Ilya Sherman
2011/05/14 06:59:12
David and I discussed this a bit offline today --
Ilya Sherman
2011/05/14 07:01:33
Whoops, didn't mean to send this comment out -- wa
honten.org
2011/05/14 07:41:20
I see, it might be better idea.
But, at first, I
|
+ |
if (ParseCompany(scanner, is_ecml, address_field.get()) || |
ParseAddressLines(scanner, is_ecml, address_field.get()) || |
ParseCity(scanner, is_ecml, address_field.get()) || |
@@ -246,7 +264,8 @@ bool AddressField::ParseCountry(AutofillScanner* scanner, |
else |
pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_COUNTRY_RE); |
- return ParseText(scanner, pattern, &address_field->country_); |
+ return ParseText(scanner, FormField::Pattern(pattern, true), |
+ &address_field->country_); |
} |
// static |
@@ -315,7 +334,8 @@ bool AddressField::ParseCity(AutofillScanner* scanner, |
else |
pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CITY_RE); |
- return ParseText(scanner, pattern, &address_field->city_); |
+ return ParseText(scanner, FormField::Pattern(pattern, true), |
+ &address_field->city_); |
} |
// static |
@@ -331,7 +351,8 @@ bool AddressField::ParseState(AutofillScanner* scanner, |
else |
pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_STATE_RE); |
- return ParseText(scanner, pattern, &address_field->state_); |
+ return ParseText(scanner, FormField::Pattern(pattern, true), |
+ &address_field->state_); |
} |
AddressType AddressField::AddressTypeFromText(const string16 &text) { |