gecko-dev/widget/nsIMockDragServiceController.idl
David Parks ba246211e4 Bug 1910452: Part 3 - Fix some issues with synthesizeMockDragAndDrop r=m_kato
This fixes four issues:

1. The test didn't provide enough movement to generate a drag session on the
   source before moving to the target.  This meant that, when they were in
   different windows, Gecko wouldn't send dragleave to the source or dragenter
   to the target.  It also never sent dragenter to the source in the first
   place. This remedies that.
2. dragenter and dragleave weren't properly handled because the test was sending
   dragleaves instead of dragexits (the latter being what Gecko expects and the
   former being synthesized from that -- see e.g. nsNativeDragTarget::DragLeave).
   This now uses dragexits and sets the proper expectations.
3. expectProtectedDataTransferAccess was needlessly complicated and, after #1,
   gave the wrong answers for some events like dragenter called on the source.
4. The event handler wasn't checking for exceptions and the drop handler was
   intentionally causing one, which was causing it to miss the rest of its
   execution.

Differential Revision: https://phabricator.services.mozilla.com/D219550
2024-09-11 23:02:23 +00:00

69 lines
2.5 KiB
Plaintext

/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
webidl BrowsingContext;
interface nsIDragService;
/**
* A driver for MockDragService, so that tests can mock system DND behavior.
* (System DND is not permitted in tests.)
*/
[scriptable, builtinclass, uuid(32037ab0-bfc7-11ee-9f4b-09901bed55fa)]
interface nsIMockDragServiceController : nsISupports
{
// Types of event that can be sent by this controller.
cenum EventType : 8 {
eDragEnter = 0,
eDragOver = 1,
eDragExit = 2,
eDrop = 3,
eMouseDown = 4,
eMouseMove = 5,
eMouseUp = 6,
};
/**
* The nsIDragService that this controller targets. It is a mock version
* of the normal nsIDragService. The caller must replace the drag
* service in the service manager with this object before sending
* drag events to it. This can be done with MockRegistrar or by calling
* the nsComponentManager directly.
*/
readonly attribute nsIDragService mockDragService;
/**
* Issue the given event from our mock drag service, as if that type
* of event came from the system. The mock object attempts to mimic the
* essential behavior of the native drag classes for this.
*
* @param aBC A BrowsingContext in the widget the event is
* targetted at
* @param aEventType Type of event to send
* @param aScreenX Screen X coordinate of event
* @param aScreenY Screen Y coordinate of event
* @param aKeyModifiers Keys that are pressed during event.
* NOTE: Keys should be interpreted as selecting
* the drag action, but that logic is very
* platform-dependent and is not yet mocked.
* Drops will be processed as "moves".
*/
[can_run_script]
void sendEvent(in BrowsingContext aBC,
in nsIMockDragServiceController_EventType aEventType,
in long aScreenX, in long aScreenY,
[optional] in uint32_t aKeyModifiers);
/**
* Windows' IDropTarget has the ability to "Cancel" a drag that is
* different than dragleave. This emulates that behavior for testing.
*/
[can_run_script]
void cancelDrag([optional] in uint32_t aKeyModifiers);
};