/* 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/. */ const lazy = {}; import { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs"; ChromeUtils.defineESModuleGetters(lazy, { FormAutofillUtils: "resource://gre/modules/shared/FormAutofillUtils.sys.mjs", }); class Autofill { constructor(sessionId, eventDispatcher) { this.eventDispatcher = eventDispatcher; this.sessionId = sessionId; } start() { this.eventDispatcher.sendRequest({ type: "GeckoView:StartAutofill", sessionId: this.sessionId, }); } add(node) { return this.eventDispatcher.sendRequestForResult({ type: "GeckoView:AddAutofill", node, }); } focus(node) { this.eventDispatcher.sendRequest({ type: "GeckoView:OnAutofillFocus", node, }); } update(node) { this.eventDispatcher.sendRequest({ type: "GeckoView:UpdateAutofill", node, }); } commit(node) { this.eventDispatcher.sendRequest({ type: "GeckoView:CommitAutofill", node, }); } clear() { this.eventDispatcher.sendRequest({ type: "GeckoView:ClearAutofill", }); } } class AutofillManager { sessions = new Set(); autofill = null; ensure(sessionId, eventDispatcher) { if (!this.sessions.has(sessionId)) { this.autofill = new Autofill(sessionId, eventDispatcher); this.sessions.add(sessionId); this.autofill.start(); } // This could be called for an outdated session, in which case we will just // ignore the autofill call. if (sessionId !== this.autofill.sessionId) { return null; } return this.autofill; } get(sessionId) { if (!this.autofill || sessionId !== this.autofill.sessionId) { warn`Disregarding old session ${sessionId}`; // We disregard old sessions return null; } return this.autofill; } delete(sessionId) { this.sessions.delete(sessionId); if (!this.autofill || sessionId !== this.autofill.sessionId) { // this delete call might happen *after* the next session already // started, in that case, we can safely ignore this call. return; } this.autofill.clear(); this.autofill = null; } } export var gAutofillManager = new AutofillManager(); // Runtime functionality export const GeckoViewAutofillRuntime = { async onEvent(aEvent, aData, aCallback) { debug`onEvent: event=${aEvent}, data=${aData}`; switch (aEvent) { case "GeckoView:Autofill:GetAddressStructure": { debug`onEvent: event=${aEvent}, data=${aData}`; const country = aData.country ? aData.country : "US"; const layout = lazy.FormAutofillUtils.getFormLayout({ country: `${country}`, }); aCallback.onSuccess({ fields: layout, }); break; } } }, }; const { debug, warn } = GeckoViewUtils.initLogging("Autofill");