[Autofill] Refactor routing in ContentAutofillDriver
Most functions in ContentAutofillDriver follow the same pattern:
ContentAutofillDriver::Foo() calls AutofillDriverRouter::Foo() and
passes a callback to ADR::Foo(). That callback forwards the call either
- to mojom::AutofillAgent for browser->renderer events or
- to AutofillManager for renderer->browser events.
Each of the renderer->browser CAD::Foo() implementations needs to
take care of some additional complexity:
(1) CAD::Foo() must, before calling ADR::Foo(), lift the parameters
to the browser. That includes setting form and field meta data
such as the host frame's LocalFrameToken and transforming
coordinates.
(2) CAD::Foo()'s callback must bump the FormData::version of each
flattened form. (That's a temporary hack to recognize which of
two FormDatas is more recent in AutofillManager and friends.)
(3) It must check if the sending RFH is in prerendering mode and crash
the renderer if so.
(4) It should also check that, if the event is parameterized by
a FormFieldData and a FieldRendererId, the two are associated.
(Implemented only in the followup CL crrev.com/c/5581598.)
The function where this complexity spectacularly multiplies is
CAD::ExtractForm(). The reason is its Mojo response callback, leads
to a complicated nesting of callbacks.
This CL refactors this complexity. It introduces two helper functions,
RouteToAgent() and RouteToManger(), for the browser->renderer and
renderer->browser events, respectively. These functions take care of
(1-4). That is, the responsibility to do (1-4) is separated from the
individual CAD::Foo() functions. (As mentioned above, (4) comes
in the followup CL crrev.com/c/5581598.)
The main advantages of the CL are:
- Added robustness as its harder to forget (1-4).
- Obvious direction of routing: CAD::Foo() now explicitly says
which direction it goes.
- Massive simplification of CAD::ExtractForm(), which shrinks from
30 lines of code + 40 lines of comments to 8 lines of code.
There's no free lunch. The main downsides of this CL are arguably:
- The signatures of RouteToAgent() and RouteToManager() are
intimidating. However, these signatures do not represent new
complexity -- it was there before in each OnFoo(), but not
represented explicitly in the type system.
- There are various overloads for lifting parameters.
This refactoring is possible since crrev.com/c/5526439 migrated
the callbacks in AutofillDriverRouter from C-style pointers to
base::FunctionRefs, which accept lambdas with captures, which in
turn this CL uses in RouteToAgent() and RouteToManager().
It was further simplified by the replacement of FormFieldData with
Field{Renderer,Global}Id in crrev.com/c/5581235, crrev.com/c/5585316.
Bug: 40173073, 40232021
Change-Id: Icf59f7586307865c93f859bc407d7129f1eb5a06
Cq-Do-Not-Cancel-Tryjobs: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5546430
Reviewed-by: Jan Keitel <jkeitel@google.com>
Commit-Queue: Christoph Schwering <schwering@google.com>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1309220}
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.
The project's web site is https://www.chromium.org.
To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.
Documentation in the source is rooted in docs/README.md.
Learn how to Get Around the Chromium Source Code Directory Structure.
For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.
If you found a bug, please file it at https://crbug.com/new.