Closed Bug 1603074 Opened 2 years ago Closed 2 years ago

Improve `synthesizePlainDragAndDrop()` in EventUtils.js


(Core :: DOM: Copy & Paste and Drag & Drop, enhancement, P3)




Tracking Status
firefox73 --- fixed


(Reporter: masayuki, Assigned: masayuki)


(Depends on 1 open bug, Blocks 1 open bug)



(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.

Priority: -- → P3

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.

This patch does:

  • mark drag events caused by synthesized mouse events as "synthesized for tests"
  • make synthesizePlainDragAndDrop() stop using
  • 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
    with nsIDragService::GetDataTransfer()
  • make nsBaseDragService store effectAllowed for the session only when
    it's synthesized session because it's required at initializing synthesized
    default dropEffect value of dragenter, dragover, dragexit and drop
    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 to eDrop event's screen point
  • make synthesizePlainDragAndDrop() set drag end point of the session if
    it does not synthesize drop event because following endDragSession()
    use it at dispatching dragend 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.

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
part 1: Make `synthesizePlainDragAndDrop()` synthesize drag events without `DataTransfer` object r=smaug
part 2: make `test_dragdrop.html` use `synthesizePlainDragAndDrop()` r=smaug
Closed: 2 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla73
Pushed by
Port bug 1603074 - Improve `synthesizePlainDragAndDrop()` in EventUtils.js. rs=bustage-fix
You need to log in before you can comment on or make changes to this bug.