// Copyright 2014 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_CONTENT_BROWSER_CONTENT_AUTOFILL_DRIVER_H_ #define COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_DRIVER_H_ #include <optional> #include <string> #include <vector> #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "base/types/optional_ref.h" #include "components/autofill/content/browser/content_autofill_client.h" #include "components/autofill/content/common/mojom/autofill_agent.mojom.h" #include "components/autofill/content/common/mojom/autofill_driver.mojom.h" #include "components/autofill/core/browser/autofill_driver.h" #include "components/autofill/core/browser/autofill_manager.h" #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_widget_host.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_receiver.h" namespace autofill { class ContentAutofillDriverFactory; class AutofillDriverRouter; // ContentAutofillDriver drives the Autofill flow in the browser process based // on communication from the renderer and from the external world. // // Each ContentAutofillDriver is associated with exactly one RenderFrameHost // and communicates with exactly one AutofillAgent throughout its entire // lifetime. // // This RenderFrameHost owns all forms and fields in the renderer-browser // communication: // - ContentAutofillDriver may assume that forms and fields received in the // mojom::AutofillDriver events are owned by that RenderFrameHost. // - Conversely, the forms and fields which ContentAutofillDriver passes to // mojom::AutofillAgent events must be owned by that RenderFrameHost. // // Events in AutofillDriver and mojom::AutofillDriver are passed on to // AutofillDriverRouter, which has one instance per WebContents. The naming // pattern is that for all of these events, there are two functions: // // 1. ReturnType ContentAutofillDriver::Foo(Args...) // 2. ReturnType AutofillDriverRouter::Foo(RoutedCallback, Args...) // // The first function calls the second, and the second calls the callback. // That callback takes a target AutofillDriver, which may be different from the // first function's ContentAutofillDriver. // // Consider the following pseudo-HTML: // <!-- frame name "ABC" --> // <form> // <input> <!-- renderer_id = 12 --> // <input> <!-- renderer_id = 34 --> // <iframe name="DEF"> // <input> <!-- renderer_id = 56 --> // <input> <!-- renderer_id = 78 --> // </iframe> // </form> // In this case, the frame "ABC" holds a form with fields // FormFieldData{.host_frame = ABC, .renderer_id = 12, ...}, // FormFieldData{.host_frame = ABC, .renderer_id = 34, ...}, // and the frame "DEF" holds a form with fields // FormFieldData{.host_frame = DEF, .renderer_id = 56, ...}, // FormFieldData{.host_frame = DEF, .renderer_id = 78, ...}. // The SendFieldsEligibleForManualFillingToRenderer() event, for example, is // initiated by ABC's AutofillManager by calling // abc_driver->SendFieldsEligibleForManualFillingToRenderer({ // FieldGlobalId{.host_frame = ABC, .renderer_id = 12}, // FieldGlobalId{.host_frame = ABC, .renderer_id = 34}, // FieldGlobalId{.host_frame = DEF, .renderer_id = 56}, // FieldGlobalId{.host_frame = DEF, .renderer_id = 78} // }). // |abc_driver| forwards the event to the router by calling // router->SendFieldsEligibleForManualFillingToRenderer(abc_driver, { // FieldGlobalId{.host_frame = ABC, .renderer_id = 12}, // FieldGlobalId{.host_frame = ABC, .renderer_id = 34}, // FieldGlobalId{.host_frame = DEF, .renderer_id = 56}, // FieldGlobalId{.host_frame = DEF, .renderer_id = 78} // }, callback). // The router splits the groups the fields by their host frame token and routes // the calls to the respective frame's drivers: // callback(abc_driver, { // FieldRendererId{.renderer_id = 12}, // FieldRendererId{.renderer_id = 34}, // }); // callback(def_driver, { // FieldRendererId{.renderer_id = 56}, // FieldRendererId{.renderer_id = 78} // }); // These callbacks call the agents in the renderer processes: // abc_agent->SetFieldsEligibleForManualFilling({ // FieldRendererId{.renderer_id = 12}, // FieldRendererId{.renderer_id = 34}, // }); // def_agent->SetFieldsEligibleForManualFilling({ // FieldRendererId{.renderer_id = 56}, // FieldRendererId{.renderer_id = 78} // }); // // See AutofillDriverRouter for further details. class ContentAutofillDriver : public AutofillDriver, public mojom::AutofillDriver { … }; } // namespace autofill #endif // COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_DRIVER_H_