Bug 1349489 - Part 1: Move the codes from FormAutofillHandler.collectFormFields to FormAutofillHeuristics.getFormInfo.; r?MattN draft
authorSean Lee <selee@mozilla.com>
Fri, 21 Apr 2017 15:15:35 +0800
changeset 570525 71f6d35e2fe4e488306ca3c6a3bd5562bca02158
parent 570508 6df3dfa9bed3efd3650d594c71a40a8aa34bfa7f
child 570526 08a7e1b2d69d2a93bddd288d05532b8a37bd2d8e
push id56520
push userbmo:selee@mozilla.com
push dateSat, 29 Apr 2017 04:36:28 +0000
reviewersMattN
bugs1349489
milestone55.0a1
Bug 1349489 - Part 1: Move the codes from FormAutofillHandler.collectFormFields to FormAutofillHeuristics.getFormInfo.; r?MattN MozReview-Commit-ID: BQTpopSyBUe
browser/extensions/formautofill/FormAutofillHandler.jsm
browser/extensions/formautofill/FormAutofillHeuristics.jsm
--- a/browser/extensions/formautofill/FormAutofillHandler.jsm
+++ b/browser/extensions/formautofill/FormAutofillHandler.jsm
@@ -56,46 +56,18 @@ FormAutofillHandler.prototype = {
    * String of the filled profile's guid.
    */
   filledProfileGUID: null,
 
   /**
    * Set fieldDetails from the form about fields that can be autofilled.
    */
   collectFormFields() {
-    this.fieldDetails = [];
-
-    for (let element of this.form.elements) {
-      // Exclude elements to which no autocomplete field has been assigned.
-      let info = FormAutofillHeuristics.getInfo(element);
-      if (!info) {
-        continue;
-      }
-
-      // Store the association between the field metadata and the element.
-      if (this.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),
-      };
-
-      this.fieldDetails.push(formatWithElement);
-    }
-
+    let fieldDetails = FormAutofillHeuristics.getFormInfo(this.form);
+    this.fieldDetails = fieldDetails ? fieldDetails : [];
     log.debug("Collected details on", this.fieldDetails.length, "fields");
   },
 
   /**
    * Processes form fields that can be autofilled, and populates them with the
    * profile provided by backend.
    *
    * @param {Object} profile
--- a/browser/extensions/formautofill/FormAutofillHeuristics.jsm
+++ b/browser/extensions/formautofill/FormAutofillHeuristics.jsm
@@ -28,16 +28,49 @@ this.FormAutofillHeuristics = {
     "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)) {