gecko-dev/widget/nsIDragSession.idl
Masayuki Nakano a171e12db6 Bug 1665550 - part 3: Make nsTextControlFrame set the source node and selection of drag session to new ones when it's reframed r=smaug
When `nsTextControlFrame` is reframed, `TextEditor`, anonymous `<div>`, its
`Text` and the independent `Selection`s are deleted temporarily and recreated
them.

If users are dragging text in `<input>` or `<textarea>`, the drag session's
source node is set to the anonymous text node in the element and the selection
is set to the independent selection.  So, if the element is reframed during a
drag, the source node is disconnected from the document and `EndDragSession`
failed to dispatch `eDragEnd` event.

Therefore, this patch makes `nsTextControlFrame` replaces the source node and
selection when it's recreated and only when the drag session's original source
node was in the text control element.  For checking which text control had the
anonymous text node, this patch makes `nsTextControlFrame` replaces source
node with the `<input>` or `<textarea>` element when the frame is destroyed.

Differential Revision: https://phabricator.services.mozilla.com/D119487
2021-07-14 01:20:19 +00:00

144 lines
4.4 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"
#include "nsITransferable.idl"
%{ C++
#include "nsSize.h"
%}
interface nsIContentSecurityPolicy;
native nsSize(nsSize);
webidl DataTransfer;
webidl Document;
webidl Node;
webidl Selection;
[scriptable, builtinclass, uuid(25bce737-73f0-43c7-bc20-c71044a73c5a)]
interface nsIDragSession : nsISupports
{
/**
* Set the current state of the drag, whether it can be dropped or not.
* usually the target "frame" sets this so the native system can render the correct feedback
*/
attribute boolean canDrop;
/**
* Indicates if the drop event should be dispatched only to chrome.
*/
attribute boolean onlyChromeDrop;
/**
* Sets the action (copy, move, link, et.c) for the current drag
*/
attribute unsigned long dragAction;
/**
* Get the number of items that were dropped
*/
readonly attribute unsigned long numDropItems;
/**
* The document where the drag was started, which will be null if the
* drag originated outside the application. Useful for determining if a drop
* originated in the same document.
*/
[infallible]
readonly attribute Document sourceDocument;
/**
* The dom node that was originally dragged to start the session, which will be null if the
* drag originated outside the application.
*/
readonly attribute Node sourceNode;
/**
* Replace source node and selection with new ones.
* If sourceNode is a native anonymous node, it may be replaced at reframing.
* If sourceNode is disconnected from the document, we cannot dispatch
* `dragend` event properly.
* When this is called, sourceNode or aNewSourceNode should be a native
* anonymous node.
*/
[notxpcom, nostdcall] void updateSource(in Node aNewSourceNode,
in Selection aNewSelection);
/**
* the triggering principal. This may be different than sourceNode's
* principal when sourceNode is xul:browser and the drag is
* triggered in a browsing context inside it.
*/
attribute nsIPrincipal triggeringPrincipal;
/**
* the triggering csp. This may be different than sourceNode's
* csp when sourceNode is xul:browser and the drag is
* triggered in a browsing context inside it.
*/
attribute nsIContentSecurityPolicy csp;
/**
* The data transfer object for the current drag.
*/
[binaryname(DataTransferXPCOM)]
attribute DataTransfer dataTransfer;
[notxpcom, nostdcall] DataTransfer getDataTransfer();
[notxpcom, nostdcall] void setDataTransfer(in DataTransfer aDataTransfer);
/**
* Get data from a Drag&Drop. Can be called while the drag is in process
* or after the drop has completed.
*
* @param aTransferable the transferable for the data to be put into
* @param aItemIndex which of multiple drag items, zero-based
*/
void getData ( in nsITransferable aTransferable, in unsigned long aItemIndex ) ;
/**
* Check to set if any of the native data on the clipboard matches this data flavor
*/
boolean isDataFlavorSupported ( in string aDataFlavor ) ;
void userCancelled();
void dragEventDispatchedToChildProcess();
// Called when nsIDragSession implementation should update the UI for the
// drag-and-drop based on the data got from the child process in response to
// NS_DRAGDROP_OVER sent from parent process to child process.
void updateDragEffect();
// Change the drag image, using similar arguments as
// nsIDragService::InvokeDragSessionWithImage.
void updateDragImage(in Node aImage, in long aImageX, in long aImageY);
/**
* Returns effects allowed at starting the session for tests.
*/
[notxpcom, nostdcall] unsigned long getEffectAllowedForTests();
/**
* Returns true if current session was started with synthesized drag start.
*/
[notxpcom, nostdcall] bool isSynthesizedForTests();
/**
* Sets drag end point of synthesized session when the test does not dispatch
* "drop" event.
*/
void setDragEndPointForTests(in long aScreenX, in long aScreenY);
/**
* Returns true if the session is for dragging text in a text in text control
* element.
*/
[notxpcom, nostdcall] bool isDraggingTextInTextControl();
};