// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_AUTOFILL_CORE_COMMON_FORM_DATA_H_ #define COMPONENTS_AUTOFILL_CORE_COMMON_FORM_DATA_H_ #include <limits> #include <string> #include <string_view> #include <utility> #include <vector> #include "build/build_config.h" #include "components/autofill/core/common/form_field_data.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" #include "components/autofill/core/common/unique_ids.h" #include "url/gurl.h" #include "url/origin.h" namespace autofill_prediction_improvements { class AutofillPredictionImprovementsFillingEngineImpl; } // namespace autofill_prediction_improvements namespace autofill { class LogBuffer; namespace internal { class FormForest; } // Pair of a button title (e.g. "Register") and its type (e.g. // INPUT_ELEMENT_SUBMIT_TYPE). ButtonTitleInfo; // List of button titles of a given form. ButtonTitleList; FormVersion; // Element of FormData::child_frames. struct FrameTokenWithPredecessor { … }; // Autofill represents forms and fields as FormData and FormFieldData objects. // // On the renderer side, there are roughly one-to-one correspondences // - between FormData and blink::WebFormElement, and // - between FormFieldData and blink::WebFormControlElement, // where the Blink classes directly correspond to DOM elements. // // On the browser side, there are one-to-one correspondences // - between FormData and FormStructure, and // - between FormFieldData and AutofillField, // where AutofillField and FormStructure hold additional information, such as // Autofill type predictions and sectioning. // // A FormData is essentially a collection of FormFieldDatas with additional // metadata. // // FormDatas and FormFieldDatas are used in the renderer-browser communication: // - The renderer passes a FormData and/or FormFieldData to the browser when it // has found a new form in the DOM, a form was submitted, etc. (see // mojom::AutofillDriver). // - The browser passes a FormData and/or FormFieldData to the renderer for // preview, filling, etc. (see mojom::AutofillAgent). In the preview and // filling cases, the browser sets the field values to the values to be // previewed or filled. // // There are a few exceptions to the aforementioned one-to-one correspondences // between Autofill's data types and Blink's: // - Autofill only supports certain types of WebFormControlElements: select, // textarea, and input elements whose type [4] is one of the following: // checkbox, email, month, number, password, radio, search, tel, text, url // (where values not listed in [4] default to "text", and "checkbox" and // "radio" inputs are currently not filled). In particular, form-associated // custom elements [3] are not supported. // - Autofill has the concept of an unowned form, which does not correspond to // an existing blink::WebFormElement. // - Autofill may move FormFieldDatas to other FormDatas across shadow/main // DOMs and across frames. // // In Blink, a field can, but does not have to be associated with a form. A // field is *associated* with a form iff either: // - it is a descendant of a <form> element, or // - it has its "form" attribute set to the ID of a <form> element. // Note that this association does not transcend DOMs. See [1] for details. // // In Autofill, we lift Blink's form association across DOMs. We say a field is // *owned* by a form iff: // - the field is associated with that form, or // - the field is unassociated and the form is its nearest shadow-including // ancestor [2]. // So the difference between the two terms is that a field in a shadow DOM may // be unassociated but owned (by a <form> in an ancestor DOM). // // Example: // <body> // <form> // <input id=A> // </form> // <input id=B> // <form> // #shadow-root // <input id=C> // </form> // </body> // The input A is an associated and owned field. // The input B is an unassociated and unowned field. // The input C is an unassociated but an owned field. // // TODO(crbug.com/40195555): Currently, Autofill ignores unowned fields in // shadow DOMs. // // The unowned fields of the frame constitute that frame's *unowned form*. // // Forms from different frames of the same WebContents may furthermore be // merged. For details, see AutofillDriverRouter. // // clang-format off // [1] https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#reset-the-form-owner // [2] https://dom.spec.whatwg.org/#concept-shadow-including-descendant // [3] https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-face-example // [4] https://html.spec.whatwg.org/multipage/input.html#attr-input-type // clang-format on class FormData { … }; // Whether any of the fields in |form| is a non-empty password field. bool FormHasNonEmptyPasswordField(const FormData& form); // For testing. std::ostream& operator<<(std::ostream& os, const FormData& form); #if defined(UNIT_TEST) inline bool operator==(const FormData& lhs, const FormData& rhs) { return FormData::DeepEqual(lhs, rhs); } #endif // defined(UNIT_TEST) // Serialize FormData. Used by the PasswordManager to persist FormData // pertaining to password forms. Serialized data is appended to |pickle|. void SerializeFormData(const FormData& form_data, base::Pickle* pickle); // Deserialize FormData. This assumes that |iter| is currently pointing to // the part of a pickle created by SerializeFormData. Returns true on success. bool DeserializeFormData(base::PickleIterator* iter, FormData* form_data); LogBuffer& operator<<(LogBuffer& buffer, const FormData& form); } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_COMMON_FORM_DATA_H_