[ozone/x11] Fixed the crash during drag and drop.

The X11Window sometimes did not provide data to the drag and drop client
on drag entering the window, which later (on handling further events)
resulted in DesktopDragDropClientOzone::UpdateTargetAndCreateDropEvent()
dereferencing nullptr and thus creating an invalid reference to data
in the DropTargetEvent, which then caused the crash.

Why exactly the window might not provide data cannot be known for sure.
The essential point in the X11 drag and drop session is XdndPosition
event tht is handled by X11Window::UpdateDrag(), where the drag data is
always created.  The newly created data should then be passed to
DesktopDragDropClientOzone::OnDragEnter(), but because this call must
happen exactly once per drag and drop session, the X11Window has the
notified_enter_ flag for that; the call to OnDragEnter() happens iff
the flag was reset, and the flag is then set and kept till the end of
the session.  So the likely reason of the crash was that notified_enter_
was true before the call to DesktopDragDropClientOzone::OnDragEnter(),
which resulted in the call not happening.

X11Window::StartDrag() resets the flag, so the only case when things
could go wrong is the drag incoming from another window.

The code around had DCHECKs that assert valid state of the data, but
they did not fire neither in tests nor during development, which
suggests that the event is quite rare.

Theoretically, the reason could be incorrect sequence of incoming
events: either the previous drag and drop did not end properly, or the
entering drag did not send some events.

This CL fixes the situation with two changes:
1. The notified_enter_ flag is reset on entering the foreign drag, thus
   ensuring the correct state at the beginning of the incoming drag
   session.
2. The DesktopDragDropClientOzone::UpdateTargetAndCreateDropEvent()
   checks data_to_drop_ before passing it further, so nullptr should
   never be dereferenced anymore.

Bug: 1151836
Change-Id: Id007d5ee463fbaeaf4311166c72a397f48a8e9ec
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2558344
Reviewed-by: Scott Violet <sky@chromium.org>
Reviewed-by: Maksim Sisov (GMT+2) <msisov@igalia.com>
Commit-Queue: Alexander Dunaev <adunaev@igalia.com>
Cr-Commit-Position: refs/heads/master@{#832822}
3 files changed
tree: a8f27a21c7ab3a4b656703aabf9c65fdcf08ad74
  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. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. 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.

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.