diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs')
-rw-r--r-- | toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs b/toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs new file mode 100644 index 0000000000..1aa713b5b7 --- /dev/null +++ b/toolkit/components/formautofill/FormAutofillChild.ios.sys.mjs @@ -0,0 +1,107 @@ +/* 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/. */ + +/* eslint-disable no-undef,mozilla/balanced-listeners */ +import { FormAutofillUtils } from "resource://gre/modules/shared/FormAutofillUtils.sys.mjs"; +import { FormStateManager } from "resource://gre/modules/shared/FormStateManager.sys.mjs"; +import { CreditCardRecord } from "resource://gre/modules/shared/CreditCardRecord.sys.mjs"; + +export class FormAutofillChild { + /** + * Creates an instance of FormAutofillChild. + * + * @param {object} callbacks - An object containing callback functions. + * @param {object} callbacks.address - Callbacks related to addresses. + * @param {Function} callbacks.address.autofill - Function called to autofill address fields. + * @param {Function} callbacks.address.submit - Function called on address form submission. + * @param {object} callbacks.creditCard - Callbacks related to credit cards. + * @param {Function} callbacks.creditCard.autofill - Function called to autofill credit card fields. + * @param {Function} callbacks.creditCard.submit - Function called on credit card form submission. + */ + constructor(callbacks) { + this.onFocusIn = this.onFocusIn.bind(this); + this.onSubmit = this.onSubmit.bind(this); + + this.callbacks = callbacks; + + this.fieldDetailsManager = new FormStateManager(); + + document.addEventListener("focusin", this.onFocusIn); + document.addEventListener("submit", this.onSubmit); + } + + _doIdentifyAutofillFields(element) { + this.fieldDetailsManager.updateActiveInput(element); + this.fieldDetailsManager.identifyAutofillFields(element); + + const activeFieldName = + this.fieldDetailsManager.activeFieldDetail?.fieldName; + + const activeFieldDetails = + this.fieldDetailsManager.activeSection?.fieldDetails; + + // Only ping swift if current field is either a cc or address field + if (!activeFieldDetails?.find(field => field.element === element)) { + return; + } + + const fieldNamesWithValues = + this.transformToFieldNamesWithValues(activeFieldDetails); + if (FormAutofillUtils.isAddressField(activeFieldName)) { + this.callbacks.address.autofill(fieldNamesWithValues); + } else if (FormAutofillUtils.isCreditCardField(activeFieldName)) { + // Normalize record format so we always get a consistent + // credit card record format: {cc-number, cc-name, cc-exp-month, cc-exp-year} + CreditCardRecord.normalizeFields(fieldNamesWithValues); + this.callbacks.creditCard.autofill(fieldNamesWithValues); + } + } + + transformToFieldNamesWithValues(details) { + return details?.reduce( + (acc, field) => ({ + ...acc, + [field.fieldName]: field.element.value, + }), + {} + ); + } + + onFocusIn(evt) { + const element = evt.target; + this.fieldDetailsManager.updateActiveInput(element); + if (!FormAutofillUtils.isCreditCardOrAddressFieldType(element)) { + return; + } + this._doIdentifyAutofillFields(element); + } + + onSubmit(evt) { + if (!this.fieldDetailsManager.activeHandler) { + return; + } + + this.fieldDetailsManager.activeHandler.onFormSubmitted(); + const records = this.fieldDetailsManager.activeHandler.createRecords(); + + if (records.creditCard.length) { + // Normalize record format so we always get a consistent + // credit card record format: {cc-number, cc-name, cc-exp-month, cc-exp-year} + const creditCardRecords = records.creditCard.map(entry => { + CreditCardRecord.normalizeFields(entry.record); + return entry.record; + }); + this.callbacks.creditCard.submit(creditCardRecords); + } + + // TODO(FXSP-133 Phase 3): Support address capture + // this.callbacks.address.submit(); + } + + fillFormFields(payload) { + this.fieldDetailsManager.activeHandler.autofillFormFields(payload); + } +} + +export default FormAutofillChild; |