[soft navs] Integrates PaintTimingMixin into SoftNavigation entry.

The soft-navigation entry will now measure and report paint timings,
which is useful as the "first contentful paint" (FCP).

It also has a side benefit: by delaying until after presentation time is
measured, we delay emitting the performance entry to the performance
timeline. This gives Event Timing enough time to report entries (well,
for click and keyboard entries, which is all we support, for now).

This still isn't perfect: the current paint timing isn't necessarily the
"first contentful paint" in the same sense as hard-FCP:

- We delay measuring until after navigationID is incremented-- but this isn't guaranteed to happen in the "first" paint for the Context.  Today, our paint area requirement is so small that it is highly likely to be.  Still, we won't emit LCP until after this point, either.
- We use LCP semantics: ie fully loaded images, because we only check for navigations after "LCP candidates" arrive.  This has additional benefits such as actually checking if the content is visible, but it does delay the timing.  Perhaps a more proper description would be: Hard FCP is "first paint of the first animation frame with any contentful nodes", while Soft FCP is currently "first fully contentful paint" which is also equivalent to first LCP candidate.

In the future soft.FCP might no longer be first soft.LCP candidate, if
we record the first paint before navigation is emitted.

Bug: 424448145
Change-Id: I24d3f14c580b0c88e9c6416fe424d60e81b098c0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6657746
Commit-Queue: Michal Mocny <mmocny@chromium.org>
Reviewed-by: Scott Haseley <shaseley@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1476948}
15 files changed
tree: 62233ddf8782ff81469f7c9f0685dbc54e0f06ed
  1. .github/
  2. android_webview/
  3. apps/
  4. ash/
  5. base/
  6. build/
  7. build_overrides/
  8. buildtools/
  9. cc/
  10. chrome/
  11. chromecast/
  12. chromeos/
  13. codelabs/
  14. components/
  15. content/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. gpu/
  25. headless/
  26. infra/
  27. ios/
  28. ipc/
  29. media/
  30. mojo/
  31. native_client_sdk/
  32. net/
  33. pdf/
  34. ppapi/
  35. printing/
  36. remoting/
  37. rlz/
  38. sandbox/
  39. services/
  40. skia/
  41. sql/
  42. storage/
  43. styleguide/
  44. testing/
  45. third_party/
  46. tools/
  47. ui/
  48. url/
  49. webkit/
  50. .clang-format
  51. .clang-tidy
  52. .clangd
  53. .cursorignore
  54. .git-blame-ignore-revs
  55. .gitallowed
  56. .gitattributes
  57. .gitignore
  58. .gitmodules
  59. .gn
  60. .mailmap
  61. .rustfmt.toml
  62. .vpython3
  63. .yapfignore
  64. ATL_OWNERS
  65. AUTHORS
  66. BUILD.gn
  67. CODE_OF_CONDUCT.md
  68. codereview.settings
  69. CPPLINT.cfg
  70. CRYPTO_OWNERS
  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. SECURITY_OWNERS
  81. 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.