[omnibox][history-embeddings] Add IPH for chrome://settings/ai

https://screenshot.googleplex.com/PdXgDM92PDgttgW

When,
1) the user is in @history scope, and
2) the setting is disabled, and
3) the setting is available, and
4) the user hasn't dismissed the IPH, and
5) we've shown less than 3 IPHs

Then this chrome://settings/ai IPH is shown.

Changes:
- Wires `optimization_guide::UserVisibleFeatureKey` API from the
  optimization component to the autocomplete provider client to check
  for (3) above.
- Adds `ChromeOmniboxClient::OpenIphLink()` to allow opening arbitrary
  links from the views code. In the past, the omnibox/popup views only
  did navigations through updating the location bar, so this wasn't
  necessary. But for this IPH, and upcoming IPHs, we'll need to open
  arbitrary links like chrome://settings or google help articles.
- Adds a `view::Link` child view to `OmniboxMatchCellView`. Now, it's
  composed of <contents><separator><description><iph_link>. This allows
  the IPH link has to be clickable and blue.
- Makes the `OmniboxMatchCellView` interactable. Before, it ignored
  mouse events and its parent `OmniboxResultView` handled clicks &
  hovers. But since the IPH link has to be clickable while the rest of
  the match isn't, so `OmniboxMatchCellView` is now interactable.
- Replaced some `IsFeaturedSearchIPHEnabled()` and `provider ==
  TYPE_FEATURED_SEARCH` checks with
  `AutocmopleteMatch::IsIPHSuggestion()`, since we can have starter pack
  and history embedding IPH matches even if featured search IPH is
  disable.
- Previously, the featured search provider only ran for unscoped input.
  Now it runs for @history scope as well, but it will early exit after
  potentially adding the history embedding IPH.
- Previously, IPH matches were only shown on zero state, so it relied on
  the groupers to guarantee they were ranked last. The new history
  embeddings matches are shown for typed state too, so traditional
  grouping via `GetSortingOrder()` now ranks IPH matches last too.
- Adds 2 new fields to the `AutocomleteMatch`: the IPH link text and
  URL.
- Updates the 'show IPH match at most 3 times per browser window' limit
  checking so that it counts IPH's shown multiple times in a single
  omnibox session as 1 show count. This doesn't affect the existing
  IPH's since they were shown only on focus and therefore only once per
  session anyways. But it makes sure that typing '@history 12345' counts
  as 1 IPH shown even though the IPH is shown for '1', '12', ...,
  '12345' 5 times.
- Does not change the IPH 3-shown-limit to persist beyond browser
  windows. When opening a new browser or restarting chrome, the IPH's
  can be shown an additional 3 times. This is incorrect but existing
  behavior.

 under-coverage are pass-throughs that don't have test-worth logic.
 Except featured_search_provider.cc which I plan to add tests for the
 new code in follow up CLs.
 345536430

Low-Coverage-Reason: TRIVIAL_CHANGE The files reported for
Bug: 345536978, 345536438,
Change-Id: I82fb13dea0b6e7c18c5f3a89d2b172f1f3693d6e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5747136
Reviewed-by: Angela Yoeurng <yoangela@chromium.org>
Commit-Queue: manuk hovanesian <manukh@chromium.org>
Reviewed-by: Sophie Chang <sophiechang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1335781}
29 files changed
tree: 66f816d9cc60e07008ea96fddc57b6a2b92ad7d6
  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.