Improve tab drag experience and fix reentrancy issues

This CL has a lot of improvements but unfortunately can be hard to track
due to state transitions. The main changes are focused on reentrancy
problems with the move loop. Secondary changes are things like detecting
single window drag better or determining active tab state during
detaching/attaching.

CL does the following:
- Defer tab migration and target window transition until after the native window move loop has returned and unwound from the callstack. This prevents reentrancy issues during tab dragging operations.
- Releases window capture before invoking `RunWindowMoveLoop` so the
  OS can take exclusive mouse capture.
- Starts window drag immediately during session start when dragging an
  entire window (single tab in browser)
- Introduce `CompleteReattachment()` to perform tab migration and
  target updates after the move loop finishes instead of right after.
- Sets the active tab flag when inserting tabs into an empty target
  model or for the lead dragged tab.

Bug: b:535810736,b:536801500
Change-Id: I1919e65e393daf5a46a18f5e4b72ad0cf1073ceb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8208322
Reviewed-by: Fred Shih <ffred@chromium.org>
Commit-Queue: David Yeung <dayeung@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1675306}
6 files changed
tree: f1512a3c6e50122923368b84216834514bbcb6b2
  1. .agents/
  2. .claude/
  3. .gemini/
  4. .github/
  5. agents/
  6. android_webview/
  7. apps/
  8. ash/
  9. base/
  10. build/
  11. build_overrides/
  12. buildtools/
  13. cc/
  14. chrome/
  15. chromecast/
  16. chromeos/
  17. codelabs/
  18. components/
  19. content/
  20. crypto/
  21. dbus/
  22. device/
  23. docs/
  24. extensions/
  25. fuchsia_web/
  26. gin/
  27. google_apis/
  28. gpu/
  29. headless/
  30. infra/
  31. ios/
  32. ipc/
  33. media/
  34. mojo/
  35. net/
  36. pdf/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. webkit/
  52. .clang-format
  53. .clang-tidy
  54. .clangd
  55. .cursorignore
  56. .geminiignore
  57. .git-blame-ignore-revs
  58. .gitallowed
  59. .gitattributes
  60. .gitignore
  61. .gitmodules
  62. .gn
  63. .mailmap
  64. .rustfmt.toml
  65. .vpython3
  66. .yapfignore
  67. ATL_OWNERS
  68. AUTHORS
  69. BRANCH_FEATURE_OWNERS
  70. BRANCH_OWNERS
  71. BUILD.gn
  72. CODE_OF_CONDUCT.md
  73. codereview.settings
  74. CPPLINT.cfg
  75. CRYPTO_OWNERS
  76. DEPS
  77. DIR_METADATA
  78. LICENSE
  79. LICENSE.chromium_os
  80. OWNERS
  81. package.json
  82. PRESUBMIT.py
  83. PRESUBMIT_test.py
  84. PRESUBMIT_test_mocks.py
  85. README.md
  86. SECURITY_OWNERS
  87. 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.