Backed out changeset f594e6f00208 (bug 1940883) for causing crashes in bug 1941164.
[gecko.git] / toolkit / components / formautofill / shared / FormStateManager.sys.mjs
blob7bef5a36f41a7828a7b7c5a007a30ea66251dd5b
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 const lazy = {};
6 ChromeUtils.defineESModuleGetters(lazy, {
7   AutofillFormFactory:
8     "resource://gre/modules/shared/AutofillFormFactory.sys.mjs",
9   FormAutofillHandler:
10     "resource://gre/modules/shared/FormAutofillHandler.sys.mjs",
11   FormAutofillUtils: "resource://gre/modules/shared/FormAutofillUtils.sys.mjs",
12 });
14 export class FormStateManager {
15   #formHandlerByElement = new WeakMap();
16   #formHandlerByRootElement = new WeakMap();
17   #formHandlerByRootId = new Map();
19   constructor(onFilledModifiedCallback) {
20     /**
21      * @type {WeakMap} mapping FormLike root HTML elements to FormAutofillHandler objects.
22      */
24     this.onFilledModifiedCallback = onFilledModifiedCallback;
25   }
27   getWeakIdentifiedForms() {
28     return ChromeUtils.nondeterministicGetWeakMapKeys(
29       this.#formHandlerByRootElement
30     );
31   }
33   /**
34    * Get the form handler for the specified input element.
35    *
36    * @param {HTMLInputElement} element
37    *        Focused input which triggered profile searching
38    * @returns {FormAutofillHandler | null}
39    *        The form handler associated with the specified input element.
40    */
41   getFormHandler(element) {
42     if (!element) {
43       return null;
44     }
46     let handler = this.#formHandlerByElement.get(element);
47     if (handler) {
48       return handler;
49     }
51     const rootElement = lazy.AutofillFormFactory.findRootForField(element);
52     return this.#formHandlerByRootElement.get(rootElement);
53   }
55   /**
56    * Get the form handler for the specified root element.
57    *
58    * @param {string} rootElementId
59    *        the id of the root element
60    * @returns {FormAutofillHandler | null}
61    *        The form handler associated with the specified input element.
62    */
63   getFormHandlerByRootElementId(rootElementId) {
64     return this.#formHandlerByRootId.get(rootElementId);
65   }
67   /**
68    * Get the form handler for the specified input element. If no handler exists
69    * in the cache, this function creates a new one.
70    *
71    * @param {HTMLInputElement} element
72    *        Focused input which triggered profile searching
73    * @returns {FormAutofillHandler}
74    *        The form handler associated with the specified input element.
75    */
76   getOrCreateFormHandler(element) {
77     let handler = this.getFormHandler(element);
78     if (!handler) {
79       handler = new lazy.FormAutofillHandler(
80         lazy.AutofillFormFactory.createFromField(element),
81         this.onFilledModifiedCallback
82       );
84       const root = handler.form.rootElement;
85       const rootElementId = lazy.FormAutofillUtils.getElementIdentifier(root);
86       this.#formHandlerByRootId.set(rootElementId, handler);
87       this.#formHandlerByRootElement.set(root, handler);
88       handler.form.elements.forEach(ele =>
89         this.#formHandlerByElement.set(ele, handler)
90       );
91     }
92     return handler;
93   }
96 export default FormStateManager;