|
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/. |
|
5 * |
|
6 * Portions Copyright 2013 Microsoft Open Technologies, Inc. */ |
|
7 |
|
8 #include "mozilla/dom/PointerEvent.h" |
|
9 #include "mozilla/MouseEvents.h" |
|
10 #include "prtime.h" |
|
11 |
|
12 namespace mozilla { |
|
13 namespace dom { |
|
14 |
|
15 PointerEvent::PointerEvent(EventTarget* aOwner, |
|
16 nsPresContext* aPresContext, |
|
17 WidgetPointerEvent* aEvent) |
|
18 : MouseEvent(aOwner, aPresContext, |
|
19 aEvent ? aEvent : new WidgetPointerEvent(false, 0, nullptr)) |
|
20 { |
|
21 NS_ASSERTION(mEvent->eventStructType == NS_POINTER_EVENT, |
|
22 "event type mismatch NS_POINTER_EVENT"); |
|
23 |
|
24 WidgetMouseEvent* mouseEvent = mEvent->AsMouseEvent(); |
|
25 if (aEvent) { |
|
26 mEventIsInternal = false; |
|
27 } else { |
|
28 mEventIsInternal = true; |
|
29 mEvent->time = PR_Now(); |
|
30 mEvent->refPoint.x = mEvent->refPoint.y = 0; |
|
31 mouseEvent->inputSource = nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN; |
|
32 } |
|
33 } |
|
34 |
|
35 static uint16_t |
|
36 ConvertStringToPointerType(const nsAString& aPointerTypeArg) |
|
37 { |
|
38 if (aPointerTypeArg.EqualsLiteral("mouse")) { |
|
39 return nsIDOMMouseEvent::MOZ_SOURCE_MOUSE; |
|
40 } |
|
41 if (aPointerTypeArg.EqualsLiteral("pen")) { |
|
42 return nsIDOMMouseEvent::MOZ_SOURCE_PEN; |
|
43 } |
|
44 if (aPointerTypeArg.EqualsLiteral("touch")) { |
|
45 return nsIDOMMouseEvent::MOZ_SOURCE_TOUCH; |
|
46 } |
|
47 |
|
48 return nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN; |
|
49 } |
|
50 |
|
51 // static |
|
52 already_AddRefed<PointerEvent> |
|
53 PointerEvent::Constructor(EventTarget* aOwner, |
|
54 const nsAString& aType, |
|
55 const PointerEventInit& aParam) |
|
56 { |
|
57 nsRefPtr<PointerEvent> e = new PointerEvent(aOwner, nullptr, nullptr); |
|
58 bool trusted = e->Init(aOwner); |
|
59 |
|
60 e->InitMouseEvent(aType, aParam.mBubbles, aParam.mCancelable, |
|
61 aParam.mView, aParam.mDetail, aParam.mScreenX, |
|
62 aParam.mScreenY, aParam.mClientX, aParam.mClientY, |
|
63 aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey, |
|
64 aParam.mMetaKey, aParam.mButton, |
|
65 aParam.mRelatedTarget); |
|
66 |
|
67 WidgetPointerEvent* widgetEvent = e->mEvent->AsPointerEvent(); |
|
68 widgetEvent->pointerId = aParam.mPointerId; |
|
69 widgetEvent->width = aParam.mWidth; |
|
70 widgetEvent->height = aParam.mHeight; |
|
71 widgetEvent->pressure = aParam.mPressure; |
|
72 widgetEvent->tiltX = aParam.mTiltX; |
|
73 widgetEvent->tiltY = aParam.mTiltY; |
|
74 widgetEvent->inputSource = ConvertStringToPointerType(aParam.mPointerType); |
|
75 widgetEvent->isPrimary = aParam.mIsPrimary; |
|
76 widgetEvent->buttons = aParam.mButtons; |
|
77 |
|
78 e->SetTrusted(trusted); |
|
79 return e.forget(); |
|
80 } |
|
81 |
|
82 // static |
|
83 already_AddRefed<PointerEvent> |
|
84 PointerEvent::Constructor(const GlobalObject& aGlobal, |
|
85 const nsAString& aType, |
|
86 const PointerEventInit& aParam, |
|
87 ErrorResult& aRv) |
|
88 { |
|
89 nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports()); |
|
90 return Constructor(owner, aType, aParam); |
|
91 } |
|
92 |
|
93 void |
|
94 PointerEvent::GetPointerType(nsAString& aPointerType) |
|
95 { |
|
96 switch (mEvent->AsPointerEvent()->inputSource) { |
|
97 case nsIDOMMouseEvent::MOZ_SOURCE_MOUSE: |
|
98 aPointerType.AssignLiteral("mouse"); |
|
99 break; |
|
100 case nsIDOMMouseEvent::MOZ_SOURCE_PEN: |
|
101 aPointerType.AssignLiteral("pen"); |
|
102 break; |
|
103 case nsIDOMMouseEvent::MOZ_SOURCE_TOUCH: |
|
104 aPointerType.AssignLiteral("touch"); |
|
105 break; |
|
106 case nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN: |
|
107 aPointerType.AssignLiteral(""); |
|
108 break; |
|
109 } |
|
110 } |
|
111 |
|
112 int32_t |
|
113 PointerEvent::PointerId() |
|
114 { |
|
115 return mEvent->AsPointerEvent()->pointerId; |
|
116 } |
|
117 |
|
118 int32_t |
|
119 PointerEvent::Width() |
|
120 { |
|
121 return mEvent->AsPointerEvent()->width; |
|
122 } |
|
123 |
|
124 int32_t |
|
125 PointerEvent::Height() |
|
126 { |
|
127 return mEvent->AsPointerEvent()->height; |
|
128 } |
|
129 |
|
130 float |
|
131 PointerEvent::Pressure() |
|
132 { |
|
133 return mEvent->AsPointerEvent()->pressure; |
|
134 } |
|
135 |
|
136 int32_t |
|
137 PointerEvent::TiltX() |
|
138 { |
|
139 return mEvent->AsPointerEvent()->tiltX; |
|
140 } |
|
141 |
|
142 int32_t |
|
143 PointerEvent::TiltY() |
|
144 { |
|
145 return mEvent->AsPointerEvent()->tiltY; |
|
146 } |
|
147 |
|
148 bool |
|
149 PointerEvent::IsPrimary() |
|
150 { |
|
151 return mEvent->AsPointerEvent()->isPrimary; |
|
152 } |
|
153 |
|
154 } // namespace dom |
|
155 } // namespace mozilla |
|
156 |
|
157 using namespace mozilla; |
|
158 using namespace mozilla::dom; |
|
159 |
|
160 nsresult |
|
161 NS_NewDOMPointerEvent(nsIDOMEvent** aInstancePtrResult, |
|
162 EventTarget* aOwner, |
|
163 nsPresContext* aPresContext, |
|
164 WidgetPointerEvent *aEvent) |
|
165 { |
|
166 PointerEvent *it = new PointerEvent(aOwner, aPresContext, aEvent); |
|
167 NS_ADDREF(it); |
|
168 *aInstancePtrResult = static_cast<Event*>(it); |
|
169 return NS_OK; |
|
170 } |