Reland "[discard] Ensures FrameNodes transition lifecycle state correctly"

This is a reland of commit 758f6c0a6405fb473d2e42e4dd55dd9a44986c50

Initialized page_lifecycle_state_ (see diff against PS1).

Original change's description:
> [discard] Ensures FrameNodes transition lifecycle state correctly
>
> The current implementation of web-contents retaining tab discard
> can result in invalid lifecycle state transitions for frozen tabs.
>
> Consider the following event flow:
>   1. A tab is frozen
>   2. The same tab is then discarded
>   3. The page lifecycle state is synchronously updated to DISCARDED
>      in TabLifecycleUnit::FinishDiscardAndPreserveWebContents()
>   4. The synchronous shutdown of the RenderProcessHost causes a
>      FrameNodeObserver::OnFrameNodeRemoved() event to be queued
>      on the performance manager graph thread
>   5. This changes the balance of frozen frames and the frame tree
>      is interpreted as ACTIVE
>        This queues a update-lifecycle-state ACTIVE event on the
>        main thread
>   6. On the main thread a state transition from DISCARDED to ACTIVE
>      is attempted (which is invalid, the tab is still discarded)
>
> This results in the tab being set to an invalid page lifecycle
> state. Consequently further discards may be attempted on the tab
> given it is flagged ACTIVE, however these will either fail or no-op
> as the tab is actually discarded.
>
> This CL addresses this issue by updating the TabLifecycleUnit to
> independently keep track of:
>   - if the WebContents is discarded in `is_discarded_`
>   - the page's LifecycleState in `page_lifecycle_state_`
>       this is either kActive or kFrozen (kDiscarded is removed)
>
> The LifecycleUnitState is the computed based on the above. This is
> done since it is possible to end up with a discarded page who's
> lifecycle state is either kActive or kFrozen.
>
> Bug: 394242157
> Change-Id: I42517404b90ddd593c57e12b8bf48b4433e3227a
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6229171
> Reviewed-by: Sam McNally <sammc@chromium.org>
> Reviewed-by: Francois Pierre Doray <fdoray@chromium.org>
> Commit-Queue: Thomas Lukaszewicz <tluk@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1417926}

Bug: 394242157
Change-Id: Ia02ef7345691c60ed2019caecd27689ebca3b87a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6248477
Reviewed-by: Francois Pierre Doray <fdoray@chromium.org>
Reviewed-by: Sam McNally <sammc@chromium.org>
Commit-Queue: Thomas Lukaszewicz <tluk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1418326}
4 files changed
tree: 0568653d1bb3935dbedc32ef048ced6fcb5fc347
  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. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. 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.