Skip to content
  • Masayuki Nakano's avatar
    Bug 1603074 - part 1: Make `synthesizePlainDragAndDrop()` synthesize drag... · 87ca855e
    Masayuki Nakano authored
    Bug 1603074 - part 1: Make `synthesizePlainDragAndDrop()` synthesize drag events without `DataTransfer` object r=smaug
    
    `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
      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.
    
    Differential Revision: https://phabricator.services.mozilla.com/D57425
    
    --HG--
    extra : moz-landing-system : lando
    87ca855e