ozone/wayland: Fix edge cases when capturing tab from occluded window

This change fixes two edge cases when a window containing a captured tab
gets occluded:

1. Mutter blocks frame callbacks initially when window gets occluded but
it doesn't send a suspended state until 3 seconds after [1]. This causes
a 3 second freeze when switching workspaces, and doesn't make the window
inactive, which is what the current workaround uses. The mutter
developers clarified that they would prefer to retain the delay as it is
not guaranteed to indicate the "occlusion" transition as per the
protocol. So a different client-side fix is added here instead, where a
timer is used to detect the frame callback freeze, and playback is
continued without waiting for frame callbacks.

2. In kwin instead of frame callbacks being blocked on window occlusion
[2], buffers get blocked instead which was freezing the tab capture
completely when switching away from workspace containing the captured
tab, but in recent plasma (tested on 6.2.5) it at least seems to send
SUSPENDED state now, at the end of the workspace transition. So another
workaround is added here to clear submitted buffers of all submitted
frames, and not just the last submitted frame, when the suspended state
is received and playback can continue without sending surface commits to
wayland as before. This makes the capture continue when switching
workspaces in KDE. There is still a tiny freeze in KDE during the
workspace animation until the suspended state is received, but that is
not too severe. In order to fix the issue for that tiny delay or older
KDE versions that don't send suspended state, a follow-up fix may be
added that can track timeouts for buffer releases as well.

[1] https://gitlab.gnome.org/GNOME/mutter/-/issues/3663
[2] https://bugs.kde.org/show_bug.cgi?id=492924

Bug: 364197252
Change-Id: Ie055187f5cad8f116f5b0a34fb91c217cf9492f5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6258396
Reviewed-by: Kramer Ge <fangzhoug@chromium.org>
Commit-Queue: Orko Garai <orko@igalia.com>
Cr-Commit-Position: refs/heads/main@{#1422264}
5 files changed
tree: 86c8a5709af2df7c29fc53201e8fb3e5ca22f2f8
  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.