gecko-dev/widget/nsIDragService.idl

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

209 строки
8.1 KiB
Plaintext
Исходник Обычный вид История

/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
1999-08-25 12:34:46 +04:00
*
2012-05-21 15:12:37 +04:00
* 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/. */
1999-08-25 12:34:46 +04:00
#include "nsIArray.idl"
1999-08-25 12:34:46 +04:00
#include "nsISupports.idl"
#include "nsIDragSession.idl"
#include "nsIContentPolicy.idl"
1999-08-25 12:34:46 +04:00
webidl DragEvent;
webidl Element;
webidl Node;
webidl Selection;
interface nsICookieJarSettings;
%{C++
#include "mozilla/EventForwards.h"
namespace mozilla {
namespace dom {
class ContentParent;
class DataTransfer;
class RemoteDragStartData;
} // namespace dom
} // namespace mozilla
%}
[ptr] native ContentParentPtr(mozilla::dom::ContentParent);
[ptr] native DataTransferPtr(mozilla::dom::DataTransfer);
[ptr] native RemoteDragStartDataPtr(mozilla::dom::RemoteDragStartData);
native EventMessage(mozilla::EventMessage);
[scriptable, uuid(ebd6b3a2-af16-43af-a698-3091a087dd62), builtinclass]
1999-08-25 12:34:46 +04:00
interface nsIDragService : nsISupports
{
const long DRAGDROP_ACTION_NONE = 0;
const long DRAGDROP_ACTION_COPY = 1;
const long DRAGDROP_ACTION_MOVE = 2;
const long DRAGDROP_ACTION_LINK = 4;
const long DRAGDROP_ACTION_UNINITIALIZED = 64;
1999-08-25 12:34:46 +04:00
/**
* Starts a modal drag session with an array of transaferables.
*
* Note: This method is deprecated for non-native code.
1999-08-25 12:34:46 +04:00
*
* @param aPrincipal - the triggering principal of the drag, or null if
* it's from browser chrome or OS
* @param aCsp - The csp of the triggering Document
1999-08-25 12:34:46 +04:00
* @param aTransferables - an array of transferables to be dragged
* @param aActionType - specified which of copy/move/link are allowed
* @param aContentPolicyType - the contentPolicyType that will be
* passed to the loadInfo when creating a new channel
* (defaults to TYPE_OTHER)
1999-08-25 12:34:46 +04:00
*/
[can_run_script]
void invokeDragSession (in Node aDOMNode,
in nsIPrincipal aPrincipal,
in nsIContentSecurityPolicy aCsp,
in nsICookieJarSettings aCookieJarSettings,
in nsIArray aTransferables,
in unsigned long aActionType,
[optional] in nsContentPolicyType aContentPolicyType);
1999-08-25 12:34:46 +04:00
/**
* Starts a modal drag session using an image. The first four arguments are
* the same as invokeDragSession.
*
* Note: This method is deprecated for non-native code.
*
* A custom image may be specified using the aImage argument. If this is
* supplied, the aImageX and aImageY arguments specify the offset within
* the image where the cursor would be positioned. That is, when the image
* is drawn, it is offset up and left the amount so that the cursor appears
* at that location within the image.
*
* If aImage is null, aImageX and aImageY are not used and the image is instead
* determined from the source node aDOMNode, and the offset calculated so that
* the initial location for the image appears in the same screen position as
* where the element is located. The node must be within a document.
*
* Currently, supported images are all DOM nodes. If this is an HTML <image> or
* <canvas>, the drag image is taken from the image data. If the element is in
* a document, it will be rendered at its displayed size, othewise, it will be
* rendered at its real size. For other types of elements, the element is
* rendered into an offscreen buffer in the same manner as it is currently
* displayed. The document selection is hidden while drawing.
*
* The aDragEvent must be supplied as the current screen coordinates of the
* event are needed to calculate the image location.
*/
[noscript, can_run_script]
void invokeDragSessionWithImage(in Node aDOMNode,
in nsIPrincipal aPrincipal,
in nsIContentSecurityPolicy aCsp,
in nsICookieJarSettings aCookieJarSettings,
in nsIArray aTransferableArray,
in unsigned long aActionType,
in Node aImage,
in long aImageX,
in long aImageY,
in DragEvent aDragEvent,
in DataTransferPtr aDataTransfer);
/** Start a drag session with the data in aDragStartData from a child process.
* Other arguments are the same as invokeDragSessionWithImage.
*/
[noscript, can_run_script]
void invokeDragSessionWithRemoteImage(in Node aDOMNode,
in nsIPrincipal aPrincipal,
in nsIContentSecurityPolicy aCsp,
in nsICookieJarSettings aCookieJarSettings,
in nsIArray aTransferableArray,
in unsigned long aActionType,
in RemoteDragStartDataPtr aDragStartData,
in DragEvent aDragEvent,
in DataTransferPtr aDataTransfer);
/**
* Start a modal drag session using the selection as the drag image.
* The aDragEvent must be supplied as the current screen coordinates of the
* event are needed to calculate the image location.
*
* Note: This method is deprecated for non-native code.
*/
[can_run_script]
void invokeDragSessionWithSelection(in Selection aSelection,
in nsIPrincipal aPrincipal,
in nsIContentSecurityPolicy aCsp,
in nsICookieJarSettings aCookieJarSettings,
in nsIArray aTransferableArray,
in unsigned long aActionType,
in DragEvent aDragEvent,
in DataTransferPtr aDataTransfer);
1999-08-25 12:34:46 +04:00
/**
* Returns the current Drag Session
1999-08-25 12:34:46 +04:00
*/
nsIDragSession getCurrentSession();
1999-08-25 12:34:46 +04:00
/**
* Tells the Drag Service to start a drag session. This is called when
* an external drag occurs
*/
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
2019-12-21 15:27:06 +03:00
void startDragSession() ;
/**
* Similar to startDragSession(), automated tests may want to start
* session for emulating an external drag. At that time, this should
* be used instead of startDragSession().
*
* @param aAllowedEffect Set default drag action which means allowed effects
* in the session and every DnD events are initialized
* with one of specified value. So, the value can be
* DRAGDROP_ACTION_NONE, or one or more values of
* DRAGDROP_ACTION_(MOVE|COPY|LINK).
*/
void startDragSessionForTests(in unsigned long aAllowedEffect);
1999-08-25 12:34:46 +04:00
/**
* Tells the Drag Service to end a drag session. This is called when
* an external drag occurs
*
* If aDoneDrag is true, the drag has finished, otherwise the drag has
* just left the window.
1999-08-25 12:34:46 +04:00
*/
[can_run_script]
void endDragSession(in boolean aDoneDrag,
[optional] in unsigned long aKeyModifiers);
/**
* Fire a drag event at the source of the drag
*/
[noscript, can_run_script]
void fireDragEventAtSource(in EventMessage aEventMessage,
in unsigned long aKeyModifiers);
2008-03-19 03:06:22 +03:00
/**
* Increase/decrease dragging suppress level by one.
* If level is greater than one, dragging is disabled.
*/
[can_run_script]
2008-03-19 03:06:22 +03:00
void suppress();
void unsuppress();
/**
* aX and aY are in LayoutDevice pixels.
*/
[noscript] void dragMoved(in long aX, in long aY);
[notxpcom, nostdcall] boolean maybeAddChildProcess(in ContentParentPtr aChild);
[notxpcom, nostdcall] boolean removeAllChildProcesses();
/**
* Called when HTMLEditor maybe deleted the source node from the document.
*
* @param aEditingHost The editing host when the editor deletes selection.
*/
[noscript] void maybeEditorDeletedSourceNode(in Element aEditingHost);
1999-08-25 12:34:46 +04:00
};
%{ C++
%}