1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef nsBaseDragService_h__
7 #define nsBaseDragService_h__
9 #include "nsIDragService.h"
10 #include "nsIDragSession.h"
15 #include "mozilla/RefPtr.h"
16 #include "mozilla/dom/ContentParent.h"
17 #include "mozilla/dom/HTMLCanvasElement.h"
18 #include "mozilla/dom/RemoteDragStartData.h"
19 #include "mozilla/Logging.h"
24 extern mozilla::LazyLogModule sWidgetDragServiceLog
;
25 #define MOZ_DRAGSERVICE_LOG(...) \
26 MOZ_LOG(sWidgetDragServiceLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
27 #define MOZ_DRAGSERVICE_LOG_ENABLED() \
28 MOZ_LOG_TEST(sWidgetDragServiceLog, mozilla::LogLevel::Debug)
30 // translucency level for drag images
31 #define DRAG_TRANSLUCENCY 0.65
37 class nsIImageLoadingContent
;
48 } // namespace mozilla
51 * XP DragService wrapper base class
54 class nsBaseDragService
: public nsIDragService
, public nsIDragSession
{
56 typedef mozilla::gfx::SourceSurface SourceSurface
;
63 // nsIDragSession and nsIDragService
64 NS_DECL_NSIDRAGSERVICE
65 NS_DECL_NSIDRAGSESSION
67 void SetDragEndPoint(nsIntPoint aEndDragPoint
) {
69 mozilla::LayoutDeviceIntPoint::FromUnknownPoint(aEndDragPoint
);
71 void SetDragEndPoint(mozilla::LayoutDeviceIntPoint aEndDragPoint
) {
72 mEndDragPoint
= aEndDragPoint
;
75 uint16_t GetInputSource() { return mInputSource
; }
77 int32_t TakeChildProcessDragAction();
80 virtual ~nsBaseDragService();
83 * Called from nsBaseDragService to initiate a platform drag from a source
84 * in this process. This is expected to ensure that StartDragSession() and
85 * EndDragSession() get called if the platform drag is successfully invoked.
87 MOZ_CAN_RUN_SCRIPT
virtual nsresult
InvokeDragSessionImpl(
88 nsIArray
* aTransferableArray
,
89 const mozilla::Maybe
<mozilla::CSSIntRegion
>& aRegion
,
90 uint32_t aActionType
) = 0;
93 * Draw the drag image, if any, to a surface and return it. The drag image
94 * is constructed from mImage if specified, or aDOMNode if mImage is null.
96 * aRegion may be used to draw only a subset of the element. This region
97 * should be supplied using x and y coordinates measured in css pixels
98 * that are relative to the upper-left corner of the window.
100 * aScreenPosition should be the screen coordinates of the mouse click
101 * for the drag. These are in CSS pixels.
103 * On return, aScreenDragRect will contain the screen coordinates of the
104 * area being dragged. This is used by the platform-specific part of the
105 * drag service to determine the drag feedback. This rect will be in the
106 * device pixels of the presContext.
108 * If there is no drag image, the returned surface will be null, but
109 * aScreenDragRect will still be set to the drag area.
111 * aPresContext will be set to the nsPresContext used determined from
112 * whichever of mImage or aDOMNode is used.
114 nsresult
DrawDrag(nsINode
* aDOMNode
,
115 const mozilla::Maybe
<mozilla::CSSIntRegion
>& aRegion
,
116 mozilla::CSSIntPoint aScreenPosition
,
117 mozilla::LayoutDeviceIntRect
* aScreenDragRect
,
118 RefPtr
<SourceSurface
>* aSurface
,
119 nsPresContext
** aPresContext
);
122 * Draw a drag image for an image node specified by aImageLoader or aCanvas.
123 * This is called by DrawDrag.
125 nsresult
DrawDragForImage(nsPresContext
* aPresContext
,
126 nsIImageLoadingContent
* aImageLoader
,
127 mozilla::dom::HTMLCanvasElement
* aCanvas
,
128 mozilla::LayoutDeviceIntRect
* aScreenDragRect
,
129 RefPtr
<SourceSurface
>* aSurface
);
132 * If the drag image is a popup, open the popup when the drag begins.
134 void OpenDragPopup();
137 * Free resources contained in DataTransferItems that aren't needed by JS.
139 void DiscardInternalTransferData();
141 // Returns true if a drag event was dispatched to a child process after
142 // the previous TakeDragEventDispatchedToChildProcess() call.
143 bool TakeDragEventDispatchedToChildProcess() {
144 bool retval
= mDragEventDispatchedToChildProcess
;
145 mDragEventDispatchedToChildProcess
= false;
150 bool mOnlyChromeDrop
;
152 bool mSessionIsSynthesizedForTests
;
153 bool mIsDraggingTextInTextControl
;
155 // true if in EndDragSession
157 // true if mImage should be used to set a drag image
159 // true if the user cancelled the drag operation
162 bool mDragEventDispatchedToChildProcess
;
164 uint32_t mDragAction
;
165 uint32_t mDragActionFromChildProcess
;
167 // mEffectAllowedForTests stores allowed effects at invoking the drag
169 uint32_t mEffectAllowedForTests
;
171 nsCOMPtr
<nsINode
> mSourceNode
;
172 nsCOMPtr
<nsIPrincipal
> mTriggeringPrincipal
;
173 nsCOMPtr
<nsIContentSecurityPolicy
> mCsp
;
175 // the document at the drag source. will be null if it came from outside the
177 RefPtr
<mozilla::dom::Document
> mSourceDocument
;
179 RefPtr
<mozilla::dom::WindowContext
> mSourceWindowContext
;
180 RefPtr
<mozilla::dom::WindowContext
> mSourceTopWindowContext
;
182 // the contentpolicy type passed to the channel when initiating the drag
184 nsContentPolicyType mContentPolicyType
;
186 RefPtr
<mozilla::dom::DataTransfer
> mDataTransfer
;
188 // used to determine the image to appear on the cursor while dragging
189 nsCOMPtr
<nsINode
> mImage
;
190 // offset of cursor within the image
191 mozilla::CSSIntPoint mImageOffset
;
193 // set if a selection is being dragged
194 RefPtr
<mozilla::dom::Selection
> mSelection
;
197 RefPtr
<mozilla::dom::RemoteDragStartData
> mDragStartData
;
199 // set if the image in mImage is a popup. If this case, the popup will be
200 // opened and moved instead of using a drag image.
201 nsCOMPtr
<mozilla::dom::Element
> mDragPopup
;
203 // the screen position where drag gesture occurred, used for positioning the
205 mozilla::CSSIntPoint mScreenPosition
;
207 // The position relative to the top level widget where the drag ended.
208 mozilla::LayoutDeviceIntPoint mEndDragPoint
;
210 uint32_t mSuppressLevel
;
212 // The input source of the drag event. Possible values are from MouseEvent.
213 uint16_t mInputSource
;
215 nsTArray
<RefPtr
<mozilla::dom::ContentParent
>> mChildProcesses
;
217 // Sub-region for tree-selections.
218 mozilla::Maybe
<mozilla::CSSIntRegion
> mRegion
;
221 #endif // nsBaseDragService_h__