Files
tubestation/browser/extensions/formautofill/FormAutofillHeuristics.jsm
2017-04-21 15:20:26 +08:00

85 lines
2.2 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
* Form Autofill field heuristics.
*/
"use strict";
this.EXPORTED_SYMBOLS = ["FormAutofillHeuristics"];
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://formautofill/FormAutofillUtils.jsm");
this.log = null;
FormAutofillUtils.defineLazyLogGetter(this, this.EXPORTED_SYMBOLS[0]);
/**
* Returns the autocomplete information of fields according to heuristics.
*/
this.FormAutofillHeuristics = {
VALID_FIELDS: [
"given-name",
"additional-name",
"family-name",
"organization",
"street-address",
"address-level2",
"address-level1",
"postal-code",
"country",
"tel",
"email",
],
getFormInfo(form) {
let fieldDetails = [];
for (let element of form.elements) {
// Exclude elements to which no autocomplete field has been assigned.
let info = this.getInfo(element);
if (!info) {
continue;
}
// Store the association between the field metadata and the element.
if (fieldDetails.some(f => f.section == info.section &&
f.addressType == info.addressType &&
f.contactType == info.contactType &&
f.fieldName == info.fieldName)) {
// A field with the same identifier already exists.
log.debug("Not collecting a field matching another with the same info:", info);
continue;
}
let formatWithElement = {
section: info.section,
addressType: info.addressType,
contactType: info.contactType,
fieldName: info.fieldName,
elementWeakRef: Cu.getWeakReference(element),
};
fieldDetails.push(formatWithElement);
}
return fieldDetails;
},
getInfo(element) {
if (!(element instanceof Ci.nsIDOMHTMLInputElement)) {
return null;
}
let info = element.getAutocompleteInfo();
if (!info || !info.fieldName ||
!this.VALID_FIELDS.includes(info.fieldName)) {
return null;
}
return info;
},
};