Bug 1032573 part 4 - Add AnimationTimeline::ToTimelineTime helper method; r=dbaron
[gecko.git] / dom / events / PointerEvent.cpp
blobfad5fe9ff006c9a68e30bdfaf5394c00c0b43d1c
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 * Portions Copyright 2013 Microsoft Open Technologies, Inc. */
8 #include "mozilla/dom/PointerEvent.h"
9 #include "mozilla/MouseEvents.h"
10 #include "prtime.h"
12 namespace mozilla {
13 namespace dom {
15 PointerEvent::PointerEvent(EventTarget* aOwner,
16 nsPresContext* aPresContext,
17 WidgetPointerEvent* aEvent)
18 : MouseEvent(aOwner, aPresContext,
19 aEvent ? aEvent : new WidgetPointerEvent(false, 0, nullptr))
21 NS_ASSERTION(mEvent->eventStructType == NS_POINTER_EVENT,
22 "event type mismatch NS_POINTER_EVENT");
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;
35 static uint16_t
36 ConvertStringToPointerType(const nsAString& aPointerTypeArg)
38 if (aPointerTypeArg.EqualsLiteral("mouse")) {
39 return nsIDOMMouseEvent::MOZ_SOURCE_MOUSE;
41 if (aPointerTypeArg.EqualsLiteral("pen")) {
42 return nsIDOMMouseEvent::MOZ_SOURCE_PEN;
44 if (aPointerTypeArg.EqualsLiteral("touch")) {
45 return nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
48 return nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN;
51 // static
52 already_AddRefed<PointerEvent>
53 PointerEvent::Constructor(EventTarget* aOwner,
54 const nsAString& aType,
55 const PointerEventInit& aParam)
57 nsRefPtr<PointerEvent> e = new PointerEvent(aOwner, nullptr, nullptr);
58 bool trusted = e->Init(aOwner);
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);
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;
78 e->SetTrusted(trusted);
79 return e.forget();
82 // static
83 already_AddRefed<PointerEvent>
84 PointerEvent::Constructor(const GlobalObject& aGlobal,
85 const nsAString& aType,
86 const PointerEventInit& aParam,
87 ErrorResult& aRv)
89 nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports());
90 return Constructor(owner, aType, aParam);
93 void
94 PointerEvent::GetPointerType(nsAString& aPointerType)
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.Truncate();
108 break;
112 int32_t
113 PointerEvent::PointerId()
115 return mEvent->AsPointerEvent()->pointerId;
118 int32_t
119 PointerEvent::Width()
121 return mEvent->AsPointerEvent()->width;
124 int32_t
125 PointerEvent::Height()
127 return mEvent->AsPointerEvent()->height;
130 float
131 PointerEvent::Pressure()
133 return mEvent->AsPointerEvent()->pressure;
136 int32_t
137 PointerEvent::TiltX()
139 return mEvent->AsPointerEvent()->tiltX;
142 int32_t
143 PointerEvent::TiltY()
145 return mEvent->AsPointerEvent()->tiltY;
148 bool
149 PointerEvent::IsPrimary()
151 return mEvent->AsPointerEvent()->isPrimary;
154 } // namespace dom
155 } // namespace mozilla
157 using namespace mozilla;
158 using namespace mozilla::dom;
160 nsresult
161 NS_NewDOMPointerEvent(nsIDOMEvent** aInstancePtrResult,
162 EventTarget* aOwner,
163 nsPresContext* aPresContext,
164 WidgetPointerEvent *aEvent)
166 PointerEvent *it = new PointerEvent(aOwner, aPresContext, aEvent);
167 NS_ADDREF(it);
168 *aInstancePtrResult = static_cast<Event*>(it);
169 return NS_OK;