| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TouchEventManager_h |
| #define TouchEventManager_h |
| |
| #include "core/CoreExport.h" |
| #include "core/events/PointerEventFactory.h" |
| #include "platform/UserGestureIndicator.h" |
| #include "public/platform/WebInputEventResult.h" |
| #include "wtf/Allocator.h" |
| #include "wtf/HashMap.h" |
| |
| namespace blink { |
| |
| class LocalFrame; |
| class Document; |
| class PlatformTouchEvent; |
| |
| // This class takes care of dispatching all touch events and |
| // maintaining related states. |
| class CORE_EXPORT TouchEventManager |
| : public GarbageCollectedFinalized<TouchEventManager>, |
| public UserGestureUtilizedCallback { |
| WTF_MAKE_NONCOPYABLE(TouchEventManager); |
| |
| public: |
| class TouchInfo { |
| DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
| |
| public: |
| DEFINE_INLINE_TRACE() { |
| visitor->trace(touchNode); |
| visitor->trace(targetFrame); |
| } |
| |
| PlatformTouchPoint point; |
| Member<Node> touchNode; |
| Member<LocalFrame> targetFrame; |
| FloatPoint contentPoint; |
| FloatSize adjustedRadius; |
| bool knownTarget; |
| String region; |
| }; |
| |
| explicit TouchEventManager(LocalFrame*); |
| DECLARE_TRACE(); |
| |
| // Does the hit-testing again if the original hit test result was not inside |
| // capturing frame for touch events. Returns true if touch events could be |
| // dispatched and otherwise returns false. |
| bool reHitTestTouchPointsIfNeeded(const PlatformTouchEvent&, |
| HeapVector<TouchInfo>&); |
| |
| // The TouchInfo array is reference just to prevent the copy. However, it |
| // cannot be const as this function might change some of the properties in |
| // TouchInfo objects. |
| WebInputEventResult handleTouchEvent(const PlatformTouchEvent&, |
| HeapVector<TouchInfo>&); |
| |
| // Resets the internal state of this object. |
| void clear(); |
| |
| // Returns whether there is any touch on the screen. |
| bool isAnyTouchActive() const; |
| |
| // Indicate that a touch scroll has started. |
| void setTouchScrollStarted() { m_touchScrollStarted = true; } |
| |
| // Invoked when a UserGestureIndicator corresponding to a touch event is |
| // utilized. |
| void userGestureUtilized() override; |
| |
| private: |
| void updateTargetAndRegionMapsForTouchStarts(HeapVector<TouchInfo>&); |
| void setAllPropertiesOfTouchInfos(HeapVector<TouchInfo>&); |
| |
| WebInputEventResult dispatchTouchEvents(const PlatformTouchEvent&, |
| const HeapVector<TouchInfo>&, |
| bool allTouchesReleased); |
| |
| // NOTE: If adding a new field to this class please ensure that it is |
| // cleared in |TouchEventManager::clear()|. |
| |
| const Member<LocalFrame> m_frame; |
| |
| // The target of each active touch point indexed by the touch ID. |
| using TouchTargetMap = |
| HeapHashMap<unsigned, |
| Member<Node>, |
| DefaultHash<unsigned>::Hash, |
| WTF::UnsignedWithZeroKeyHashTraits<unsigned>>; |
| TouchTargetMap m_targetForTouchID; |
| using TouchRegionMap = HashMap<unsigned, |
| String, |
| DefaultHash<unsigned>::Hash, |
| WTF::UnsignedWithZeroKeyHashTraits<unsigned>>; |
| TouchRegionMap m_regionForTouchID; |
| |
| // If set, the document of the active touch sequence. Unset if no touch |
| // sequence active. |
| Member<Document> m_touchSequenceDocument; |
| |
| RefPtr<UserGestureToken> m_touchSequenceUserGestureToken; |
| bool m_touchPressed; |
| // True if a touch is active but scrolling/zooming has started. |
| bool m_touchScrollStarted; |
| // The touch event currently being handled or NoType if none. |
| PlatformEvent::EventType m_currentEvent; |
| }; |
| |
| } // namespace blink |
| |
| WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::TouchEventManager::TouchInfo); |
| |
| #endif // TouchEventManager_h |