Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,8 @@ export const AddressMetaDataExtension = {
},
"data/JP": {
alpha_3_code: "JPN",
fmt: "〒%Z%n%S%C%n%A%n%O%n%N",
require: "ACSZ",
},
"data/JE": {
alpha_3_code: "JEY",
Expand Down Expand Up @@ -474,6 +476,7 @@ export const AddressMetaDataExtension = {
},
"data/NL": {
alpha_3_code: "NLD",
address_reversed: true,
},
"data/NC": {
alpha_3_code: "NCL",
Expand Down
36 changes: 36 additions & 0 deletions firefox-ios/Client/Assets/CC_Script/AddressParser.sys.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -313,4 +313,40 @@ export class AddressParser {
static mergeWhitespace(s) {
return s?.replace(/\s{2,}/g, " ");
}

// This is quite fragile, but handles a number of basic cases. This is intended
// to split the street number suffix from the street number. For example:
// 35B will be split into number=35,suffix=B
// Returns an array with [housenumber, suffix]
static parseHouseSuffix(address, structuredAddress) {
let streetNumber = structuredAddress?.street_number;
if (!streetNumber) {
return null;
}

let numberIndex = address.indexOf(streetNumber);
if (numberIndex < 0) {
return [streetNumber];
}

let match = streetNumber.match(/^(\d+)(\w?)/);
if (!match) {
return [streetNumber];
}

let suffix;
let result = [match[1]];
// If the house number is after the street, include the rest of the address
// as part of the suffix, otherwise just include the suffix on the number.
if (numberIndex > structuredAddress?.street_name.length) {
suffix = address.substring(numberIndex + match[1].length).trim();
} else {
suffix = match[2];
}
if (suffix) {
result.push(suffix.replace("\n", " "));
}

return result;
}
}
20 changes: 20 additions & 0 deletions firefox-ios/Client/Assets/CC_Script/AddressRecord.sys.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { FormAutofillNameUtils } from "resource://gre/modules/shared/FormAutofil
import { FormAutofillUtils } from "resource://gre/modules/shared/FormAutofillUtils.sys.mjs";
import { PhoneNumber } from "resource://gre/modules/shared/PhoneNumber.sys.mjs";
import { FormAutofill } from "resource://autofill/FormAutofill.sys.mjs";
import { AddressParser } from "resource://gre/modules/shared/AddressParser.sys.mjs";

/**
* The AddressRecord class serves to handle and normalize internal address records.
Expand All @@ -32,6 +33,7 @@ export class AddressRecord {
static computeFields(address) {
this.#computeNameFields(address);
this.#computeAddressLineFields(address);
this.#computeStreetAndHouseNumberFields(address);
this.#computeCountryFields(address);
this.#computeTelFields(address);
}
Expand Down Expand Up @@ -66,6 +68,24 @@ export class AddressRecord {
}
}

static #computeStreetAndHouseNumberFields(address) {
if (!("address-housenumber" in address) && "street-address" in address) {
let streetAddress = address["street-address"];
let parsedAddress = AddressParser.parseStreetAddress(streetAddress);
if (parsedAddress) {
address["address-housenumber"] = parsedAddress.street_number;

let splitNumber = AddressParser.parseHouseSuffix(
streetAddress,
parsedAddress
);
if (splitNumber?.length >= 2) {
address["address-extra-housesuffix"] = splitNumber[1];
}
}
}
}

static #computeCountryFields(address) {
// Compute country name
if (!("country-name" in address)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const AutofillFormFactory = {
findRootForField(element) {
let ignoreForm;
try {
const bc = element.ownerGlobal.browsingContext;
const bc = element.documentGlobal.browsingContext;
ignoreForm = bc != bc.top;
} catch {
ignoreForm = false;
Expand All @@ -32,11 +32,15 @@ export const AutofillFormFactory = {
createFromField(aField) {
let ignoreForm;
try {
const bc = aField.ownerGlobal.browsingContext;
const bc = aField.documentGlobal.browsingContext;
ignoreForm = bc != bc.top;
} catch {
ignoreForm = false;
}
return lazy.FormLikeFactory.createFromField(aField, { ignoreForm });
},

createFromDocumentRoot(aDocRoot) {
return lazy.FormLikeFactory.createFromDocumentRoot(aDocRoot);
},
};
Loading