mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 14:25:49 +00:00
Bug 1882480, add support for recognizing german style addresses where the street name appears first and the number appears after, this allows form fill into separate street and house number fields, r=credential-management-reviewers,dimi
Differential Revision: https://phabricator.services.mozilla.com/D223855
This commit is contained in:
parent
37387040ec
commit
84f9b5725b
@ -15,6 +15,8 @@ support-files = [
|
||||
|
||||
["browser_address_capture_form_removal.js"]
|
||||
|
||||
["browser_address_capture_housenumber.js"]
|
||||
|
||||
["browser_address_capture_page_navigation.js"]
|
||||
|
||||
["browser_address_capture_trimmed_data.js"]
|
||||
|
@ -0,0 +1,97 @@
|
||||
"use strict";
|
||||
|
||||
// This test verifies that the address fillin popup appears correctly when
|
||||
// a house number field exists and that the house number is prepended/appended
|
||||
// to the street name.
|
||||
|
||||
let CAPTURE_FILL_VALUE = {
|
||||
"#given-name": "John",
|
||||
"#family-name": "Doe",
|
||||
"#street-address": "Vassar Street",
|
||||
"#address-housenumber": "32",
|
||||
"#address-level1": "MA",
|
||||
"#address-level2": "Cambridge",
|
||||
"#postal-code": "02139",
|
||||
};
|
||||
|
||||
let CAPTURE_EXPECTED_RECORD_US = {
|
||||
name: "John Doe",
|
||||
"street-address": "32 Vassar Street",
|
||||
"address-level1": "MA",
|
||||
"address-level2": "Cambridge",
|
||||
"postal-code": "02139",
|
||||
country: "US",
|
||||
};
|
||||
|
||||
let CAPTURE_EXPECTED_RECORD_DE = {
|
||||
name: "John Doe",
|
||||
"street-address": "Vassar Street 32",
|
||||
"address-level2": "Cambridge",
|
||||
"postal-code": "02139",
|
||||
country: "DE",
|
||||
};
|
||||
|
||||
add_capture_heuristic_tests([
|
||||
{
|
||||
description: `House number captured US`,
|
||||
region: "US",
|
||||
fixtureData: `
|
||||
<form id="form">
|
||||
<p><label>givenname: <input type="text" id="given-name" autocomplete="given-name" /></label></p>
|
||||
<p><label>familyname: <input type="text" id="family-name" autocomplete="family-name" /></label></p>
|
||||
<p><label>streetAddress: <input type="text" id="street-address" autocomplete="street-address" /></label></p>
|
||||
<p><label>houseNumber: <input type="text" id="address-housenumber" /></label></p>
|
||||
<p><label>addressLevel2: <input type="text" id="address-level2" autocomplete="address-level2" /></label></p>
|
||||
<p><label>addressLevel1: <input type="text" id="address-level1" autocomplete="address-level1" /></label></p>
|
||||
<p><label>postalCode: <input type="text" id="postal-code" autocomplete="postal-code" /></label></p>
|
||||
<input id="submit" type="submit"/>
|
||||
</form>
|
||||
`,
|
||||
expectedResult: [
|
||||
{
|
||||
fields: [
|
||||
{ fieldName: "given-name" },
|
||||
{ fieldName: "family-name" },
|
||||
{ fieldName: "street-address" },
|
||||
{ fieldName: "address-housenumber", reason: "regex-heuristic" },
|
||||
{ fieldName: "address-level2" },
|
||||
{ fieldName: "address-level1" },
|
||||
{ fieldName: "postal-code" },
|
||||
],
|
||||
},
|
||||
],
|
||||
captureFillValue: CAPTURE_FILL_VALUE,
|
||||
captureExpectedRecord: CAPTURE_EXPECTED_RECORD_US,
|
||||
},
|
||||
{
|
||||
description: `House number captured DE`,
|
||||
region: "DE",
|
||||
fixtureData: `
|
||||
<form id="form">
|
||||
<p><label>givenname: <input type="text" id="given-name" autocomplete="given-name" /></label></p>
|
||||
<p><label>familyname: <input type="text" id="family-name" autocomplete="family-name" /></label></p>
|
||||
<p><label>streetAddress: <input type="text" id="street-address" autocomplete="street-address" /></label></p>
|
||||
<p><label>houseNumber: <input type="text" id="address-housenumber" autocomplete="house-number" /></label></p>
|
||||
<p><label>addressLevel2: <input type="text" id="address-level2" autocomplete="address-level2" /></label></p>
|
||||
<p><label>addressLevel1: <input type="text" id="address-level1" autocomplete="address-level1" /></label></p>
|
||||
<p><label>postalCode: <input type="text" id="postal-code" autocomplete="postal-code" /></label></p>
|
||||
<input id="submit" type="submit"/>
|
||||
</form>
|
||||
`,
|
||||
expectedResult: [
|
||||
{
|
||||
fields: [
|
||||
{ fieldName: "given-name" },
|
||||
{ fieldName: "family-name" },
|
||||
{ fieldName: "street-address" },
|
||||
{ fieldName: "address-housenumber", reason: "regex-heuristic" },
|
||||
{ fieldName: "address-level2" },
|
||||
{ fieldName: "address-level1" },
|
||||
{ fieldName: "postal-code" },
|
||||
],
|
||||
},
|
||||
],
|
||||
captureFillValue: CAPTURE_FILL_VALUE,
|
||||
captureExpectedRecord: CAPTURE_EXPECTED_RECORD_DE,
|
||||
},
|
||||
]);
|
@ -1,9 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
const { Region } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/Region.sys.mjs"
|
||||
);
|
||||
|
||||
add_task(async function test_doorhanger_shown_with_lowercase_postalcode() {
|
||||
const initialHomeRegion = Region._home;
|
||||
const initialCurrentRegion = Region._current;
|
||||
|
@ -3,10 +3,6 @@
|
||||
// This test verifies that the address fillin popup appears correctly when
|
||||
// the required fields have been given values.
|
||||
|
||||
const { Region } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/Region.sys.mjs"
|
||||
);
|
||||
|
||||
// Test when all required fields are present.
|
||||
add_task(
|
||||
async function test_doorhanger_shown_when_contain_all_required_fields() {
|
||||
|
@ -1,8 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
const { Region } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/Region.sys.mjs"
|
||||
);
|
||||
add_setup(async function () {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
|
@ -22,6 +22,8 @@ skip-if = [
|
||||
"os == 'mac'",
|
||||
]
|
||||
|
||||
["browser_autofill_address_housenumber.js"]
|
||||
|
||||
["browser_autofill_address_select.js"]
|
||||
|
||||
["browser_autofill_address_select_inexact.js"]
|
||||
|
@ -0,0 +1,174 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_PROFILE_CA = {
|
||||
email: "address_ca@mozilla.org",
|
||||
organization: "Mozilla",
|
||||
country: "CA",
|
||||
"street-address": "160 Main St\nApartment 306",
|
||||
"postal-code": "M5V 1R9",
|
||||
};
|
||||
|
||||
const TEST_PROFILE_DE = {
|
||||
email: "address_de@mozilla.org",
|
||||
organization: "Mozilla",
|
||||
country: "DE",
|
||||
"street-address": "Schlesische Str 999",
|
||||
};
|
||||
|
||||
add_autofill_heuristic_tests([
|
||||
{
|
||||
description: "Test autofill with house number",
|
||||
fixtureData: `<form>
|
||||
<input id="email">
|
||||
<input id="street">
|
||||
<input id="housenumber">
|
||||
<input id="unit">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_CA,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "email", autofill: TEST_PROFILE_CA.email },
|
||||
{
|
||||
fieldName: "address-line1",
|
||||
autofill: "Main St",
|
||||
reason: "update-heuristic",
|
||||
},
|
||||
{ fieldName: "address-housenumber", autofill: "160" },
|
||||
{ fieldName: "address-line2", autofill: "Apartment 306" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: "Test autofill with house number reversed",
|
||||
fixtureData: `<form>
|
||||
<input id="email">
|
||||
<input id="housenumber">
|
||||
<input id="street">
|
||||
<input id="unit">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_CA,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "email", autofill: TEST_PROFILE_CA.email },
|
||||
{ fieldName: "address-housenumber", autofill: "160" },
|
||||
{
|
||||
fieldName: "address-line1",
|
||||
autofill: "Main St",
|
||||
reason: "update-heuristic",
|
||||
},
|
||||
{ fieldName: "address-line2", autofill: "Apartment 306" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: "Test autofill with only house number and street",
|
||||
fixtureData: `<form>
|
||||
<input id="email">
|
||||
<input id="housenumber">
|
||||
<input id="street">
|
||||
<input id="postalcode">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_CA,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "email", autofill: TEST_PROFILE_CA.email },
|
||||
{ fieldName: "address-housenumber", autofill: "160" },
|
||||
{
|
||||
fieldName: "street-address",
|
||||
autofill: "Main St",
|
||||
},
|
||||
{ fieldName: "postal-code", autofill: "M5V 1R9" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: "Test autofill with german house number",
|
||||
fixtureData: `<form>
|
||||
<input id="organization">
|
||||
<input id="strasse">
|
||||
<input id="haus">
|
||||
<input id="adresszusatz">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_DE,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "organization", autofill: TEST_PROFILE_DE.organization },
|
||||
{ fieldName: "address-line1", autofill: "Schlesische Str" },
|
||||
{ fieldName: "address-housenumber", autofill: "999" },
|
||||
{ fieldName: "address-line2", autofill: "" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: "Test autofill with street and house number as one field",
|
||||
fixtureData: `<form>
|
||||
<input id="email">
|
||||
<input id="street-housenumber">
|
||||
<input id="unit">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_CA,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "email", autofill: TEST_PROFILE_CA.email },
|
||||
{
|
||||
fieldName: "address-line1",
|
||||
autofill: "160 Main St",
|
||||
},
|
||||
{ fieldName: "address-line2", autofill: "Apartment 306" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description:
|
||||
"Test autofill with german street and house number as one field",
|
||||
fixtureData: `<form>
|
||||
<input id="email">
|
||||
<input id="strasse_haus">
|
||||
<input id="unit">
|
||||
</form>`,
|
||||
profile: TEST_PROFILE_DE,
|
||||
expectedResult: [
|
||||
{
|
||||
default: {
|
||||
reason: "regex-heuristic",
|
||||
},
|
||||
fields: [
|
||||
{ fieldName: "email", autofill: TEST_PROFILE_DE.email },
|
||||
{
|
||||
fieldName: "address-line1",
|
||||
autofill: "Schlesische Str 999",
|
||||
},
|
||||
{ fieldName: "address-line2", autofill: "" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
@ -4,10 +4,6 @@ const { FormAutofill } = ChromeUtils.importESModule(
|
||||
"resource://autofill/FormAutofill.sys.mjs"
|
||||
);
|
||||
|
||||
ChromeUtils.defineESModuleGetters(this, {
|
||||
Region: "resource://gre/modules/Region.sys.mjs",
|
||||
});
|
||||
|
||||
requestLongerTimeout(6);
|
||||
|
||||
add_setup(async function () {
|
||||
|
@ -33,6 +33,10 @@ const { FormAutofillUtils } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/shared/FormAutofillUtils.sys.mjs"
|
||||
);
|
||||
|
||||
const { Region } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/Region.sys.mjs"
|
||||
);
|
||||
|
||||
let { sinon } = ChromeUtils.importESModule(
|
||||
"resource://testing-common/Sinon.sys.mjs"
|
||||
);
|
||||
@ -1379,6 +1383,8 @@ async function triggerCapture(browser, submitButtonSelector, fillSelectors) {
|
||||
* Array of preferences to be set before running the test.
|
||||
* @param {object} patterns.profile
|
||||
* The profile to autofill. This is required only when running autofill test
|
||||
* @param {Array} patterns.region
|
||||
* Region to assign before running the test
|
||||
* @param {Array} patterns.expectedResult
|
||||
* The expected result of this heuristic test. See below for detailed explanation
|
||||
* @param {Function} patterns.onTestComplete
|
||||
@ -1492,6 +1498,15 @@ async function add_heuristic_tests(
|
||||
|
||||
info(`Test "${testPattern.description}"`);
|
||||
|
||||
let regionInfo = null;
|
||||
if (testPattern.region) {
|
||||
regionInfo = { home: Region._home, current: Region._current };
|
||||
|
||||
const region = testPattern.region;
|
||||
Region._setCurrentRegion(region);
|
||||
Region._setHomeRegion(region);
|
||||
}
|
||||
|
||||
if (testPattern.prefs) {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: testPattern.prefs,
|
||||
@ -1596,6 +1611,11 @@ async function add_heuristic_tests(
|
||||
if (testPattern.prefs) {
|
||||
await SpecialPowers.popPrefEnv();
|
||||
}
|
||||
|
||||
if (regionInfo) {
|
||||
Region._setCurrentRegion(regionInfo.home);
|
||||
Region._setHomeRegion(regionInfo.current);
|
||||
}
|
||||
}
|
||||
|
||||
const only = patterns.find(pattern => !!pattern.only);
|
||||
|
@ -166,4 +166,25 @@ add_heuristic_tests([
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: "address field matches house number",
|
||||
fixtureData: `
|
||||
<html><body><form>
|
||||
<label for="strasse">Street</label>
|
||||
<input id="strasse">
|
||||
<label for="haus">Haus</label>
|
||||
<input id="haus">
|
||||
<label for="adresszusatz"></label>
|
||||
<input id="adresszusatz">
|
||||
</form></body></html>`,
|
||||
expectedResult: [
|
||||
{
|
||||
fields: [
|
||||
{ fieldName: "address-line1", reason: "update-heuristic" },
|
||||
{ fieldName: "address-housenumber", reason: "regex-heuristic" },
|
||||
{ fieldName: "address-line2", reason: "regex-heuristic" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
@ -43,7 +43,6 @@ add_task(async function test_parseStreetAddress() {
|
||||
|
||||
const options = {
|
||||
trim: true,
|
||||
ignore_case: true,
|
||||
};
|
||||
|
||||
const expectedSN = AddressParser.normalizeString(expected[0], options);
|
||||
|
@ -1597,6 +1597,29 @@ export class AddressesBase extends AutofillRecords {
|
||||
}
|
||||
|
||||
_normalizeAddressFields(address) {
|
||||
if (address["address-housenumber"]) {
|
||||
let streetField = "";
|
||||
if (address["address-line1"]) {
|
||||
streetField = "address-line1";
|
||||
} else if (address["street-address"]) {
|
||||
streetField = "street-address";
|
||||
}
|
||||
if (streetField) {
|
||||
let region = address.country || FormAutofill.DEFAULT_REGION;
|
||||
let reversed = lazy.FormAutofillUtils.getAddressReversed(region);
|
||||
|
||||
if (reversed) {
|
||||
address[streetField] =
|
||||
address[streetField] + " " + address["address-housenumber"];
|
||||
} else {
|
||||
address[streetField] =
|
||||
address["address-housenumber"] + " " + address[streetField];
|
||||
}
|
||||
}
|
||||
|
||||
delete address["address-housenumber"];
|
||||
}
|
||||
|
||||
if (AddressRecord.STREET_ADDRESS_COMPONENTS.some(c => !!address[c])) {
|
||||
// Treat "street-address" as "address-line1" if it contains only one line
|
||||
// and "address-line1" is omitted.
|
||||
|
@ -254,6 +254,7 @@ export const AddressMetaDataExtension = {
|
||||
},
|
||||
"data/DE": {
|
||||
alpha_3_code: "DEU",
|
||||
address_reversed: true,
|
||||
},
|
||||
"data/GH": {
|
||||
alpha_3_code: "GHA",
|
||||
|
@ -152,9 +152,21 @@ export class StructuredStreetAddress {
|
||||
#apartment_number = null;
|
||||
#floor_number = null;
|
||||
|
||||
constructor(street_number, street_name, apartment_number, floor_number) {
|
||||
this.#street_number = street_number?.toString();
|
||||
this.#street_name = street_name?.toString();
|
||||
// If name_first is true, then the street name is given first,
|
||||
// otherwise the street number is given first.
|
||||
constructor(
|
||||
name_first,
|
||||
street_number,
|
||||
street_name,
|
||||
apartment_number,
|
||||
floor_number
|
||||
) {
|
||||
this.#street_number = name_first
|
||||
? street_name?.toString()
|
||||
: street_number?.toString();
|
||||
this.#street_name = name_first
|
||||
? street_number?.toString()
|
||||
: street_name?.toString();
|
||||
this.#apartment_number = apartment_number?.toString();
|
||||
this.#floor_number = floor_number?.toString();
|
||||
}
|
||||
@ -208,21 +220,40 @@ export class AddressParser {
|
||||
new FloorNumberRegExp(separator, true),
|
||||
];
|
||||
|
||||
return AddressParser.parse(address, regexpes)
|
||||
? new StructuredStreetAddress(...regexpes.map(regexp => regexp.match))
|
||||
: null;
|
||||
if (AddressParser.parse(address, regexpes)) {
|
||||
return new StructuredStreetAddress(
|
||||
false,
|
||||
...regexpes.map(regexp => regexp.match)
|
||||
);
|
||||
}
|
||||
|
||||
// Swap the street number and name.
|
||||
const regexpesReverse = [
|
||||
regexpes[1],
|
||||
regexpes[0],
|
||||
regexpes[2],
|
||||
regexpes[3],
|
||||
];
|
||||
|
||||
if (AddressParser.parse(address, regexpesReverse)) {
|
||||
return new StructuredStreetAddress(
|
||||
true,
|
||||
...regexpesReverse.map(regexp => regexp.match)
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static parse(address, regexpes) {
|
||||
const options = {
|
||||
trim: true,
|
||||
merge_whitespace: true,
|
||||
ignore_case: true,
|
||||
};
|
||||
address = AddressParser.normalizeString(address, options);
|
||||
|
||||
const match = address.match(
|
||||
new RegExp(`^(${regexpes.map(regexp => regexp.capture).join("")})$`)
|
||||
new RegExp(`^(${regexpes.map(regexp => regexp.capture).join("")})$`, "i")
|
||||
);
|
||||
if (!match) {
|
||||
return null;
|
||||
|
@ -7,6 +7,7 @@ import { FormAutofillUtils } from "resource://gre/modules/shared/FormAutofillUti
|
||||
|
||||
const lazy = {};
|
||||
ChromeUtils.defineESModuleGetters(lazy, {
|
||||
AddressParser: "resource://gre/modules/shared/AddressParser.sys.mjs",
|
||||
AutofillFormFactory:
|
||||
"resource://gre/modules/shared/AutofillFormFactory.sys.mjs",
|
||||
CreditCard: "resource://gre/modules/CreditCard.sys.mjs",
|
||||
@ -823,6 +824,21 @@ export class FormAutofillHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If a house number field exists, split the address up into house number
|
||||
// and street name.
|
||||
if (this.getFieldDetailByName("address-housenumber")) {
|
||||
let address = lazy.AddressParser.parseStreetAddress(
|
||||
profile["street-address"]
|
||||
);
|
||||
if (address) {
|
||||
profile["address-housenumber"] = address.street_number;
|
||||
let field = this.getFieldDetailByName("address-line1")
|
||||
? "address-line1"
|
||||
: "street-address";
|
||||
profile[field] = address.street_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -296,13 +296,28 @@ export const FormAutofillHeuristics = {
|
||||
"address-line3",
|
||||
];
|
||||
|
||||
let houseNumberFields = 0;
|
||||
|
||||
// We need to build a list of the address fields. A list of the indicies
|
||||
// is also needed as the fields with a given name can change positions
|
||||
// during the update.
|
||||
const fields = [];
|
||||
const fieldIndicies = [];
|
||||
for (let idx = scanner.parsingIndex; !scanner.parsingFinished; idx++) {
|
||||
const detail = scanner.getFieldDetailByIndex(idx);
|
||||
|
||||
// Skip over any house number fields. There should only be zero or one,
|
||||
// but we'll skip over them all anyway.
|
||||
if (detail?.fieldName == "address-housenumber") {
|
||||
houseNumberFields++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!INTERESTED_FIELDS.includes(detail?.fieldName)) {
|
||||
break;
|
||||
}
|
||||
fields.push(detail);
|
||||
fieldIndicies.push(idx);
|
||||
}
|
||||
|
||||
if (!fields.length) {
|
||||
@ -315,7 +330,7 @@ export const FormAutofillHeuristics = {
|
||||
fields[0].reason != "autocomplete" &&
|
||||
["address-line2", "address-line3"].includes(fields[0].fieldName)
|
||||
) {
|
||||
scanner.updateFieldName(scanner.parsingIndex, "address-line1");
|
||||
scanner.updateFieldName(fieldIndicies[0], "address-line1");
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
@ -325,27 +340,22 @@ export const FormAutofillHeuristics = {
|
||||
(fields[1].fieldName == "address-line2" ||
|
||||
fields[1].reason != "autocomplete")
|
||||
) {
|
||||
scanner.updateFieldName(
|
||||
scanner.parsingIndex,
|
||||
"address-line1",
|
||||
true
|
||||
);
|
||||
scanner.updateFieldName(fieldIndicies[0], "address-line1", true);
|
||||
}
|
||||
} else {
|
||||
scanner.updateFieldName(scanner.parsingIndex, "address-line1");
|
||||
scanner.updateFieldName(fieldIndicies[0], "address-line1");
|
||||
}
|
||||
|
||||
scanner.updateFieldName(scanner.parsingIndex + 1, "address-line2");
|
||||
scanner.updateFieldName(fieldIndicies[1], "address-line2");
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
scanner.updateFieldName(scanner.parsingIndex, "address-line1");
|
||||
scanner.updateFieldName(scanner.parsingIndex + 1, "address-line2");
|
||||
scanner.updateFieldName(scanner.parsingIndex + 2, "address-line3");
|
||||
scanner.updateFieldName(fieldIndicies[0], "address-line1");
|
||||
scanner.updateFieldName(fieldIndicies[1], "address-line2");
|
||||
scanner.updateFieldName(fieldIndicies[2], "address-line3");
|
||||
break;
|
||||
}
|
||||
|
||||
scanner.parsingIndex += fields.length;
|
||||
scanner.parsingIndex += fields.length + houseNumberFields;
|
||||
return true;
|
||||
},
|
||||
|
||||
|
@ -135,6 +135,10 @@ FormAutofillUtils = {
|
||||
"address-line3": "address",
|
||||
"address-level1": "address",
|
||||
"address-level2": "address",
|
||||
// DE addresses are often split into street name and house number;
|
||||
// combined they form address-line1
|
||||
"address-streetname": "address",
|
||||
"address-housenumber": "address",
|
||||
"postal-code": "address",
|
||||
country: "address",
|
||||
"country-name": "address",
|
||||
@ -380,6 +384,15 @@ FormAutofillUtils = {
|
||||
return addressParts.join(this.getAddressSeparator());
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns false if an address is written <number> <street>
|
||||
* and true if an address is written <street> <number>. In the future, this
|
||||
* can be expanded to format an address
|
||||
*/
|
||||
getAddressReversed(region) {
|
||||
return this.getCountryAddressData(region).address_reversed;
|
||||
},
|
||||
|
||||
/**
|
||||
* In-place concatenate tel-related components into a single "tel" field and
|
||||
* delete unnecessary fields.
|
||||
|
@ -10,6 +10,7 @@ export const HeuristicsRegExp = {
|
||||
tel: undefined,
|
||||
"street-address": undefined,
|
||||
"address-line1": undefined,
|
||||
"address-housenumber": undefined,
|
||||
"address-line2": undefined,
|
||||
"address-line3": undefined,
|
||||
"address-level2": undefined,
|
||||
@ -388,7 +389,7 @@ export const HeuristicsRegExp = {
|
||||
"address-line1":
|
||||
"^address$|address[_-]?line(one)?|address1|addr1|street" +
|
||||
"|(?:shipping|billing)address$" +
|
||||
"|strasse|straße|hausnummer|housenumber" + // de-DE
|
||||
"|strasse|straße" + // de-DE
|
||||
"|house.?name" + // en-GB
|
||||
"|direccion|dirección" + // es
|
||||
"|adresse" + // fr-FR
|
||||
@ -466,6 +467,9 @@ export const HeuristicsRegExp = {
|
||||
"|((\\b|_|\\*)(eyalet|[şs]ehir|[İii̇]l(imiz)?|kent)(\\b|_|\\*))" + // tr
|
||||
"|^시[·・]?도", // ko-KR
|
||||
|
||||
"address-housenumber":
|
||||
"housenumber|hausnummer|haus",
|
||||
|
||||
"postal-code":
|
||||
"zip|postal|post.*code|pcode" +
|
||||
"|pin.?code" + // en-IN
|
||||
|
Loading…
x
Reference in New Issue
Block a user