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 #include "mozilla/dom/DragEvent.h"
7 #include "mozilla/MouseEvents.h"
8 #include "nsContentUtils.h"
14 DragEvent::DragEvent(EventTarget
* aOwner
,
15 nsPresContext
* aPresContext
,
16 WidgetDragEvent
* aEvent
)
17 : MouseEvent(aOwner
, aPresContext
,
18 aEvent
? aEvent
: new WidgetDragEvent(false, 0, nullptr))
21 mEventIsInternal
= false;
24 mEventIsInternal
= true;
25 mEvent
->time
= PR_Now();
26 mEvent
->refPoint
.x
= mEvent
->refPoint
.y
= 0;
27 mEvent
->AsMouseEvent()->inputSource
= nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN
;
31 NS_IMPL_ADDREF_INHERITED(DragEvent
, MouseEvent
)
32 NS_IMPL_RELEASE_INHERITED(DragEvent
, MouseEvent
)
34 NS_INTERFACE_MAP_BEGIN(DragEvent
)
35 NS_INTERFACE_MAP_ENTRY(nsIDOMDragEvent
)
36 NS_INTERFACE_MAP_END_INHERITING(MouseEvent
)
39 DragEvent::InitDragEvent(const nsAString
& aType
,
53 EventTarget
* aRelatedTarget
,
54 DataTransfer
* aDataTransfer
,
58 MouseEvent::InitMouseEvent(aType
, aCanBubble
, aCancelable
,
59 aView
, aDetail
, aScreenX
, aScreenY
,
60 aClientX
, aClientY
, aCtrlKey
, aAltKey
,
61 aShiftKey
, aMetaKey
, aButton
, aRelatedTarget
);
62 if (aError
.Failed()) {
66 if (mEventIsInternal
&& mEvent
) {
67 mEvent
->AsDragEvent()->dataTransfer
= aDataTransfer
;
72 DragEvent::InitDragEvent(const nsAString
& aType
,
86 nsIDOMEventTarget
* aRelatedTarget
,
87 nsIDOMDataTransfer
* aDataTransfer
)
89 nsCOMPtr
<DataTransfer
> dataTransfer
= do_QueryInterface(aDataTransfer
);
92 MouseEvent::InitMouseEvent(aType
, aCanBubble
, aCancelable
, aView
, aDetail
,
93 aScreenX
, aScreenY
, aClientX
, aClientY
,
94 aCtrlKey
, aAltKey
, aShiftKey
, aMetaKey
, aButton
,
96 NS_ENSURE_SUCCESS(rv
, rv
);
98 if (mEventIsInternal
&& mEvent
) {
99 mEvent
->AsDragEvent()->dataTransfer
= dataTransfer
;
106 DragEvent::GetDataTransfer(nsIDOMDataTransfer
** aDataTransfer
)
108 NS_IF_ADDREF(*aDataTransfer
= GetDataTransfer());
113 DragEvent::GetDataTransfer()
115 // the dataTransfer field of the event caches the DataTransfer associated
116 // with the drag. It is initialized when an attempt is made to retrieve it
117 // rather that when the event is created to avoid duplicating the data when
118 // no listener ever uses it.
119 if (!mEvent
|| mEvent
->mClass
!= eDragEventClass
) {
120 NS_WARNING("Tried to get dataTransfer from non-drag event!");
124 WidgetDragEvent
* dragEvent
= mEvent
->AsDragEvent();
125 // for synthetic events, just use the supplied data transfer object even if null
126 if (!mEventIsInternal
) {
127 nsresult rv
= nsContentUtils::SetDataTransferInEvent(dragEvent
);
128 NS_ENSURE_SUCCESS(rv
, nullptr);
131 return dragEvent
->dataTransfer
;
135 } // namespace mozilla
137 using namespace mozilla
;
138 using namespace mozilla::dom
;
141 NS_NewDOMDragEvent(nsIDOMEvent
** aInstancePtrResult
,
143 nsPresContext
* aPresContext
,
144 WidgetDragEvent
* aEvent
)
146 DragEvent
* event
= new DragEvent(aOwner
, aPresContext
, aEvent
);
147 return CallQueryInterface(event
, aInstancePtrResult
);