Fix DCHECK failure in AccountSelectionModalView.

Prior to this CL, AccountSelectionModalView created a dialog widget with
constrained_window::ShowWebModalDialogViews. This method attaches a
helper that attempts to automatically show/hide the widget when the tab
becomes foreground/background.

This has two problems:

(1) There are some known edge cases with
constrained_window::ShowWebModalDialogViews, such as crbug.com/353174863

(2) The show/hide logic in constrained_window::ShowWebModalDialogViews
is redundant with, and conflicts with the show/hide logic in
FedCmAccountSelectionView. Theoretically, multiple calls to
Widget::Show() or Widget::Hide() should be idempotent, but the
implementation of constrained_window::ShowWebModalDialogViews breaks
invariants in aura::Window. constrained_window::ShowWebModalDialogViews
adds an animation to hiding/showing windows via
wm::WINDOW_VISIBILITY_ANIMATION_TYPE_ROTATE. The implementation of this
in AddLayerAnimationsForRotate() sets the window's visibility to true,
but also sets the ui::Layer's target opacity to 0. This breaks the
invariant in aura::Window that a visible window should have non-zero
target opacity. This invariant is only checked in Widget::Show(), and
thus this is not normally triggered (although this is really just a
latent race condition). The second call to Widget::Show() from
FedCmAccountSelectionView deterministically triggers this pre-existing
bug.

This CL fixes the problem by removing the call to
constrained_window::ShowWebModalDialogViews and showing a DialogDelegate
via a normal widget. The main purpose of
constrained_window::ShowWebModalDialogViews is to show/hide the dialog
when the tab shows/hides, but that is already implemented by
FedCmAccountSelectionView.

This CL does not touch the logic for positioning the modal dialog, which
is still done by
constrained_window::UpdateWebContentsModalDialogPosition. This is
unusual but does not cause any problems.

Bug: 364667534, 353174863
Change-Id: Iffed9b4a640ece73801ab1e00b94133ffc8e1052
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5841351
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Peter Boström <pbos@chromium.org>
Commit-Queue: Erik Chen <erikchen@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1352378}
1 file changed
tree: 33b952049512c9ca56af9a0089a677c0a4ffb45a
  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. google_update/
  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. .eslintrc.js
  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. 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.