Bug 1270740 - Remove requestAutocomplete from toolkit/. r=mattn draft
authorJonathan Guillotte-Blouin <jguillotteblouin@mozilla.com>
Thu, 11 May 2017 14:58:10 -0700
changeset 577119 70e5d3a497dfa31970dbfaa5d14f5f0b4b78a9ff
parent 576596 7e0e20683d5ab7ac8238251fa411ef3027daa22e
child 577120 41c3b64ae55b31b6ef8130b3b5f3d3a4547c303a
push id58617
push userbmo:jguillotteblouin@mozilla.com
push dateFri, 12 May 2017 21:20:25 +0000
reviewersmattn
bugs1270740
milestone55.0a1
Bug 1270740 - Remove requestAutocomplete from toolkit/. r=mattn MozReview-Commit-ID: 7cAWbAWZ2if
browser/base/content/test/static/browser_misused_characters_in_strings.js
browser/installer/package-manifest.in
mobile/android/installer/package-manifest.in
toolkit/components/formautofill/FormAutofill.jsm
toolkit/components/formautofill/FormAutofillContentService.js
toolkit/components/formautofill/FormAutofillIntegration.jsm
toolkit/components/formautofill/FormAutofillStartup.js
toolkit/components/formautofill/content/RequestAutocompleteUI.jsm
toolkit/components/formautofill/content/requestAutocomplete.js
toolkit/components/formautofill/content/requestAutocomplete.xhtml
toolkit/components/formautofill/formautofill.manifest
toolkit/components/formautofill/jar.mn
toolkit/components/formautofill/moz.build
toolkit/components/formautofill/nsIFormAutofillContentService.idl
toolkit/components/formautofill/test/.eslintrc.js
toolkit/components/formautofill/test/browser/.eslintrc.js
toolkit/components/formautofill/test/browser/browser.ini
toolkit/components/formautofill/test/browser/browser_infrastructure.js
toolkit/components/formautofill/test/browser/browser_ui_requestAutocomplete.js
toolkit/components/formautofill/test/browser/head.js
toolkit/components/formautofill/test/browser/loader.js
toolkit/components/formautofill/test/chrome/.eslintrc.js
toolkit/components/formautofill/test/chrome/chrome.ini
toolkit/components/formautofill/test/chrome/head.js
toolkit/components/formautofill/test/chrome/loader.js
toolkit/components/formautofill/test/chrome/loader_parent.js
toolkit/components/formautofill/test/chrome/test_infrastructure.html
toolkit/components/formautofill/test/chrome/test_infrastructure.js
toolkit/components/formautofill/test/chrome/test_requestAutocomplete_cancel.html
toolkit/components/formautofill/test/chrome/test_requestAutocomplete_cancel.js
toolkit/components/formautofill/test/head_common.js
toolkit/components/formautofill/test/loader_common.js
toolkit/components/formautofill/test/xpcshell/.eslintrc.js
toolkit/components/formautofill/test/xpcshell/head.js
toolkit/components/formautofill/test/xpcshell/loader.js
toolkit/components/formautofill/test/xpcshell/test_infrastructure.js
toolkit/components/formautofill/test/xpcshell/test_integration.js
toolkit/components/formautofill/test/xpcshell/xpcshell.ini
toolkit/components/moz.build
toolkit/themes/shared/formautofill/requestAutocomplete.css
toolkit/themes/shared/mozapps.inc.mn
--- a/browser/base/content/test/static/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js
@@ -181,17 +181,17 @@ add_task(function* checkAllTheProperties
 });
 
 var checkDTD = Task.async(function* (aURISpec) {
   let rawContents = yield fetchFile(aURISpec);
   // The regular expression below is adapted from:
   // https://hg.mozilla.org/mozilla-central/file/68c0b7d6f16ce5bb023e08050102b5f2fe4aacd8/python/compare-locales/compare_locales/parser.py#l233
   let entities = rawContents.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/g);
   if (!entities) {
-    // Some files, such as requestAutocomplete.dtd, have no entities defined.
+    // Some files have no entities defined.
     return;
   }
   for (let entity of entities) {
     let [, key, str] = entity.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/);
     // The matched string includes the enclosing quotation marks,
     // we need to slice them off.
     str = str.slice(1, -1);
     testForErrors(aURISpec, key, str);
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -307,17 +307,16 @@
 @RESPATH@/components/captivedetect.xpt
 @RESPATH@/browser/components/shellservice.xpt
 @RESPATH@/components/shistory.xpt
 @RESPATH@/components/spellchecker.xpt
 @RESPATH@/components/storage.xpt
 @RESPATH@/components/toolkit_asyncshutdown.xpt
 @RESPATH@/components/toolkit_filewatcher.xpt
 @RESPATH@/components/toolkit_finalizationwitness.xpt
-@RESPATH@/components/toolkit_formautofill.xpt
 @RESPATH@/components/toolkit_osfile.xpt
 @RESPATH@/components/toolkit_securityreporter.xpt
 @RESPATH@/components/toolkit_perfmonitoring.xpt
 @RESPATH@/components/toolkit_xulstore.xpt
 @RESPATH@/components/toolkitprofile.xpt
 #ifdef MOZ_ENABLE_XREMOTE
 @RESPATH@/components/toolkitremote.xpt
 #endif
@@ -466,19 +465,16 @@
 @RESPATH@/components/nsHandlerService.manifest
 @RESPATH@/components/nsHandlerService.js
 @RESPATH@/components/nsWebHandlerApp.manifest
 @RESPATH@/components/nsWebHandlerApp.js
 @RESPATH@/components/satchel.manifest
 @RESPATH@/components/nsFormAutoComplete.js
 @RESPATH@/components/FormHistoryStartup.js
 @RESPATH@/components/nsInputListAutoComplete.js
-@RESPATH@/components/formautofill.manifest
-@RESPATH@/components/FormAutofillContentService.js
-@RESPATH@/components/FormAutofillStartup.js
 @RESPATH@/components/contentAreaDropListener.manifest
 @RESPATH@/components/contentAreaDropListener.js
 @RESPATH@/browser/components/BrowserProfileMigrators.manifest
 @RESPATH@/browser/components/ProfileMigrator.js
 @RESPATH@/browser/components/ChromeProfileMigrator.js
 @RESPATH@/browser/components/FirefoxProfileMigrator.js
 #ifdef XP_WIN
 @RESPATH@/browser/components/360seProfileMigrator.js
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -218,17 +218,16 @@
 @BINPATH@/components/captivedetect.xpt
 @BINPATH@/components/shistory.xpt
 @BINPATH@/components/spellchecker.xpt
 @BINPATH@/components/storage.xpt
 @BINPATH@/components/telemetry.xpt
 @BINPATH@/components/toolkit_asyncshutdown.xpt
 @BINPATH@/components/toolkit_filewatcher.xpt
 @BINPATH@/components/toolkit_finalizationwitness.xpt
-@BINPATH@/components/toolkit_formautofill.xpt
 @BINPATH@/components/toolkit_osfile.xpt
 @BINPATH@/components/toolkit_securityreporter.xpt
 @BINPATH@/components/toolkit_perfmonitoring.xpt
 @BINPATH@/components/toolkit_xulstore.xpt
 @BINPATH@/components/toolkitprofile.xpt
 #ifdef MOZ_ENABLE_XREMOTE
 @BINPATH@/components/toolkitremote.xpt
 #endif
@@ -343,19 +342,16 @@
 @BINPATH@/components/nsHandlerService.manifest
 @BINPATH@/components/nsHandlerService.js
 @BINPATH@/components/nsWebHandlerApp.manifest
 @BINPATH@/components/nsWebHandlerApp.js
 @BINPATH@/components/satchel.manifest
 @BINPATH@/components/nsFormAutoComplete.js
 @BINPATH@/components/FormHistoryStartup.js
 @BINPATH@/components/nsInputListAutoComplete.js
-@BINPATH@/components/formautofill.manifest
-@BINPATH@/components/FormAutofillContentService.js
-@BINPATH@/components/FormAutofillStartup.js
 @BINPATH@/components/contentAreaDropListener.manifest
 @BINPATH@/components/contentAreaDropListener.js
 @BINPATH@/components/messageWakeupService.js
 @BINPATH@/components/messageWakeupService.manifest
 @BINPATH@/components/nsINIProcessor.manifest
 @BINPATH@/components/nsINIProcessor.js
 @BINPATH@/components/servicesComponents.manifest
 
deleted file mode 100644
--- a/toolkit/components/formautofill/FormAutofill.jsm
+++ /dev/null
@@ -1,85 +0,0 @@
-/* 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/. */
-
-/*
- * Main module handling references to objects living in the main process.
- */
-
-"use strict";
-
-this.EXPORTED_SYMBOLS = [
-  "FormAutofill",
-];
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/Integration.jsm");
-Cu.import("resource://gre/modules/Task.jsm");
-
-/**
- * Main module handling references to objects living in the main process.
- */
-this.FormAutofill = {
-  /**
-   * Registers new overrides for the FormAutofillIntegration methods.  Example:
-   *
-   *   FormAutofill.registerIntegration(base => ({
-   *     createRequestAutocompleteUI: Task.async(function* () {
-   *       yield base.createRequestAutocompleteUI.apply(this, arguments);
-   *     }),
-   *   }));
-   *
-   * @param aIntegrationFn
-   *        Function returning an object defining the methods that should be
-   *        overridden.  Its only parameter is an object that contains the base
-   *        implementation of all the available methods.
-   *
-   * @note The integration function is called every time the list of registered
-   *       integration functions changes.  Thus, it should not have any side
-   *       effects or do any other initialization.
-   */
-  registerIntegration(aIntegrationFn) {
-    Integration.formAutofill.register(aIntegrationFn);
-  },
-
-  /**
-   * Removes a previously registered FormAutofillIntegration override.
-   *
-   * Overrides don't usually need to be unregistered, unless they are added by a
-   * restartless add-on, in which case they should be unregistered when the
-   * add-on is disabled or uninstalled.
-   *
-   * @param aIntegrationFn
-   *        This must be the same function object passed to registerIntegration.
-   */
-  unregisterIntegration(aIntegrationFn) {
-    Integration.formAutofill.unregister(aIntegrationFn);
-  },
-
-  /**
-   * Processes a requestAutocomplete message asynchronously.
-   *
-   * @param aData
-   *        Provided to FormAutofillIntegration.createRequestAutocompleteUI.
-   *
-   * @return {Promise}
-   * @resolves Structured data received from the requestAutocomplete UI.
-   */
-  processRequestAutocomplete: Task.async(function* (aData) {
-    let ui = yield FormAutofill.integration.createRequestAutocompleteUI(aData);
-    return yield ui.show();
-  }),
-};
-
-/**
- * Dynamically generated object implementing the FormAutofillIntegration
- * methods.  Platform-specific code and add-ons can override methods of this
- * object using the registerIntegration method.
- */
-Integration.formAutofill.defineModuleGetter(
-  this.FormAutofill,
-  "integration",
-  "resource://gre/modules/FormAutofillIntegration.jsm",
-  "FormAutofillIntegration"
-);
deleted file mode 100644
--- a/toolkit/components/formautofill/FormAutofillContentService.js
+++ /dev/null
@@ -1,272 +0,0 @@
-/* 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/. */
-
-/*
- * Implements a service used by DOM content to request Form Autofill, in
- * particular when the requestAutocomplete method of Form objects is invoked.
- *
- * See the nsIFormAutofillContentService documentation for details.
- */
-
-"use strict";
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "FormAutofill",
-                                  "resource://gre/modules/FormAutofill.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-/**
- * Handles requestAutocomplete for a DOM Form element.
- */
-function FormHandler(aForm, aWindow) {
-  this.form = aForm;
-  this.window = aWindow;
-
-  this.fieldDetails = [];
-}
-
-FormHandler.prototype = {
-  /**
-   * DOM Form element to which this object is attached.
-   */
-  form: null,
-
-  /**
-   * nsIDOMWindow to which this object is attached.
-   */
-  window: null,
-
-  /**
-   * Array of collected data about relevant form fields.  Each item is an object
-   * storing the identifying details of the field and a reference to the
-   * originally associated element from the form.
-   *
-   * The "section", "addressType", "contactType", and "fieldName" values are
-   * used to identify the exact field when the serializable data is received
-   * from the requestAutocomplete user interface.  There cannot be multiple
-   * fields which have the same exact combination of these values.
-   *
-   * A direct reference to the associated element cannot be sent to the user
-   * interface because processing may be done in the parent process.
-   */
-  fieldDetails: null,
-
-  /**
-   * Handles requestAutocomplete and generates the DOM events when finished.
-   */
-  handleRequestAutocomplete: Task.async(function* () {
-    // Start processing the request asynchronously.  At the end, the "reason"
-    // variable will contain the outcome of the operation, where an empty
-    // string indicates that an unexpected exception occurred.
-    let reason = "";
-    try {
-      reason = yield this.promiseRequestAutocomplete();
-    } catch (ex) {
-      Cu.reportError(ex);
-    }
-
-    // The type of event depends on whether this is a success condition.
-    let event = (reason == "success")
-                ? new this.window.Event("autocomplete", { bubbles: true })
-                : new this.window.AutocompleteErrorEvent("autocompleteerror",
-                                                         { bubbles: true,
-                                                           reason });
-    yield this.waitForTick();
-    this.form.dispatchEvent(event);
-  }),
-
-  /**
-   * Handles requestAutocomplete and returns the outcome when finished.
-   *
-   * @return {Promise}
-   * @resolves The "reason" value indicating the outcome of the
-   *           requestAutocomplete operation, including "success" if the
-   *           operation completed successfully.
-   */
-  promiseRequestAutocomplete: Task.async(function* () {
-    let data = this.collectFormFields();
-    if (!data) {
-      return "disabled";
-    }
-
-    // Access the frame message manager of the window starting the request.
-    let rootDocShell = this.window.QueryInterface(Ci.nsIInterfaceRequestor)
-                                  .getInterface(Ci.nsIDocShell)
-                                  .sameTypeRootTreeItem
-                                  .QueryInterface(Ci.nsIDocShell);
-    let frameMM = rootDocShell.QueryInterface(Ci.nsIInterfaceRequestor)
-                              .getInterface(Ci.nsIContentFrameMessageManager);
-
-    // We need to set up a temporary message listener for our result before we
-    // send the request to the parent process.  At present, there is no check
-    // for reentrancy (bug 1020459), thus it is possible that we'll receive a
-    // message for a different request, but this will not be normally allowed.
-    let promiseRequestAutocompleteResult = new Promise((resolve, reject) => {
-      frameMM.addMessageListener("FormAutofill:RequestAutocompleteResult",
-        function onResult(aMessage) {
-          frameMM.removeMessageListener(
-                        "FormAutofill:RequestAutocompleteResult", onResult);
-          // Exceptions in the parent process are serialized and propagated in
-          // the response message that we received.
-          if ("exception" in aMessage.data) {
-            reject(aMessage.data.exception);
-          } else {
-            resolve(aMessage.data);
-          }
-        });
-    });
-
-    // Send the message to the parent process, and wait for the result.  This
-    // will throw an exception if one occurred in the parent process.
-    frameMM.sendAsyncMessage("FormAutofill:RequestAutocomplete", data);
-    let result = yield promiseRequestAutocompleteResult;
-    if (result.canceled) {
-      return "cancel";
-    }
-
-    this.autofillFormFields(result);
-
-    return "success";
-  }),
-
-  /**
-   * Returns information from the form about fields that can be autofilled, and
-   * populates the fieldDetails array on this object accordingly.
-   *
-   * @returns Serializable data structure that can be sent to the user
-   *          interface, or null if the operation failed because the constraints
-   *          on the allowed fields were not honored.
-   */
-  collectFormFields() {
-    let autofillData = {
-      sections: [],
-    };
-
-    for (let element of this.form.elements) {
-      // Query the interface and exclude elements that cannot be autocompleted.
-      if (!(element instanceof Ci.nsIDOMHTMLInputElement)) {
-        continue;
-      }
-
-      // Exclude elements to which no autocomplete field has been assigned.
-      let info = element.getAutocompleteInfo();
-      if (!info.fieldName || ["on", "off"].indexOf(info.fieldName) != -1) {
-        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.
-        return null;
-      }
-      this.fieldDetails.push({
-        section: info.section,
-        addressType: info.addressType,
-        contactType: info.contactType,
-        fieldName: info.fieldName,
-        element,
-      });
-
-      // The first level is the custom section.
-      let section = autofillData.sections
-                                .find(s => s.name == info.section);
-      if (!section) {
-        section = {
-          name: info.section,
-          addressSections: [],
-        };
-        autofillData.sections.push(section);
-      }
-
-      // The second level is the address section.
-      let addressSection = section.addressSections
-                                  .find(s => s.addressType == info.addressType);
-      if (!addressSection) {
-        addressSection = {
-          addressType: info.addressType,
-          fields: [],
-        };
-        section.addressSections.push(addressSection);
-      }
-
-      // The third level contains all the fields within the section.
-      let field = {
-        fieldName: info.fieldName,
-        contactType: info.contactType,
-      };
-      addressSection.fields.push(field);
-    }
-
-    return autofillData;
-  },
-
-  /**
-   * Processes form fields that can be autofilled, and populates them with the
-   * data provided by RequestAutocompleteUI.
-   *
-   * @param aAutofillResult
-   *        Data returned by the user interface.
-   *        {
-   *          fields: [
-   *            section: Value originally provided to the user interface.
-   *            addressType: Value originally provided to the user interface.
-   *            contactType: Value originally provided to the user interface.
-   *            fieldName: Value originally provided to the user interface.
-   *            value: String with which the field should be updated.
-   *          ],
-   *        }
-   */
-  autofillFormFields(aAutofillResult) {
-    for (let field of aAutofillResult.fields) {
-      // Get the field details, if it was processed by the user interface.
-      let fieldDetail = this.fieldDetails
-                            .find(f => f.section == field.section &&
-                                       f.addressType == field.addressType &&
-                                       f.contactType == field.contactType &&
-                                       f.fieldName == field.fieldName);
-      if (!fieldDetail) {
-        continue;
-      }
-
-      fieldDetail.element.value = field.value;
-    }
-  },
-
-  /**
-   * Waits for one tick of the event loop before resolving the returned promise.
-   */
-  waitForTick() {
-    return new Promise(function(resolve) {
-      Services.tm.dispatchToMainThread(resolve);
-    });
-  },
-};
-
-/**
- * Implements a service used by DOM content to request Form Autofill, in
- * particular when the requestAutocomplete method of Form objects is invoked.
- */
-function FormAutofillContentService() {
-}
-
-FormAutofillContentService.prototype = {
-  classID: Components.ID("{ed9c2c3c-3f86-4ae5-8e31-10f71b0f19e6}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIFormAutofillContentService]),
-
-  // nsIFormAutofillContentService
-  requestAutocomplete(aForm, aWindow) {
-    new FormHandler(aForm, aWindow).handleRequestAutocomplete()
-                                   .catch(Cu.reportError);
-  },
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([FormAutofillContentService]);
deleted file mode 100644
--- a/toolkit/components/formautofill/FormAutofillIntegration.jsm
+++ /dev/null
@@ -1,62 +0,0 @@
-/* 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/. */
-
-/*
- * This module defines the default implementation of platform-specific functions
- * that can be overridden by the host application and by add-ons.
- *
- * This module should not be imported directly, but the "integration" getter of
- * the FormAutofill module should be used to get a reference to the currently
- * defined implementations of the methods.
- */
-
-"use strict";
-
-this.EXPORTED_SYMBOLS = [
-  "FormAutofillIntegration",
-];
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
-                                  "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "RequestAutocompleteUI",
-                                  "resource://gre/modules/RequestAutocompleteUI.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-/**
- * This module defines the default implementation of platform-specific functions
- * that can be overridden by the host application and by add-ons.
- */
-this.FormAutofillIntegration = {
-  /**
-   * Creates a new RequestAutocompleteUI object.
-   *
-   * @param aAutofillData
-   *        Provides the initial data required to display the user interface.
-   *        {
-   *          sections: [{
-   *            name: User-specified section name, or empty string.
-   *            addressSections: [{
-   *              addressType: "shipping", "billing", or empty string.
-   *              fields: [{
-   *                fieldName: Type of information requested, like "email".
-   *                contactType: For example "work", "home", or empty string.
-   *              }],
-   *            }],
-   *          }],
-   *        }
-   *
-   * @return {Promise}
-   * @resolves The newly created RequestAutocompleteUI object.
-   * @rejects JavaScript exception.
-   */
-  createRequestAutocompleteUI: Task.async(function* (aAutofillData) {
-    return new RequestAutocompleteUI(aAutofillData);
-  }),
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/FormAutofillStartup.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/* 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/. */
-
-/*
- * Handles startup in the parent process.
- */
-
-"use strict";
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "FormAutofill",
-                                  "resource://gre/modules/FormAutofill.jsm");
-
-/**
- * Handles startup in the parent process.
- */
-function FormAutofillStartup() {
-}
-
-FormAutofillStartup.prototype = {
-  classID: Components.ID("{51c95b3d-7431-467b-8d50-383f158ce9e5}"),
-  QueryInterface: XPCOMUtils.generateQI([
-    Ci.nsIFrameMessageListener,
-    Ci.nsIObserver,
-    Ci.nsISupportsWeakReference,
-  ]),
-
-  // nsIObserver
-  observe(aSubject, aTopic, aData) {
-    // This method is called by the "profile-after-change" category on startup,
-    // which is called before any web page loads.  At this time, we need to
-    // register a global message listener in the parent process preemptively,
-    // because we can receive requests from child processes at any time.  For
-    // performance reasons, we use this object as a message listener, so that we
-    // don't have to load the FormAutoFill module at startup.
-    let globalMM = Cc["@mozilla.org/globalmessagemanager;1"]
-                     .getService(Ci.nsIMessageListenerManager);
-    globalMM.addMessageListener("FormAutofill:RequestAutocomplete", this);
-  },
-
-  // nsIFrameMessageListener
-  receiveMessage(aMessage) {
-    // Process the "FormAutofill:RequestAutocomplete" message.  Any exception
-    // raised in the parent process is caught and serialized into the reply
-    // message that is sent to the requesting child process.
-    FormAutofill.processRequestAutocomplete(aMessage.data)
-      .catch(ex => { return { exception: ex } })
-      .then(result => {
-        // The browser message manager in the parent will send the reply to the
-        // associated frame message manager in the child.
-        let browserMM = aMessage.target.messageManager;
-        browserMM.sendAsyncMessage("FormAutofill:RequestAutocompleteResult",
-                                   result);
-      })
-      .catch(Cu.reportError);
-  },
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([FormAutofillStartup]);
deleted file mode 100644
--- a/toolkit/components/formautofill/content/RequestAutocompleteUI.jsm
+++ /dev/null
@@ -1,58 +0,0 @@
-/* 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/. */
-
-/*
- * Handles the requestAutocomplete user interface.
- */
-
-"use strict";
-
-this.EXPORTED_SYMBOLS = [
-  "RequestAutocompleteUI",
-];
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
-                                  "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-/**
- * Handles the requestAutocomplete user interface.
- */
-this.RequestAutocompleteUI = function(aAutofillData) {
-  this._autofillData = aAutofillData;
-}
-
-this.RequestAutocompleteUI.prototype = {
-  _autofillData: null,
-
-  show: Task.async(function* () {
-    // Create a new promise and store the function that will resolve it.  This
-    // will be called by the UI once the selection has been made.
-    let resolveFn;
-    let uiPromise = new Promise(resolve => resolveFn = resolve);
-
-    // Wrap the callback function so that it survives XPCOM.
-    let args = {
-      resolveFn,
-      autofillData: this._autofillData,
-    };
-    args.wrappedJSObject = args;
-
-    // Open the window providing the function to call when it closes.
-    Services.ww.openWindow(null,
-                           "chrome://requestautocomplete/content/requestAutocomplete.xhtml",
-                           "Toolkit:RequestAutocomplete",
-                           "chrome,dialog=no,resizable",
-                           args);
-
-    // Wait for the window to be closed and the operation confirmed.
-    return yield uiPromise;
-  }),
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/content/requestAutocomplete.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/* 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/. */
-
-/*
- * Implementation of "requestAutocomplete.xhtml".
- */
-
-"use strict";
-
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
-                                  "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-const RequestAutocompleteDialog = {
-  resolveFn: null,
-  autofillData: null,
-
-  onLoad() {
-    Task.spawn(function* () {
-      let args = window.arguments[0].wrappedJSObject;
-      this.resolveFn = args.resolveFn;
-      this.autofillData = args.autofillData;
-
-      window.sizeToContent();
-
-      Services.obs.notifyObservers(window,
-                                   "formautofill-window-initialized");
-    }.bind(this)).catch(Cu.reportError);
-  },
-
-  onAccept() {
-    // TODO: Replace with autofill storage module (bug 1018304).
-    const dummyDB = {
-      "": {
-        "name": "Mozzy La",
-        "street-address": "331 E Evelyn Ave",
-        "address-level2": "Mountain View",
-        "address-level1": "CA",
-        "country": "US",
-        "postal-code": "94041",
-        "email": "email@example.org",
-      }
-    };
-
-    let result = { fields: [] };
-    for (let section of this.autofillData.sections) {
-      for (let addressSection of section.addressSections) {
-        let addressType = addressSection.addressType;
-        if (!(addressType in dummyDB)) {
-          continue;
-        }
-
-        for (let field of addressSection.fields) {
-          let fieldName = field.fieldName;
-          if (!(fieldName in dummyDB[addressType])) {
-            continue;
-          }
-
-          result.fields.push({
-            section: section.name,
-            addressType,
-            contactType: field.contactType,
-            fieldName: field.fieldName,
-            value: dummyDB[addressType][fieldName],
-          });
-        }
-      }
-    }
-
-    window.close();
-    this.resolveFn(result);
-  },
-
-  onCancel() {
-    window.close();
-    this.resolveFn({ canceled: true });
-  },
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/content/requestAutocomplete.xhtml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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/. -->
-
-<!DOCTYPE html [
-  <!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
-  %htmlDTD;
-  <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd" >
-  %globalDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <title>requestAutocomplete demo window</title>
-    <link rel="stylesheet"
-          href="chrome://mozapps/skin/formautofill/requestAutocomplete.css" />
-    <script type="application/javascript"
-            src="chrome://requestautocomplete/content/requestAutocomplete.js" />
-  </head>
-  <body dir="&locale.dir;" onload="RequestAutocompleteDialog.onLoad();">
-    <h1>requestAutocomplete</h1>
-    <p>This is a demo window.</p>
-    <input id="accept" type="button" value="(OK)"
-           onclick="RequestAutocompleteDialog.onAccept();" />
-    <input id="cancel" type="button" value="(Cancel)"
-           onclick="RequestAutocompleteDialog.onCancel();" />
-  </body>
-</html>
deleted file mode 100644
--- a/toolkit/components/formautofill/formautofill.manifest
+++ /dev/null
@@ -1,7 +0,0 @@
-component {ed9c2c3c-3f86-4ae5-8e31-10f71b0f19e6} FormAutofillContentService.js
-contract @mozilla.org/formautofill/content-service;1 {ed9c2c3c-3f86-4ae5-8e31-10f71b0f19e6}
-component {51c95b3d-7431-467b-8d50-383f158ce9e5} FormAutofillStartup.js
-contract @mozilla.org/formautofill/startup;1 {51c95b3d-7431-467b-8d50-383f158ce9e5}
-#ifdef NIGHTLY_BUILD
-category profile-after-change FormAutofillStartup @mozilla.org/formautofill/startup;1
-#endif
deleted file mode 100644
--- a/toolkit/components/formautofill/jar.mn
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-toolkit.jar:
-% content requestautocomplete %content/requestautocomplete/
-  content/requestautocomplete/requestAutocomplete.js      (content/requestAutocomplete.js)
-  content/requestautocomplete/requestAutocomplete.xhtml   (content/requestAutocomplete.xhtml)
deleted file mode 100644
--- a/toolkit/components/formautofill/moz.build
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# 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/.
-
-if CONFIG['NIGHTLY_BUILD']:
-    BROWSER_CHROME_MANIFESTS += [
-        'test/browser/browser.ini',
-    ]
-
-    MOCHITEST_CHROME_MANIFESTS += [
-        'test/chrome/chrome.ini',
-    ]
-
-XPCSHELL_TESTS_MANIFESTS += [
-    'test/xpcshell/xpcshell.ini',
-]
-
-XPIDL_SOURCES += [
-    'nsIFormAutofillContentService.idl',
-]
-
-XPIDL_MODULE = 'toolkit_formautofill'
-
-EXTRA_COMPONENTS += [
-    'FormAutofillContentService.js',
-    'FormAutofillStartup.js',
-]
-
-EXTRA_PP_COMPONENTS += [
-    'formautofill.manifest',
-]
-
-EXTRA_JS_MODULES += [
-    'content/RequestAutocompleteUI.jsm',
-    'FormAutofill.jsm',
-    'FormAutofillIntegration.jsm',
-]
-
-JAR_MANIFESTS += [
-    'jar.mn',
-]
-
-with Files('**'):
-    BUG_COMPONENT = ('Toolkit', 'Form Manager')
deleted file mode 100644
--- a/toolkit/components/formautofill/nsIFormAutofillContentService.idl
+++ /dev/null
@@ -1,46 +0,0 @@
-/* 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/. */
-
-#include "nsISupports.idl"
-
-interface nsIDOMHTMLFormElement;
-interface nsIDOMWindow;
-
-/**
- * Defines a service used by DOM content to request Form Autofill, in particular
- * when the requestAutocomplete method of Form objects is invoked.
- *
- * This service lives in the process that hosts the requesting DOM content.
- * This means that, in a multi-process (e10s) environment, there can be an
- * instance of the service for each content process, in addition to an instance
- * for the chrome process.
- *
- * @remarks The service implementation uses a child-side message manager to
- *          communicate with a parent-side message manager living in the chrome
- *          process, where most of the processing is located.
- */
-[scriptable, uuid(1db29340-99df-4845-9102-0c5d281b2fe8)]
-interface nsIFormAutofillContentService : nsISupports
-{
-  /**
-   * Invoked by the requestAutocomplete method of the DOM Form object.
-   *
-   * The application is expected to display a user interface asking for the
-   * details that are relevant to the form being filled in.  The application
-   * should use the "autocomplete" attributes on the input elements as hints
-   * about which type of information is being requested.
-   *
-   * The processing will result in either an "autocomplete" simple DOM Event or
-   * an AutocompleteErrorEvent being fired on the form.
-   *
-   * @param aForm
-   *        The form on which the requestAutocomplete method was invoked.
-   * @param aWindow
-   *        The window where the form is located.  This must be specified even
-   *        for elements that are not in a document, and is used to generate the
-   *        DOM events resulting from the operation.
-   */
-  void requestAutocomplete(in nsIDOMHTMLFormElement aForm,
-                           in nsIDOMWindow aWindow);
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/test/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
-  "extends": [
-    "plugin:mozilla/browser-test"
-  ]
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
-  "extends": [
-    "plugin:mozilla/browser-test"
-  ]
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/browser.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[DEFAULT]
-# The following files starting with ".." are installed in the current folder.
-support-files =
-  ../head_common.js
-  ../loader_common.js
-  head.js
-  loader.js
-
-[browser_infrastructure.js]
-[browser_ui_requestAutocomplete.js]
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/browser_infrastructure.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests the local testing infrastructure.
- */
-
-"use strict";
-
-/**
- * Tests the truth assertion function.
- */
-add_task(function* test_assert_truth() {
-  Assert.ok(1 != 2);
-});
-
-/**
- * Tests the equality assertion function.
- */
-add_task(function* test_assert_equality() {
-  Assert.equal(1 + 1, 2);
-});
-
-/**
- * Uses some of the utility functions provided by the framework.
- */
-add_task(function* test_utility_functions() {
-  // The "print" function is useful to log information that is not known before.
-  let randomString = "R" + Math.floor(Math.random() * 10);
-  Output.print("The random contents will be '" + randomString + "'.");
-
-  // Create the text file with the random contents.
-  let path = yield TestUtils.getTempFile("test-infrastructure.txt");
-  yield OS.File.writeAtomic(path, new TextEncoder().encode(randomString));
-
-  // Test a few utility functions.
-  yield TestUtils.waitForTick();
-  yield TestUtils.waitMs(50);
-
-  let promiseMyNotification = TestUtils.waitForNotification("my-topic");
-  Services.obs.notifyObservers(null, "my-topic");
-  yield promiseMyNotification;
-
-  // Check the file size.  The file will be deleted automatically later.
-  Assert.equal((yield OS.File.stat(path)).size, randomString.length);
-});
-
-add_task(terminationTaskFn);
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/browser_ui_requestAutocomplete.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests the requestAutocomplete user interface.
- */
-
-"use strict";
-
-add_task(function* setup() {
-  yield SpecialPowers.pushPrefEnv({
-    set: [["dom.ipc.processCount", 1]]
-  });
-});
-
-/**
- * Open the requestAutocomplete UI and test that selecting a profile results in
- * the correct data being sent back to the opener.
- */
-add_task(function* test_select_profile() {
-  // Request an e-mail address.
-  let { uiWindow, promiseResult } = yield FormAutofillTest.showUI(
-                                          TestData.requestEmailOnly);
-
-  // Accept the dialog.
-  let acceptButton = uiWindow.document.getElementById("accept");
-  EventUtils.synthesizeMouseAtCenter(acceptButton, {}, uiWindow);
-
-  let result = yield promiseResult;
-  Assert.equal(result.fields.length, 1);
-  Assert.equal(result.fields[0].section, "");
-  Assert.equal(result.fields[0].addressType, "");
-  Assert.equal(result.fields[0].contactType, "");
-  Assert.equal(result.fields[0].fieldName, "email");
-  Assert.equal(result.fields[0].value, "email@example.org");
-});
-
-/**
- * Open the requestAutocomplete UI and cancel the dialog.
- */
-add_task(function* test_cancel() {
-  // Request an e-mail address.
-  let { uiWindow, promiseResult } = yield FormAutofillTest.showUI(
-                                          TestData.requestEmailOnly);
-
-  // Cancel the dialog.
-  let acceptButton = uiWindow.document.getElementById("cancel");
-  EventUtils.synthesizeMouseAtCenter(acceptButton, {}, uiWindow);
-
-  let result = yield promiseResult;
-  Assert.ok(result.canceled);
-});
-
-add_task(terminationTaskFn);
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/head.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Initialization specific to Form Autofill mochitest-browser tests.
- */
-
-/* import-globals-from loader.js */
-
-"use strict";
-
-// We cannot start initialization from "loader.js" like we do in the xpcshell
-// and mochitest-chrome frameworks, thus we load the script here.
-Services.scriptloader.loadSubScript(getRootDirectory(gTestPath) + "loader.js",
-                                    this);
-
-// The testing framework is fully initialized at this point, you can add
-// mochitest-browser specific test initialization here.  If you need shared
-// functions or initialization that are not specific to mochitest-browser,
-// consider adding them to "head_common.js" in the parent folder instead.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/browser/loader.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Infrastructure for the mochitest-browser tests located in this folder.
- *
- * See "loader_common.js" in the parent folder for a general overview.
- *
- * Unless you are adding new features to the framework, you shouldn't have to
- * modify this file.  Use "head_common.js" or "head.js" for shared code.
- */
-
-"use strict";
-
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
-Cu.import("resource://gre/modules/Services.jsm", this);
-
-/* import-globals-from ../loader_common.js */
-Services.scriptloader.loadSubScript(getRootDirectory(gTestPath) +
-                                    "loader_common.js", this);
-
-// Define output functions so they look the same across all frameworks.
-var Output = {
-  print: info,
-};
-
-// Define assertion functions so they look the same across all frameworks.
-var Assert = {
-  ok: _mochitestAssert.ok,
-  equal: _mochitestAssert.equal,
-};
-
-// Define task registration functions, see description in "loader_common.js".
-var add_task_in_parent_process = add_task;
-var add_task_in_child_process = function() {};
-var add_task_in_both_processes = add_task;
-
-/* import-globals-from ../head_common.js */
-Services.scriptloader.loadSubScript(getRootDirectory(gTestPath) +
-                                    "head_common.js", this);
-
-// Reminder: unless you are adding new features to the framework, you shouldn't
-// have to modify this file.  Use "head_common.js" or "head.js" for shared code.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
-  "extends": [
-    "plugin:mozilla/chrome-test"
-  ]
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/chrome.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-[DEFAULT]
-# The following files starting with ".." are installed in the current folder.
-support-files =
-  ../head_common.js
-  ../loader_common.js
-  head.js
-  test_infrastructure.js
-  test_requestAutocomplete_cancel.js
-  loader_parent.js
-  loader.js
-
-# For each test defined below, the associated JavaScript file must be declared
-# in the list above.  This is required because a "support-files" declaration on
-# the individual test would override the global list instead of adding entries.
-
-[test_infrastructure.html]
-[test_requestAutocomplete_cancel.html]
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/head.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Initialization specific to Form Autofill mochitest-chrome tests.
- *
- * This file is loaded by "loader.js".
- */
-
-/* import-globals-from loader.js */
-
-"use strict";
-
-// The testing framework is fully initialized at this point, you can add
-// mochitest-chrome specific test initialization here.  If you need shared
-// functions or initialization that are not specific to mochitest-chrome,
-// consider adding them to "head_common.js" in the parent folder instead.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/loader.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Infrastructure for the mochitest-chrome tests located in this folder.
- *
- * See "loader_common.js" in the parent folder for a general overview.
- *
- * Unless you are adding new features to the framework, you shouldn't have to
- * modify this file.  Use "head_common.js" or "head.js" for shared code.
- */
-
-"use strict";
-
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
-Cu.import("resource://gre/modules/Services.jsm", this);
-
-Services.scriptloader.loadSubScript(
-  "chrome://mochikit/content/tests/SimpleTest/SimpleTest.js", this);
-
-/* import-globals-from ../loader_common.js */
-var sharedUrl = SimpleTest.getTestFileURL("loader_common.js");
-Services.scriptloader.loadSubScript(sharedUrl, this);
-
-var parentScript = SpecialPowers.loadChromeScript(
-                                 SimpleTest.getTestFileURL("loader_parent.js"));
-
-// Replace the extension of the loaded HTML file with ".js"
-var testUrl = location.href.replace(/\.\w+$/, ".js");
-
-// Start loading the test script in the parent process.
-var promiseParentInitFinished = new Promise(function(resolve) {
-  parentScript.addMessageListener("finish_load_in_parent", resolve);
-});
-parentScript.sendAsyncMessage("start_load_in_parent", { testUrl });
-
-// Define output functions so they look the same across all frameworks.
-var Output = {
-  print: info,
-};
-
-// Define assertion functions so they look the same across all frameworks.
-var Assert = {
-  ok: _mochitestAssert.ok,
-  equal: _mochitestAssert.equal,
-};
-
-var executeSoon = SimpleTest.executeSoon;
-
-var gTestTasks = [];
-
-// Define task registration functions, see description in "loader_common.js".
-function add_task(taskFn) {
-  gTestTasks.push([taskFn, "content", taskFn.name]);
-}
-function add_task_in_parent_process(taskFn, taskIdOverride) {
-  let taskId = taskIdOverride || getTaskId(Components.stack.caller);
-  gTestTasks.push([taskFn, "parent", taskId]);
-}
-function add_task_in_both_processes(taskFn) {
-  // We need to define a task ID based on our direct caller.
-  add_task_in_parent_process(taskFn, getTaskId(Components.stack.caller));
-  add_task(taskFn);
-}
-var add_task_in_child_process = add_task;
-
-window.addEventListener("load", function() {
-  Task.spawn(function* () {
-    try {
-      for (let [taskFn, taskType, taskId] of gTestTasks) {
-        if (taskType == "content") {
-          // This is a normal task executed in the current process.
-          info("Running " + taskFn.name);
-          yield Task.spawn(taskFn);
-        } else {
-          // This is a task executed in the parent process.
-          info("Running task in parent process: " + taskFn.name);
-          let promiseFinished = new Promise(function(resolve) {
-            parentScript.addMessageListener("finish_task_" + taskId, resolve);
-          });
-          parentScript.sendAsyncMessage("start_task_" + taskId);
-          yield promiseFinished;
-          info("Finished task in parent process: " + taskFn.name);
-        }
-      }
-    } catch (ex) {
-      ok(false, ex);
-    }
-
-    SimpleTest.finish();
-  });
-}, {once: true});
-
-// Wait for the test script to be loaded in the parent process.  This means that
-// test tasks are registered and ready, but have not been executed yet.
-add_task(function* wait_loading_in_parent_process() {
-  yield promiseParentInitFinished;
-});
-
-/* import-globals-from ../head_common.js */
-var headUrl = SimpleTest.getTestFileURL("head_common.js");
-Services.scriptloader.loadSubScript(headUrl, this);
-
-Output.print("Loading test file: " + testUrl);
-Services.scriptloader.loadSubScript(testUrl, this);
-
-// Register the execution of termination tasks after all other tasks.
-add_task(terminationTaskFn);
-add_task_in_parent_process(terminationTaskFn, terminationTaskFn.name);
-
-SimpleTest.waitForExplicitFinish();
-
-// Reminder: unless you are adding new features to the framework, you shouldn't
-// have to modify this file.  Use "head_common.js" or "head.js" for shared code.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/loader_parent.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/* eslint-env mozilla/frame-script */
-// assert is available to chrome scripts loaded via SpecialPowers.loadChromeScript.
-/* global assert */
-
-/*
- * Infrastructure for the mochitest-chrome tests located in this folder, always
- * executed in the parent process.
- *
- * See "loader_common.js" in the parent folder for a general overview.
- *
- * Unless you are adding new features to the framework, you shouldn't have to
- * modify this file.  Use "head_common.js" or "head.js" for shared code.
- */
-
-"use strict";
-
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
-Cu.import("resource://gre/modules/Services.jsm", this);
-
-/* import-globals-from ../loader_common.js */
-var sharedUrl = "chrome://mochitests/content/chrome/" +
-                "toolkit/components/formautofill/test/chrome/loader_common.js";
-Services.scriptloader.loadSubScript(sharedUrl, this);
-
-// Define output functions so they look the same across all frameworks.  Since
-// we don't have an output function available here, we report as TEST-PASS.
-var Output = {
-  print: message => assert.ok(true, message),
-};
-
-// Define assertion functions so they look the same across all frameworks.
-var Assert = {
-  ok: assert.ok,
-  equal: assert.equal,
-};
-
-// Define task registration functions, see description in "loader_common.js".
-function add_task_in_parent_process(taskFn, taskIdOverride) {
-  let taskId = taskIdOverride || getTaskId(Components.stack.caller);
-  Output.print("Registering in the parent process: " + taskId);
-  addMessageListener("start_task_" + taskId, function() {
-    Task.spawn(function* () {
-      try {
-        Output.print("Running in the parent process " + taskId);
-        yield Task.spawn(taskFn);
-      } catch (ex) {
-        assert.ok(false, ex);
-      }
-
-      sendAsyncMessage("finish_task_" + taskId, {});
-    });
-  });
-}
-var add_task = function() {};
-var add_task_in_child_process = function() {};
-var add_task_in_both_processes = add_task_in_parent_process;
-
-// We need to wait for the child process to send us the path of the test file
-// to load before we can actually start loading it.
-var context = this;
-addMessageListener("start_load_in_parent", function(message) {
-  Output.print("Starting loading infrastructure in parent process.");
-  /* import-globals-from ../head_common.js */
-  let headUrl = "chrome://mochitests/content/chrome/" +
-                "toolkit/components/formautofill/test/chrome/head_common.js";
-  Services.scriptloader.loadSubScript(headUrl, context);
-
-  Services.scriptloader.loadSubScript(message.testUrl, context);
-
-  // Register the execution of termination tasks after all other tasks.
-  add_task_in_parent_process(terminationTaskFn, terminationTaskFn.name);
-
-  Output.print("Finished loading infrastructure in parent process.");
-  sendAsyncMessage("finish_load_in_parent", {});
-});
-
-// Reminder: unless you are adding new features to the framework, you shouldn't
-// have to modify this file.  Use "head_common.js" or "head.js" for shared code.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/test_infrastructure.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>
-<script type="application/javascript" src="loader.js"></script>
-<!-- Any copyright is dedicated to the Public Domain.
-   - http://creativecommons.org/publicdomain/zero/1.0/ -->
-
-<p id="paragraph">Paragraph contents.</p>
-
-</body></html>
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/test_infrastructure.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests the local testing infrastructure.
- */
-
-"use strict";
-
-/* import-globals-from loader.js */
-
-/**
- * Tests the truth assertion function.
- */
-add_task(function* test_assert_truth() {
-  Assert.ok(1 != 2);
-});
-
-/**
- * Tests the equality assertion function.
- */
-add_task(function* test_assert_equality() {
-  Assert.equal(1 + 1, 2);
-});
-
-/**
- * Uses some of the utility functions provided by the framework.
- */
-add_task(function* test_utility_functions() {
-  // The "print" function is useful to log information that is not known before.
-  let randomString = "R" + Math.floor(Math.random() * 10);
-  Output.print("The random contents will be '" + randomString + "'.");
-
-  // Create the text file with the random contents.
-  let path = yield TestUtils.getTempFile("test-infrastructure.txt");
-  yield OS.File.writeAtomic(path, new TextEncoder().encode(randomString));
-
-  // Test a few utility functions.
-  yield TestUtils.waitForTick();
-  yield TestUtils.waitMs(50);
-
-  let promiseMyNotification = TestUtils.waitForNotification("my-topic");
-  Services.obs.notifyObservers(null, "my-topic");
-  yield promiseMyNotification;
-
-  // Check the file size.  The file will be deleted automatically later.
-  Assert.equal((yield OS.File.stat(path)).size, randomString.length);
-});
-
-/**
- * This type of test has access to the content declared above.
- */
-add_task(function* test_content() {
-  Assert.equal($("paragraph").innerHTML, "Paragraph contents.");
-
-  let promiseMyEvent = TestUtils.waitForEvent($("paragraph"), "MyEvent");
-
-  let event = document.createEvent("CustomEvent");
-  event.initCustomEvent("MyEvent", true, false, {});
-  $("paragraph").dispatchEvent(event);
-
-  yield promiseMyEvent;
-});
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/test_requestAutocomplete_cancel.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>
-<script type="application/javascript" src="loader.js"></script>
-<!-- Any copyright is dedicated to the Public Domain.
-   - http://creativecommons.org/publicdomain/zero/1.0/ -->
-
-<form id="form">
-</form>
-
-</body></html>
deleted file mode 100644
--- a/toolkit/components/formautofill/test/chrome/test_requestAutocomplete_cancel.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests the response sent when requestAutocomplete is canceled by the user.
- */
-
-"use strict";
-
-/* import-globals-from loader.js */
-
-/**
- * The requestAutocomplete UI will not be displayed during these tests.
- */
-add_task_in_parent_process(function* test_cancel_init() {
-  FormAutofillTest.requestAutocompleteResponse = { canceled: true };
-});
-
-/**
- * Tests the case where the feature is canceled.
- */
-add_task(function* test_cancel() {
-  let promise = TestUtils.waitForEvent($("form"), "autocompleteerror");
-  $("form").requestAutocomplete();
-  let errorEvent = yield promise;
-
-  Assert.equal(errorEvent.reason, "cancel");
-});
deleted file mode 100644
--- a/toolkit/components/formautofill/test/head_common.js
+++ /dev/null
@@ -1,250 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Initialization of Form Autofill tests shared between all frameworks.
- *
- * A copy of this file is installed in each of the framework subfolders, this
- * means it becomes a sibling of the test files in the final layout.  This is
- * determined by how manifest "support-files" installation works.
- *
- * This file expects the globals below to be defined in the scope it is
- * imported into.
- */
-
- /* global add_termination_task, add_task_in_both_processes,
-           add_task_in_parent_process, Output */
-
-"use strict";
-
-// The requestAutocomplete framework is available at this point, you can add
-// mochitest-chrome specific test initialization here.  If you need shared
-// functions or initialization that are not specific to mochitest-chrome,
-// consider adding them to "head_common.js" in the parent folder instead.
-
-XPCOMUtils.defineLazyModuleGetter(this, "DownloadPaths",
-                                  "resource://gre/modules/DownloadPaths.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
-                                  "resource://gre/modules/FileUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "FormAutofill",
-                                  "resource://gre/modules/FormAutofill.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
-                                  "resource://gre/modules/NetUtil.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "OS",
-                                  "resource://gre/modules/osfile.jsm");
-
-/* --- Global helpers --- */
-
-// Some of these functions are already implemented in other parts of the source
-// tree, see bug 946708 about sharing more code.
-
-var TestUtils = {
-  /**
-   * Waits for at least one tick of the event loop.  This means that all pending
-   * events at the time of this call will have been processed.  Other events may
-   * be processed before the returned promise is resolved.
-   *
-   * @return {Promise}
-   * @resolves When pending events have been processed.
-   * @rejects Never.
-   */
-  waitForTick() {
-    return new Promise(resolve => executeSoon(resolve));
-  },
-
-  /**
-   * Waits for the specified timeout.
-   *
-   * @param aTimeMs
-   *        Minimum time to wait from the moment of this call, in milliseconds.
-   *        The actual wait may be longer, due to system timer resolution and
-   *        pending events being processed before the promise is resolved.
-   *
-   * @return {Promise}
-   * @resolves When the specified time has passed.
-   * @rejects Never.
-   */
-  waitMs(aTimeMs) {
-    return new Promise(resolve => setTimeout(resolve, aTimeMs));
-  },
-
-  /**
-   * Allows waiting for an observer notification once.
-   *
-   * @param aTopic
-   *        Notification topic to observe.
-   *
-   * @return {Promise}
-   * @resolves The array [aSubject, aData] from the observed notification.
-   * @rejects Never.
-   */
-  waitForNotification(aTopic) {
-    Output.print("Waiting for notification: '" + aTopic + "'.");
-
-    return new Promise(resolve => Services.obs.addObserver(
-      function observe(aSubject, aTopic, aData) {
-        Services.obs.removeObserver(observe, aTopic);
-        resolve([aSubject, aData]);
-      }, aTopic));
-  },
-
-  /**
-   * Waits for a DOM event on the specified target.
-   *
-   * @param aTarget
-   *        The DOM EventTarget on which addEventListener should be called.
-   * @param aEventName
-   *        String with the name of the event.
-   * @param aUseCapture
-   *        This parameter is passed to the addEventListener call.
-   *
-   * @return {Promise}
-   * @resolves The arguments from the observed event.
-   * @rejects Never.
-   */
-  waitForEvent(aTarget, aEventName, aUseCapture = false) {
-    Output.print("Waiting for event: '" + aEventName + "' on " + aTarget + ".");
-
-    return new Promise(resolve => aTarget.addEventListener(aEventName,
-      function(...aArgs) {
-        resolve(...aArgs);
-      }, {capture: aUseCapture, once: true}));
-  },
-
-  // While the previous test file should have deleted all the temporary files it
-  // used, on Windows these might still be pending deletion on the physical file
-  // system.  Thus, start from a new base number every time, to make a collision
-  // with a file that is still pending deletion highly unlikely.
-  _fileCounter: Math.floor(Math.random() * 1000000),
-
-  /**
-   * Returns a reference to a temporary file, that is guaranteed not to exist,
-   * and to have never been created before.
-   *
-   * @param aLeafName
-   *        Suggested leaf name for the file to be created.
-   *
-   * @return {Promise}
-   * @resolves Path of a non-existent file in a temporary directory.
-   *
-   * @note It is not enough to delete the file if it exists, or to delete the
-   *       file after calling nsIFile.createUnique, because on Windows the
-   *       delete operation in the file system may still be pending, preventing
-   *       a new file with the same name to be created.
-   */
-  getTempFile: Task.async(function* (aLeafName) {
-    // Prepend a serial number to the extension in the suggested leaf name.
-    let [base, ext] = DownloadPaths.splitBaseNameAndExtension(aLeafName);
-    let leafName = base + "-" + this._fileCounter + ext;
-    this._fileCounter++;
-
-    // Get a file reference under the temporary directory for this test file.
-    let path = OS.Path.join(OS.Constants.Path.tmpDir, leafName);
-    Assert.ok(!(yield OS.File.exists(path)));
-
-    // Ensure the file is deleted whe the test terminates.
-    add_termination_task(function* () {
-      if (yield OS.File.exists(path)) {
-        yield OS.File.remove(path);
-      }
-    });
-
-    return path;
-  }),
-};
-
-/* --- Local helpers --- */
-
-var FormAutofillTest = {
-  /**
-   * Stores the response that the next call to the mock requestAutocomplete UI
-   * will return to the requester, or null to enable displaying the default UI.
-   */
-  requestAutocompleteResponse: null,
-
-  /**
-   * Displays the requestAutocomplete user interface using the specified data.
-   *
-   * @param aFormAutofillData
-   *        Serializable object containing the set of requested fields.
-   *
-   * @return {Promise}
-   * @resolves An object with the following properties:
-   *           {
-   *             uiWindow: Reference to the initialized window.
-   *             promiseResult: Promise resolved by the UI when it closes.
-   *           }
-   */
-  showUI: Task.async(function* (aFormAutofillData) {
-    Output.print("Opening UI with data: " + JSON.stringify(aFormAutofillData));
-
-    // Wait for the initialization event before opening the window.
-    let promiseUIWindow =
-        TestUtils.waitForNotification("formautofill-window-initialized");
-    let ui = yield FormAutofill.integration.createRequestAutocompleteUI(
-                                                         aFormAutofillData);
-    let promiseResult = ui.show();
-
-    // The window is the subject of the observer notification.
-    return {
-      uiWindow: (yield promiseUIWindow)[0],
-      promiseResult,
-    };
-  }),
-};
-
-var TestData = {
-  /**
-   * Autofill UI request for the e-mail field only.
-   */
-  get requestEmailOnly() {
-    return {
-      sections: [{
-        name: "",
-        addressSections: [{
-          addressType: "",
-          fields: [{
-            fieldName: "email",
-            contactType: "",
-          }],
-        }],
-      }],
-    };
-  },
-};
-
-/* --- Initialization and termination functions common to all tests --- */
-
-add_task_in_parent_process(function* () {
-  // If required, we return a mock response instead of displaying the UI.
-  let mockIntegrationFn = base => ({
-    createRequestAutocompleteUI: Task.async(function* () {
-      // Call the base method to display the UI if override is not requested.
-      if (FormAutofillTest.requestAutocompleteResponse === null) {
-        return yield base.createRequestAutocompleteUI.apply(this, arguments);
-      }
-
-      // Return a mock RequestAutocompleteUI object.
-      return {
-        show: Task.async(function* () {
-          let response = FormAutofillTest.requestAutocompleteResponse;
-          Output.print("Mock UI response: " + JSON.stringify(response));
-          return response;
-        }),
-      };
-    }),
-  });
-
-  FormAutofill.registerIntegration(mockIntegrationFn);
-  add_termination_task(function* () {
-    FormAutofill.unregisterIntegration(mockIntegrationFn);
-  });
-});
-
-add_task_in_both_processes(function* () {
-  // We must manually enable the feature while testing.
-  Services.prefs.setBoolPref("dom.forms.requestAutocomplete", true);
-  add_termination_task(function* () {
-    Services.prefs.clearUserPref("dom.forms.requestAutocomplete");
-  });
-});
deleted file mode 100644
--- a/toolkit/components/formautofill/test/loader_common.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Infrastructure common to the test frameworks located in subfolders.
- *
- * A copy of this file is installed in each of the framework subfolders, this
- * means it becomes a sibling of the test files in the final layout.  This is
- * determined by how manifest "support-files" installation works.
- *
- * Unless you are adding new features to the framework, you shouldn't have to
- * modify this file.  Use "head_common.js" or the "head.js" file of each
- * framework for shared code.
- *
- * This file expects Services & XPCOMUtils to be defined in the scope it is imported
- * into. Additionally, it expects "Output" to be defined as well.
- */
-
-"use strict";
-
-/* global XPCOMUtils, Services, Output */
-
-/*
- * --------------------
- *  FRAMEWORK OVERVIEW
- * --------------------
- *
- * This framework is designed in such a way that test can be written in similar
- * ways in the xpcshell, mochitest-chrome, and mochitest-browser frameworks,
- * both when tests are running in the parent process or in a content process.
- *
- * There are some basic self-documenting assertion and output functions:
- *
- * Assert.ok(actualValue);
- * Assert.is(actualValue, expectedValue);
- * Output.print(string);
- *
- * Test cases and initialization functions are declared in shared head files
- * ("head_common.js" and "head.js") as well as individual test files.  When
- * tests run in an Elecrolysis (e10s) environment, they are executed in both
- * processes at first.  Normally, at this point only the registration of test
- * cases happen.  When everything has finished loading, tests are started and
- * appropriately synchronized between processes.
- *
- * Tests can be declared using the add_task syntax:
- *
- * add_task(function* test_something () { ... });
- *   This adds a test either in the parent process or child process:
- *     - Parent: xpcshell, mochitest-chrome --disable-e10s, mochitest-browser
- *     - Child: mochitest-chrome with e10s
- *   In the future, these might run in the child process for "xpcshell".
- *
- * add_task_in_parent_process(function* test_something () { ... });
- *   This test runs in the parent process, but the child process will wait for
- *   its completion before continuing with the next task.  This wait currently
- *   happens only in mochitest-chrome with e10s, in other frameworks that run
- *   only in the parent process this is the same as a normal add_task.
- *
- * add_task_in_child_process(function* test_something () { ... });
- *   This test runs only in the child process.  This means that the test is not
- *   run unless this is an e10s test, currently mochitest-chrome with e10s.
- *
- * add_task_in_both_processes(function* test_something () { ... });
- *   Useful for initialization that must be done both in the parent and the
- *   child, like setting preferences.
- *
- * add_termination_task(function* () { ... });
- *   Registers a new asynchronous termination task.  This is executed after all
- *   test cases in the file finished, and always in the same process where the
- *   termination task is registered.
- */
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
-                                  "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-var gTerminationTasks = [];
-
-/**
- * None of the testing frameworks support asynchronous termination functions, so
- * this task must be registered later, after the other "add_task" calls.
- *
- * Even xpcshell doesn't support calling "add_task" in the "tail.js" file,
- * because it registers the task but does not wait for its termination,
- * potentially leading to intermittent failures in subsequent tests.
- */
-function* terminationTaskFn() {
-  for (let taskFn of gTerminationTasks) {
-    try {
-      yield Task.spawn(taskFn);
-    } catch (ex) {
-      Output.print(ex);
-      Assert.ok(false);
-    }
-  }
-}
-
-function add_termination_task(taskFn) {
-  gTerminationTasks.push(taskFn);
-}
-
-/**
- * Returns a unique identifier used for synchronizing the given test task
- * between the parent and child processes.
- */
-function getTaskId(stackFrame) {
-  return stackFrame.filename + ":" + stackFrame.lineNumber;
-}
-
-// This is a shared helper for mochitest-chrome and mochitest-browser.
-var _mochitestAssert = {
-  ok(actual) {
-    let stack = Components.stack.caller;
-    ok(actual, "[" + stack.name + " : " + stack.lineNumber + "] " + actual +
-               " == true");
-  },
-  equal(actual, expected) {
-    let stack = Components.stack.caller;
-    is(actual, expected, "[" + stack.name + " : " + stack.lineNumber + "] " +
-               actual + " == " + expected);
-  },
-};
-
-// Reminder: unless you are adding new features to the framework, you shouldn't
-// have to modify this file.  Use "head_common.js" or "head.js" for shared code.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
-  "extends": [
-    "plugin:mozilla/xpcshell-test"
-  ]
-};
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/head.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Initialization specific to Form Autofill xpcshell tests.
- *
- * This file is loaded alongside loader.js.
- */
-
-/* import-globals-from loader.js */
-
-"use strict";
-
-// The testing framework is fully initialized at this point, you can add
-// xpcshell specific test initialization here.  If you need shared functions or
-// initialization that are not specific to xpcshell, consider adding them to
-// "head_common.js" in the parent folder instead.
-
-add_task_in_parent_process(function* test_xpcshell_initialize_profile() {
-  // We need to send the profile-after-change notification manually to the
-  // startup component to ensure it has been initialized.
-  Cc["@mozilla.org/formautofill/startup;1"]
-    .getService(Ci.nsIObserver)
-    .observe(null, "profile-after-change", "");
-});
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/loader.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Infrastructure for the xpcshell tests located in this folder.
- *
- * See "loader_common.js" in the parent folder for a general overview.
- *
- * Unless you are adding new features to the framework, you shouldn't have to
- * modify this file.  Use "head_common.js" or "head.js" for shared code.
- */
-
-"use strict";
-
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
-Cu.import("resource://gre/modules/Services.jsm", this);
-
-/* import-globals-from ../loader_common.js */
-Services.scriptloader.loadSubScript(
-  Services.io.newFileURI(do_get_file("loader_common.js")).spec, this);
-
-// Define output functions so they look the same across all frameworks.
-var Output = {
-  print: do_print,
-};
-
-var executeSoon = do_execute_soon;
-var setTimeout = (fn, delay) => do_timeout(delay, fn);
-
-// Define task registration functions, see description in "loader_common.js".
-var add_task_in_parent_process = add_task;
-var add_task_in_child_process = function() {};
-var add_task_in_both_processes = add_task;
-
-/* import-globals-from ../head_common.js */
-Services.scriptloader.loadSubScript(
-  Services.io.newFileURI(do_get_file("head_common.js")).spec, this);
-
-// Tests are always run asynchronously and with the profile loaded.
-function run_test() {
-  do_get_profile();
-  run_next_test();
-}
-
-// Reminder: unless you are adding new features to the framework, you shouldn't
-// have to modify this file.  Use "head_common.js" or "head.js" for shared code.
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/test_infrastructure.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests the local testing infrastructure.
- */
-
-"use strict";
-
-/**
- * Tests the truth assertion function.
- */
-add_task(function* test_assert_truth() {
-  Assert.ok(1 != 2);
-});
-
-/**
- * Tests the equality assertion function.
- */
-add_task(function* test_assert_equality() {
-  Assert.equal(1 + 1, 2);
-});
-
-/**
- * Uses some of the utility functions provided by the framework.
- */
-add_task(function* test_utility_functions() {
-  // The "print" function is useful to log information that is not known before.
-  let randomString = "R" + Math.floor(Math.random() * 10);
-  Output.print("The random contents will be '" + randomString + "'.");
-
-  // Create the text file with the random contents.
-  let path = yield TestUtils.getTempFile("test-infrastructure.txt");
-  yield OS.File.writeAtomic(path, new TextEncoder().encode(randomString));
-
-  // Test a few utility functions.
-  yield TestUtils.waitForTick();
-  yield TestUtils.waitMs(50);
-
-  let promiseMyNotification = TestUtils.waitForNotification("my-topic");
-  Services.obs.notifyObservers(null, "my-topic");
-  yield promiseMyNotification;
-
-  // Check the file size.  The file will be deleted automatically later.
-  Assert.equal((yield OS.File.stat(path)).size, randomString.length);
-});
-
-add_task(terminationTaskFn);
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/test_integration.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/*
- * Tests overriding the FormAutofillIntegration module functions.
- */
-
-"use strict";
-
-/**
- * The requestAutocomplete UI will not be displayed during these tests.
- */
-add_task_in_parent_process(function* test_initialize() {
-  FormAutofillTest.requestAutocompleteResponse = { canceled: true };
-});
-
-/**
- * Registers and unregisters an integration override function.
- */
-add_task(function* test_integration_override() {
-  let overrideCalled = false;
-
-  let newIntegrationFn = base => ({
-    createRequestAutocompleteUI: Task.async(function* () {
-      overrideCalled = true;
-      return yield base.createRequestAutocompleteUI.apply(this, arguments);
-    }),
-  });
-
-  FormAutofill.registerIntegration(newIntegrationFn);
-  try {
-    let ui = yield FormAutofill.integration.createRequestAutocompleteUI({});
-    let result = yield ui.show();
-    Assert.ok(result.canceled);
-  } finally {
-    FormAutofill.unregisterIntegration(newIntegrationFn);
-  }
-
-  Assert.ok(overrideCalled);
-});
-
-/**
- * Registers an integration override function that throws an exception, and
- * ensures that this does not block other functions from being registered.
- */
-add_task(function* test_integration_override_error() {
-  let overrideCalled = false;
-
-  let errorIntegrationFn = base => { throw "Expected error." };
-
-  let newIntegrationFn = base => ({
-    createRequestAutocompleteUI: Task.async(function* () {
-      overrideCalled = true;
-      return yield base.createRequestAutocompleteUI.apply(this, arguments);
-    }),
-  });
-
-  FormAutofill.registerIntegration(errorIntegrationFn);
-  FormAutofill.registerIntegration(newIntegrationFn);
-  try {
-    let ui = yield FormAutofill.integration.createRequestAutocompleteUI({});
-    let result = yield ui.show();
-    Assert.ok(result.canceled);
-  } finally {
-    FormAutofill.unregisterIntegration(errorIntegrationFn);
-    FormAutofill.unregisterIntegration(newIntegrationFn);
-  }
-
-  Assert.ok(overrideCalled);
-});
-
-add_task(terminationTaskFn);
deleted file mode 100644
--- a/toolkit/components/formautofill/test/xpcshell/xpcshell.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[DEFAULT]
-head = loader.js head.js
-skip-if = toolkit == 'android'
-# The following files starting with ".." are installed in the current folder.
-# However, they cannot be referenced directly in the "head" directive above.
-support-files =
-  ../head_common.js
-  ../loader_common.js
-
-[test_infrastructure.js]
-[test_integration.js]
--- a/toolkit/components/moz.build
+++ b/toolkit/components/moz.build
@@ -26,17 +26,16 @@ DIRS += [
     'contextualidentity',
     'crashmonitor',
     'diskspacewatcher',
     'downloads',
     'extensions',
     'exthelper',
     'filewatcher',
     'finalizationwitness',
-    'formautofill',
     'find',
     'jsdownloads',
     'jsoncpp/src/lib_json',
     'lz4',
     'mediasniffer',
     'microformats',
     'mozprotocol',
     'osfile',
deleted file mode 100644
--- a/toolkit/themes/shared/formautofill/requestAutocomplete.css
+++ /dev/null
@@ -1,11 +0,0 @@
-/* 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/. */
-
-@import url("chrome://global/skin/in-content/common.css");
-
-:root {
-  height: 100%;
-  width: 100%;
-  padding: 0;
-}
--- a/toolkit/themes/shared/mozapps.inc.mn
+++ b/toolkit/themes/shared/mozapps.inc.mn
@@ -9,17 +9,16 @@
 
   skin/classic/mozapps/extensions/extensionGeneric.svg       (../../shared/extensions/extensionGeneric.svg)
   skin/classic/mozapps/extensions/utilities.svg              (../../shared/extensions/utilities.svg)
   skin/classic/mozapps/extensions/navigation.png             (../../shared/extensions/navigation.png)
   skin/classic/mozapps/extensions/alerticon-warning.svg      (../../shared/extensions/alerticon-warning.svg)
   skin/classic/mozapps/extensions/alerticon-error.svg        (../../shared/extensions/alerticon-error.svg)
   skin/classic/mozapps/extensions/alerticon-info-positive.svg (../../shared/extensions/alerticon-info-positive.svg)
   skin/classic/mozapps/extensions/alerticon-info-negative.svg (../../shared/extensions/alerticon-info-negative.svg)
-  skin/classic/mozapps/formautofill/requestAutocomplete.css  (../../shared/formautofill/requestAutocomplete.css)
   skin/classic/mozapps/plugins/pluginProblem.css             (../../shared/plugins/pluginProblem.css)
   skin/classic/mozapps/aboutNetworking.css                   (../../shared/aboutNetworking.css)
 #ifndef ANDROID
   skin/classic/mozapps/aboutProfiles.css                     (../../shared/aboutProfiles.css)
 #endif
   skin/classic/mozapps/aboutServiceWorkers.css               (../../shared/aboutServiceWorkers.css)
   skin/classic/mozapps/plugins/contentPluginActivate.png     (../../shared/plugins/contentPluginActivate.png)
   skin/classic/mozapps/plugins/contentPluginBlocked.png      (../../shared/plugins/contentPluginBlocked.png)