[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}
6 files changed
tree: f530c1b49a39fb227097357c4b56bc12f895f1c0
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. CPPLINT.cfg
  71. DEPS
  72. DIR_METADATA
  73. LICENSE
  74. LICENSE.chromium_os
  75. OWNERS
  76. PRESUBMIT.py
  77. PRESUBMIT_test.py
  78. PRESUBMIT_test_mocks.py
  79. README.md
  80. WATCHLISTS
README.md

Logo Chromium

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.