OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef TouchEventManager_h | 5 #ifndef TouchEventManager_h |
6 #define TouchEventManager_h | 6 #define TouchEventManager_h |
7 | 7 |
8 #include "core/CoreExport.h" | 8 #include "core/CoreExport.h" |
9 #include "core/events/PointerEventFactory.h" | 9 #include "core/events/PointerEventFactory.h" |
10 #include "core/input/EventHandlingUtil.h" | 10 #include "core/input/EventHandlingUtil.h" |
11 #include "platform/graphics/TouchAction.h" | 11 #include "platform/graphics/TouchAction.h" |
12 #include "platform/wtf/Allocator.h" | 12 #include "platform/wtf/Allocator.h" |
13 #include "platform/wtf/HashMap.h" | 13 #include "platform/wtf/HashMap.h" |
14 #include "platform/wtf/Vector.h" | 14 #include "platform/wtf/Vector.h" |
| 15 #include "public/platform/WebCoalescedInputEvent.h" |
15 #include "public/platform/WebInputEventResult.h" | 16 #include "public/platform/WebInputEventResult.h" |
16 #include "public/platform/WebTouchPoint.h" | 17 #include "public/platform/WebPointerEvent.h" |
| 18 #include "public/platform/WebTouchEvent.h" |
17 | 19 |
18 namespace blink { | 20 namespace blink { |
19 | 21 |
20 class LocalFrame; | 22 class LocalFrame; |
21 class Document; | 23 class Document; |
22 class WebTouchEvent; | |
23 | 24 |
24 // This class takes care of dispatching all touch events and | 25 // This class takes care of dispatching all touch events and |
25 // maintaining related states. | 26 // maintaining related states. |
26 class CORE_EXPORT TouchEventManager | 27 class CORE_EXPORT TouchEventManager |
27 : public GarbageCollectedFinalized<TouchEventManager> { | 28 : public GarbageCollectedFinalized<TouchEventManager> { |
28 WTF_MAKE_NONCOPYABLE(TouchEventManager); | 29 WTF_MAKE_NONCOPYABLE(TouchEventManager); |
29 | 30 |
30 public: | 31 public: |
31 | 32 |
32 explicit TouchEventManager(LocalFrame&); | 33 explicit TouchEventManager(LocalFrame&); |
33 DECLARE_TRACE(); | 34 DECLARE_TRACE(); |
34 | 35 |
35 // The entries in touch point array of WebTouchEvent (i.e. first parameter) | 36 void HandleTouchPoint(const WebPointerEvent&, |
36 // correspond to the entries of the PointerEventTargets (i.e. last parameter). | 37 const Vector<WebPointerEvent>&, |
37 WebInputEventResult HandleTouchEvent( | 38 const EventHandlingUtil::PointerEventTarget&); |
38 const WebTouchEvent&, | 39 |
39 const Vector<WebTouchEvent>&, | 40 WebInputEventResult FlushEvents(); |
40 const HeapVector<EventHandlingUtil::PointerEventTarget>&); | |
41 | 41 |
42 // Resets the internal state of this object. | 42 // Resets the internal state of this object. |
43 void Clear(); | 43 void Clear(); |
44 | 44 |
45 // Returns whether there is any touch on the screen. | 45 // Returns whether there is any touch on the screen. |
46 bool IsAnyTouchActive() const; | 46 bool IsAnyTouchActive() const; |
47 | 47 |
48 private: | 48 private: |
49 Touch* CreateDomTouch(const WebTouchPoint&, bool* known_target); | 49 // Class represending one touch point event with its coalesced events and |
| 50 // related attributes. |
| 51 class TouchPointAttributes |
| 52 : public GarbageCollectedFinalized<TouchPointAttributes> { |
| 53 public: |
| 54 DEFINE_INLINE_TRACE() { visitor->Trace(target_); } |
50 | 55 |
51 void UpdateTargetAndRegionMapsForTouchStart( | 56 TouchPointAttributes() {} |
52 const WebTouchPoint&, | 57 explicit TouchPointAttributes(WebPointerEvent event) |
| 58 : event_(event), stale_(false) {} |
| 59 |
| 60 // Last state of the touch point. |
| 61 WebPointerEvent event_; |
| 62 // The list of coalesced events of the touch point represented by this class |
| 63 // if there is any. Note that at the end of each frame this list gets |
| 64 // cleared and the touch point |stale_| flag will be true for the next frame |
| 65 // unless more new events arrives for this touch point. |
| 66 Vector<WebPointerEvent> coalesced_events_; |
| 67 Member<Node> target_; // The target of each active touch point. |
| 68 String region_; // // The region of each active touch point. |
| 69 bool stale_; |
| 70 }; |
| 71 |
| 72 WebCoalescedInputEvent GenerateWebCoalescedInputEvent(); |
| 73 Touch* CreateDomTouch(const TouchPointAttributes*, bool* known_target); |
| 74 void AllTouchesReleasedCleanup(); |
| 75 |
| 76 // Keeps track of attributes of the touch point in the |
| 77 // |touch_points_attributes_| map and does the hit-testing if the original hit |
| 78 // test result was not inside capturing frame |touch_sequence_document_| for |
| 79 // touch events. |
| 80 void UpdateTouchAttributeMapsForPointerDown( |
| 81 const WebPointerEvent&, |
53 const EventHandlingUtil::PointerEventTarget&); | 82 const EventHandlingUtil::PointerEventTarget&); |
54 | 83 |
55 // Does the hit-testing if the original hit test result was not inside | 84 // This is triggered either by VSync signal to send one touch event per frame |
56 // capturing frame for touch events. Returns true if touch events could be | 85 // accumulating all move events or by discrete events pointerdown/up/cancel. |
57 // dispatched and otherwise returns false. | 86 WebInputEventResult DispatchTouchEventFromAccumulatdTouchPoints(); |
58 bool HitTestTouchPointsIfNeeded( | |
59 const WebTouchEvent&, | |
60 const HeapVector<EventHandlingUtil::PointerEventTarget>&); | |
61 | |
62 WebInputEventResult DispatchTouchEvents(const WebTouchEvent&, | |
63 const Vector<WebTouchEvent>&, | |
64 bool all_touches_released); | |
65 | 87 |
66 // NOTE: If adding a new field to this class please ensure that it is | 88 // NOTE: If adding a new field to this class please ensure that it is |
67 // cleared in |TouchEventManager::clear()|. | 89 // cleared in |TouchEventManager::clear()|. |
68 | 90 |
69 const Member<LocalFrame> frame_; | 91 const Member<LocalFrame> frame_; |
70 | 92 |
71 // The target of each active touch point indexed by the touch ID. | 93 // The attributes of each active touch point indexed by the touch ID. |
72 using TouchTargetMap = | 94 using TouchAttributeMap = |
73 HeapHashMap<unsigned, | 95 HeapHashMap<int, |
74 Member<Node>, | 96 Member<TouchPointAttributes>, |
75 DefaultHash<unsigned>::Hash, | 97 WTF::IntHash<int>, |
76 WTF::UnsignedWithZeroKeyHashTraits<unsigned>>; | 98 WTF::UnsignedWithZeroKeyHashTraits<int>>; |
77 TouchTargetMap target_for_touch_id_; | 99 TouchAttributeMap touch_attribute_map_; |
78 using TouchRegionMap = HashMap<unsigned, | |
79 String, | |
80 DefaultHash<unsigned>::Hash, | |
81 WTF::UnsignedWithZeroKeyHashTraits<unsigned>>; | |
82 TouchRegionMap region_for_touch_id_; | |
83 | 100 |
84 // If set, the document of the active touch sequence. Unset if no touch | 101 // If set, the document of the active touch sequence. Unset if no touch |
85 // sequence active. | 102 // sequence active. |
86 Member<Document> touch_sequence_document_; | 103 Member<Document> touch_sequence_document_; |
87 | 104 |
88 bool touch_pressed_; | |
89 bool suppressing_touchmoves_within_slop_; | 105 bool suppressing_touchmoves_within_slop_; |
90 | 106 |
| 107 // This is used to created a consistent sequence of coalesced events compared |
| 108 // to the last frame. |
| 109 WebTouchEvent last_coalesced_touch_event_; |
| 110 |
91 // The current touch action, computed on each touch start and is | 111 // The current touch action, computed on each touch start and is |
92 // a union of all touches. Reset when all touches are released. | 112 // a union of all touches. Reset when all touches are released. |
93 TouchAction current_touch_action_; | 113 TouchAction current_touch_action_; |
94 }; | 114 }; |
95 | 115 |
96 } // namespace blink | 116 } // namespace blink |
97 | 117 |
98 #endif // TouchEventManager_h | 118 #endif // TouchEventManager_h |
OLD | NEW |