Improve `synthesizePlainDragAndDrop()` in EventUtils.js
Categories
(Core :: DOM: Drag & Drop, enhancement, P3)
Tracking
()
Tracking | Status | |
---|---|---|
firefox73 | --- | fixed |
People
(Reporter: masayuki, Assigned: masayuki)
References
(Depends on 1 open bug, Blocks 1 open bug)
Details
Attachments
(2 files)
I realized that there is a really good new test API, synthesizePlainDragAndDrop()
because of trying to test actual drag and drop behavior. However, it still cannot test drag and drop with editor. As far as I've investigated, it does not initialize nsIDragSession
instance properly because it synthesizes dragenter
, dragover
and drop
events with initially setting DataTransfer
object which was set to DragEvent.dataTransfer
of dragstart
event, and that causes EventStateManager::DoDefaultDragStart()
doing nothing.
I'll attach a patch to make EventStateManager
and nsBaseDragService
use normal path more even for synthesized events.
Updated•1 year ago
|
Assignee | ||
Comment 1•1 year ago
|
||
synthesizePlainDragAndDrop()
synthesizes drag events with DataTransfer
object which is set to DragEvent.dataTransfer
of dragstart
after starting
drag session explicitly. However, this causes
EventStateManager::DoDefaltDragStart()
does not initialize nsIDragService
instance. Therefore, synthesized drag events cannot work with editor because
DragEvent::GetMozSourceNode()
returns nullptr
due to
nsIDragSession::GetSourceNode()
returning nullptr
.
On the other hand, synthesized drag events cannot use
nsIDragService::InvodeDragSession()
normally because of hitting an assertion.
https://searchfox.org/mozilla-central/rev/690e903ef689a4eca335b96bd903580394864a1c/widget/nsBaseDragService.cpp#230-233
This patch does:
- mark drag events caused by synthesized mouse events as "synthesized for tests"
- make
synthesizePlainDragAndDrop()
stop using
nsIDragService.startDragSession()
- make
nsBaseDragService
initialize and start session even for synthesized
dragstart
event - make
synthesizePlainDragAndDrop()
stop synthesizing drag events with
DataTransfer
object since it's normal behavior and it'll be initialized
withnsIDragService::GetDataTransfer()
- make
nsBaseDragService
storeeffectAllowed
for the session only when
it's synthesized session because it's required at initializing synthesized
defaultdropEffect
value ofdragenter
,dragover
,dragexit
anddrop
events'dataTransfer
- make all tests which use
nsIDragService.startDragSession()
use new
API,nsIDragService.startDragSessionForTests()
to initialize session's
effectAllowed
value - make
EventStateManager::PostHandleEvent()
set drag end point of the test
session toeDrop
event's screen point - make
synthesizePlainDragAndDrop()
set drag end point of the session if
it does not synthesizedrop
event because followingendDragSession()
use it at dispatchingdragend
event on the source element
Additionally, this adds dumpFunc
new param to synthesizePlainDragAndDrop()
because it's really useful to investigate the reason why requesting DnD isn't
performed as expected.
Assignee | ||
Comment 2•1 year ago
|
||
The test uses synthesizeDrop()
etc. However, the testing data does not match
with actual data when users do same thing in some cases. Therefore, we should
rewrite it with synthesizePlainDragAndDrop()
.
Depends on D57425
Pushed by masayuki@d-toybox.com: https://hg.mozilla.org/integration/autoland/rev/9168cb3f867e part 1: Make `synthesizePlainDragAndDrop()` synthesize drag events without `DataTransfer` object r=smaug https://hg.mozilla.org/integration/autoland/rev/238918bf6bea part 2: make `test_dragdrop.html` use `synthesizePlainDragAndDrop()` r=smaug
Comment 4•1 year ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/9168cb3f867e
https://hg.mozilla.org/mozilla-central/rev/238918bf6bea
Pushed by geoff@darktrojan.net: https://hg.mozilla.org/comm-central/rev/c98a0cffba3a Port bug 1603074 - Improve `synthesizePlainDragAndDrop()` in EventUtils.js. rs=bustage-fix
Description
•