Bug 1692971 [wpt PR 27638] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / widget / TouchEvents.h
blobd246171cc71d1a8db42e38cac1c3649afe677da8
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 mozilla_TouchEvents_h__
7 #define mozilla_TouchEvents_h__
9 #include <stdint.h>
11 #include "mozilla/dom/Touch.h"
12 #include "mozilla/MouseEvents.h"
13 #include "mozilla/RefPtr.h"
14 #include "nsTArray.h"
16 namespace mozilla {
18 /******************************************************************************
19 * mozilla::WidgetGestureNotifyEvent
21 * This event is the first event generated when the user touches
22 * the screen with a finger, and it's meant to decide what kind
23 * of action we'll use for that touch interaction.
25 * The event is dispatched to the layout and based on what is underneath
26 * the initial contact point it's then decided if we should pan
27 * (finger scrolling) or drag the target element.
28 ******************************************************************************/
30 class WidgetGestureNotifyEvent : public WidgetGUIEvent {
31 public:
32 virtual WidgetGestureNotifyEvent* AsGestureNotifyEvent() override {
33 return this;
36 WidgetGestureNotifyEvent(bool aIsTrusted, EventMessage aMessage,
37 nsIWidget* aWidget)
38 : WidgetGUIEvent(aIsTrusted, aMessage, aWidget, eGestureNotifyEventClass),
39 mPanDirection(ePanNone),
40 mDisplayPanFeedback(false) {}
42 virtual WidgetEvent* Duplicate() const override {
43 // XXX Looks like this event is handled only in PostHandleEvent() of
44 // EventStateManager. Therefore, it might be possible to handle this
45 // in PreHandleEvent() and not to dispatch as a DOM event into the DOM
46 // tree like ContentQueryEvent. Then, this event doesn't need to
47 // support Duplicate().
48 MOZ_ASSERT(mClass == eGestureNotifyEventClass,
49 "Duplicate() must be overridden by sub class");
50 // Not copying widget, it is a weak reference.
51 WidgetGestureNotifyEvent* result =
52 new WidgetGestureNotifyEvent(false, mMessage, nullptr);
53 result->AssignGestureNotifyEventData(*this, true);
54 result->mFlags = mFlags;
55 return result;
58 typedef int8_t PanDirectionType;
59 enum PanDirection : PanDirectionType {
60 ePanNone,
61 ePanVertical,
62 ePanHorizontal,
63 ePanBoth
66 PanDirection mPanDirection;
67 bool mDisplayPanFeedback;
69 void AssignGestureNotifyEventData(const WidgetGestureNotifyEvent& aEvent,
70 bool aCopyTargets) {
71 AssignGUIEventData(aEvent, aCopyTargets);
73 mPanDirection = aEvent.mPanDirection;
74 mDisplayPanFeedback = aEvent.mDisplayPanFeedback;
78 /******************************************************************************
79 * mozilla::WidgetSimpleGestureEvent
80 ******************************************************************************/
82 class WidgetSimpleGestureEvent : public WidgetMouseEventBase {
83 public:
84 virtual WidgetSimpleGestureEvent* AsSimpleGestureEvent() override {
85 return this;
88 WidgetSimpleGestureEvent(bool aIsTrusted, EventMessage aMessage,
89 nsIWidget* aWidget)
90 : WidgetMouseEventBase(aIsTrusted, aMessage, aWidget,
91 eSimpleGestureEventClass),
92 mAllowedDirections(0),
93 mDirection(0),
94 mClickCount(0),
95 mDelta(0.0) {}
97 WidgetSimpleGestureEvent(const WidgetSimpleGestureEvent& aOther)
98 : WidgetMouseEventBase(aOther.IsTrusted(), aOther.mMessage,
99 aOther.mWidget, eSimpleGestureEventClass),
100 mAllowedDirections(aOther.mAllowedDirections),
101 mDirection(aOther.mDirection),
102 mClickCount(0),
103 mDelta(aOther.mDelta) {}
105 virtual WidgetEvent* Duplicate() const override {
106 MOZ_ASSERT(mClass == eSimpleGestureEventClass,
107 "Duplicate() must be overridden by sub class");
108 // Not copying widget, it is a weak reference.
109 WidgetSimpleGestureEvent* result =
110 new WidgetSimpleGestureEvent(false, mMessage, nullptr);
111 result->AssignSimpleGestureEventData(*this, true);
112 result->mFlags = mFlags;
113 return result;
116 // See SimpleGestureEvent.webidl for values
117 uint32_t mAllowedDirections;
118 // See SimpleGestureEvent.webidl for values
119 uint32_t mDirection;
120 // The number of taps for tap events
121 uint32_t mClickCount;
122 // Delta for magnify and rotate events
123 double mDelta;
125 // XXX Not tested by test_assign_event_data.html
126 void AssignSimpleGestureEventData(const WidgetSimpleGestureEvent& aEvent,
127 bool aCopyTargets) {
128 AssignMouseEventBaseData(aEvent, aCopyTargets);
130 // mAllowedDirections isn't copied
131 mDirection = aEvent.mDirection;
132 mDelta = aEvent.mDelta;
133 mClickCount = aEvent.mClickCount;
137 /******************************************************************************
138 * mozilla::WidgetTouchEvent
139 ******************************************************************************/
141 class WidgetTouchEvent : public WidgetInputEvent {
142 public:
143 typedef nsTArray<RefPtr<mozilla::dom::Touch>> TouchArray;
144 typedef AutoTArray<RefPtr<mozilla::dom::Touch>, 10> AutoTouchArray;
145 typedef AutoTouchArray::base_type TouchArrayBase;
147 virtual WidgetTouchEvent* AsTouchEvent() override { return this; }
149 MOZ_COUNTED_DEFAULT_CTOR(WidgetTouchEvent)
151 WidgetTouchEvent(const WidgetTouchEvent& aOther)
152 : WidgetInputEvent(aOther.IsTrusted(), aOther.mMessage, aOther.mWidget,
153 eTouchEventClass) {
154 MOZ_COUNT_CTOR(WidgetTouchEvent);
155 mModifiers = aOther.mModifiers;
156 mTime = aOther.mTime;
157 mTimeStamp = aOther.mTimeStamp;
158 mTouches.AppendElements(aOther.mTouches);
159 mFlags.mCancelable = mMessage != eTouchCancel;
160 mFlags.mHandledByAPZ = aOther.mFlags.mHandledByAPZ;
163 WidgetTouchEvent(bool aIsTrusted, EventMessage aMessage, nsIWidget* aWidget)
164 : WidgetInputEvent(aIsTrusted, aMessage, aWidget, eTouchEventClass) {
165 MOZ_COUNT_CTOR(WidgetTouchEvent);
166 mFlags.mCancelable = mMessage != eTouchCancel;
169 MOZ_COUNTED_DTOR_OVERRIDE(WidgetTouchEvent)
171 virtual WidgetEvent* Duplicate() const override {
172 MOZ_ASSERT(mClass == eTouchEventClass,
173 "Duplicate() must be overridden by sub class");
174 // Not copying widget, it is a weak reference.
175 WidgetTouchEvent* result = new WidgetTouchEvent(false, mMessage, nullptr);
176 result->AssignTouchEventData(*this, true);
177 result->mFlags = mFlags;
178 return result;
181 TouchArray mTouches;
183 void AssignTouchEventData(const WidgetTouchEvent& aEvent, bool aCopyTargets) {
184 AssignInputEventData(aEvent, aCopyTargets);
186 // Assign*EventData() assume that they're called only new instance.
187 MOZ_ASSERT(mTouches.IsEmpty());
188 mTouches.AppendElements(aEvent.mTouches);
192 } // namespace mozilla
194 #endif // mozilla_TouchEvents_h__