[TLDD] Refactor DragAnDropGlobalState APIs

Context: Drag events usually reach child view first and then propagate back to parent if child is unable to handle the event (ie: returns false). However, drag start / end events are sent to all drag listeners. These 2 events do no follow the same call order as other events - ie: they reach listeners in no specific order (verified through testing).

Since we need to clear static shared drag state on drag end, this leads to an issue where one listener could preemptively clear the state that is required by another listener. Saw issues with users flows due to this where dragSourceInstanceId in DragDropGlobalState was getting cleared early causing isDragSource call to return incorrect value.

To get around this issue, this CL introduces a concept of tracker token:
* The token is handed over to the creator of the global state instance (token is handed during startDragAndDrop).
* The global instance can only be obtained when passing the right token, or an drag event that has ACTION_DROP.
* The drag starter is responsible to release the global state at drag end.

This CL also wraps the entire ChromeDropDataAndroid into the global state, making it easier for adding more fields.

Fixed: 1514917
Change-Id: I889960787bfab3f3a9a294541330df68872ec3c3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5154244
Reviewed-by: Neil Coronado <nemco@google.com>
Reviewed-by: Theresa Sullivan <twellington@chromium.org>
Commit-Queue: Wenyu Fu <wenyufu@chromium.org>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1244436}
7 files changed
tree: aa22f5d90c0f72da0c7c5fc6be8254616e80889a
  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. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  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. 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.