Consistent country code for new addresses

When adding a new address in settings, the default value of the country
select is determined using PDM::GetDefaultCountryCodeForNewAddress().
It returns either the ADM::MostCommonCountryCodeFromProfiles() or falls
back to GetCountryCodeForExperimentGroup(). The latter function
considers the variation country code, the country code of the current
time zone and the country of the app locale, in this order.
In addition, there is some caching going on, ensuring that the most
common country doesn't change when profiles are added.

On form import, the logic works different. It prefers the country
observed in the submitted form and falls back to either the variation
country code or the app locale.

This CL simplifies the logic used for settings to match the form import
logic (that is, only consider variation country code and app locale).

In particular, this CL:
- Removes ADM::MostCommonCountryCodeFromProfiles() and the cached value
  in ADM::most_common_country_code_.
- Moves PDM::GetDefaultCountryCodeForNewAddress() to the ADM and
  simplifies its implementation to only consider variation country code
  and app locale. To do so, the variation country code is passed in to
  the ADM via its constructor.
  The function now returns an AddressCountryCode (strong alias for
  std::string) instead of std::string.
- Removes the tests for GetDefaultCountryCodeForNewAddress(), which are
  concerned about the (now removed) caching behavior.
- Updates FormDataImporter::ComplementCountry() to use
  ADM::GetDefaultCountryCodeForNewAddress(), instead of duplicating the
  logic to derived the fallback country code. This makes
  ADM::GetDefaultCountryCodeForNewAddress() the single source of truth.
  This regresses the output to autofill-internals somewhat, since only
  the fallback country code is logged, not how it was derived.
- Removes GetPredictedCountryCode(), which was previously used in the
  form import logic.

Since PDM::GetDefaultCountryCodeForNewAddress() is moved to the ADM,
the few existings calls are forwarded to the ADM using the PDM's
address_data_manager() getter.

Bug: b/322170538
Change-Id: I5f8dba64ac00eb9add2c6a924b0533bb79a46251
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5439418
Reviewed-by: Dominic Battre <battre@chromium.org>
Reviewed-by: Jan Keitel <jkeitel@google.com>
Commit-Queue: Florian Leimgruber <fleimgruber@google.com>
Cr-Commit-Position: refs/heads/main@{#1286372}
22 files changed
tree: 8e7e48dd36c92a1a5345c6e1c2bd7fc3703b433d
  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. DEPS
  71. DIR_METADATA
  72. LICENSE
  73. LICENSE.chromium_os
  74. OWNERS
  75. PRESUBMIT.py
  76. PRESUBMIT_test.py
  77. PRESUBMIT_test_mocks.py
  78. README.md
  79. 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.