OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. |
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) | 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 27 matching lines...) Expand all Loading... |
38 #include "core/dom/TouchList.h" | 38 #include "core/dom/TouchList.h" |
39 #include "core/dom/shadow/ComposedTreeTraversal.h" | 39 #include "core/dom/shadow/ComposedTreeTraversal.h" |
40 #include "core/dom/shadow/ShadowRoot.h" | 40 #include "core/dom/shadow/ShadowRoot.h" |
41 #include "core/editing/Editor.h" | 41 #include "core/editing/Editor.h" |
42 #include "core/editing/FrameSelection.h" | 42 #include "core/editing/FrameSelection.h" |
43 #include "core/editing/htmlediting.h" | 43 #include "core/editing/htmlediting.h" |
44 #include "core/editing/iterators/TextIterator.h" | 44 #include "core/editing/iterators/TextIterator.h" |
45 #include "core/events/EventPath.h" | 45 #include "core/events/EventPath.h" |
46 #include "core/events/KeyboardEvent.h" | 46 #include "core/events/KeyboardEvent.h" |
47 #include "core/events/MouseEvent.h" | 47 #include "core/events/MouseEvent.h" |
| 48 #include "core/events/PointerEvent.h" |
48 #include "core/events/TextEvent.h" | 49 #include "core/events/TextEvent.h" |
49 #include "core/events/TouchEvent.h" | 50 #include "core/events/TouchEvent.h" |
50 #include "core/events/WheelEvent.h" | 51 #include "core/events/WheelEvent.h" |
51 #include "core/fetch/ImageResource.h" | 52 #include "core/fetch/ImageResource.h" |
52 #include "core/frame/EventHandlerRegistry.h" | 53 #include "core/frame/EventHandlerRegistry.h" |
53 #include "core/frame/FrameHost.h" | 54 #include "core/frame/FrameHost.h" |
54 #include "core/frame/FrameView.h" | 55 #include "core/frame/FrameView.h" |
55 #include "core/frame/LocalFrame.h" | 56 #include "core/frame/LocalFrame.h" |
56 #include "core/frame/PinchViewport.h" | 57 #include "core/frame/PinchViewport.h" |
57 #include "core/frame/Settings.h" | 58 #include "core/frame/Settings.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFire
d) | 231 , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFire
d) |
231 , m_svgPan(false) | 232 , m_svgPan(false) |
232 , m_resizeScrollableArea(nullptr) | 233 , m_resizeScrollableArea(nullptr) |
233 , m_eventHandlerWillResetCapturingMouseEventsNode(0) | 234 , m_eventHandlerWillResetCapturingMouseEventsNode(0) |
234 , m_clickCount(0) | 235 , m_clickCount(0) |
235 , m_shouldOnlyFireDragOverEvent(false) | 236 , m_shouldOnlyFireDragOverEvent(false) |
236 , m_mousePositionIsUnknown(true) | 237 , m_mousePositionIsUnknown(true) |
237 , m_mouseDownTimestamp(0) | 238 , m_mouseDownTimestamp(0) |
238 , m_widgetIsLatched(false) | 239 , m_widgetIsLatched(false) |
239 , m_touchPressed(false) | 240 , m_touchPressed(false) |
| 241 , m_primaryPointerId(0) |
240 , m_scrollGestureHandlingNode(nullptr) | 242 , m_scrollGestureHandlingNode(nullptr) |
241 , m_lastGestureScrollOverWidget(false) | 243 , m_lastGestureScrollOverWidget(false) |
242 , m_maxMouseMovedDuration(0) | 244 , m_maxMouseMovedDuration(0) |
243 , m_longTapShouldInvokeContextMenu(false) | 245 , m_longTapShouldInvokeContextMenu(false) |
244 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) | 246 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) |
245 , m_lastShowPressTimestamp(0) | 247 , m_lastShowPressTimestamp(0) |
246 , m_deltaConsumedForScrollSequence(false) | 248 , m_deltaConsumedForScrollSequence(false) |
247 { | 249 { |
248 } | 250 } |
249 | 251 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 m_previousWheelScrolledNode = nullptr; | 312 m_previousWheelScrolledNode = nullptr; |
311 m_targetForTouchID.clear(); | 313 m_targetForTouchID.clear(); |
312 m_touchSequenceDocument.clear(); | 314 m_touchSequenceDocument.clear(); |
313 m_touchSequenceUserGestureToken.clear(); | 315 m_touchSequenceUserGestureToken.clear(); |
314 m_scrollGestureHandlingNode = nullptr; | 316 m_scrollGestureHandlingNode = nullptr; |
315 m_lastGestureScrollOverWidget = false; | 317 m_lastGestureScrollOverWidget = false; |
316 m_previousGestureScrolledNode = nullptr; | 318 m_previousGestureScrolledNode = nullptr; |
317 m_scrollbarHandlingScrollGesture = nullptr; | 319 m_scrollbarHandlingScrollGesture = nullptr; |
318 m_maxMouseMovedDuration = 0; | 320 m_maxMouseMovedDuration = 0; |
319 m_touchPressed = false; | 321 m_touchPressed = false; |
| 322 m_primaryPointerId = 0; |
320 m_mouseDownMayStartSelect = false; | 323 m_mouseDownMayStartSelect = false; |
321 m_mouseDownMayStartDrag = false; | 324 m_mouseDownMayStartDrag = false; |
322 m_lastShowPressTimestamp = 0; | 325 m_lastShowPressTimestamp = 0; |
323 m_lastDeferredTapElement = nullptr; | 326 m_lastDeferredTapElement = nullptr; |
324 m_eventHandlerWillResetCapturingMouseEventsNode = false; | 327 m_eventHandlerWillResetCapturingMouseEventsNode = false; |
325 m_mouseDownWasSingleClickInSelection = false; | 328 m_mouseDownWasSingleClickInSelection = false; |
326 m_selectionInitiationState = HaveNotStartedSelection; | 329 m_selectionInitiationState = HaveNotStartedSelection; |
327 m_mouseDownMayStartAutoscroll = false; | 330 m_mouseDownMayStartAutoscroll = false; |
328 m_svgPan = false; | 331 m_svgPan = false; |
329 m_mouseDownPos = IntPoint(); | 332 m_mouseDownPos = IntPoint(); |
(...skipping 3439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3769 m_lastScrollbarUnderMouse->mouseExited(); | 3772 m_lastScrollbarUnderMouse->mouseExited(); |
3770 | 3773 |
3771 // Send mouse entered if we're setting a new scrollbar. | 3774 // Send mouse entered if we're setting a new scrollbar. |
3772 if (scrollbar && setLast) | 3775 if (scrollbar && setLast) |
3773 scrollbar->mouseEntered(); | 3776 scrollbar->mouseEntered(); |
3774 | 3777 |
3775 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr; | 3778 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr; |
3776 } | 3779 } |
3777 } | 3780 } |
3778 | 3781 |
3779 static const AtomicString& eventNameForTouchPointState(PlatformTouchPoint::State
state) | 3782 static const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::
State state) |
3780 { | 3783 { |
3781 switch (state) { | 3784 switch (state) { |
3782 case PlatformTouchPoint::TouchReleased: | 3785 case PlatformTouchPoint::TouchReleased: |
3783 return EventTypeNames::touchend; | 3786 return EventTypeNames::touchend; |
3784 case PlatformTouchPoint::TouchCancelled: | 3787 case PlatformTouchPoint::TouchCancelled: |
3785 return EventTypeNames::touchcancel; | 3788 return EventTypeNames::touchcancel; |
3786 case PlatformTouchPoint::TouchPressed: | 3789 case PlatformTouchPoint::TouchPressed: |
3787 return EventTypeNames::touchstart; | 3790 return EventTypeNames::touchstart; |
3788 case PlatformTouchPoint::TouchMoved: | 3791 case PlatformTouchPoint::TouchMoved: |
3789 return EventTypeNames::touchmove; | 3792 return EventTypeNames::touchmove; |
3790 case PlatformTouchPoint::TouchStationary: | 3793 case PlatformTouchPoint::TouchStationary: |
3791 // TouchStationary state is not converted to touch events, so fall throu
gh to assert. | 3794 // TouchStationary state is not converted to touch events, so fall throu
gh to assert. |
3792 default: | 3795 default: |
3793 ASSERT_NOT_REACHED(); | 3796 ASSERT_NOT_REACHED(); |
3794 return emptyAtom; | 3797 return emptyAtom; |
3795 } | 3798 } |
3796 } | 3799 } |
3797 | 3800 |
| 3801 static const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint
::State state) |
| 3802 { |
| 3803 switch (state) { |
| 3804 case PlatformTouchPoint::TouchReleased: |
| 3805 return EventTypeNames::pointerup; |
| 3806 case PlatformTouchPoint::TouchCancelled: |
| 3807 return EventTypeNames::pointercancel; |
| 3808 case PlatformTouchPoint::TouchPressed: |
| 3809 return EventTypeNames::pointerdown; |
| 3810 case PlatformTouchPoint::TouchMoved: |
| 3811 return EventTypeNames::pointermove; |
| 3812 case PlatformTouchPoint::TouchStationary: |
| 3813 // TouchStationary state is not converted to touch events, so fall throu
gh to assert. |
| 3814 default: |
| 3815 ASSERT_NOT_REACHED(); |
| 3816 return emptyAtom; |
| 3817 } |
| 3818 } |
| 3819 |
3798 HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const Layout
Point& point, HitTestRequest::HitTestRequestType hitType) | 3820 HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const Layout
Point& point, HitTestRequest::HitTestRequestType hitType) |
3799 { | 3821 { |
3800 HitTestResult result(HitTestRequest(hitType), point); | 3822 HitTestResult result(HitTestRequest(hitType), point); |
3801 | 3823 |
3802 if (!frame || !frame->contentLayoutObject()) | 3824 if (!frame || !frame->contentLayoutObject()) |
3803 return result; | 3825 return result; |
3804 if (frame->view()) { | 3826 if (frame->view()) { |
3805 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); | 3827 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); |
3806 if (!rect.contains(roundedIntPoint(point))) | 3828 if (!rect.contains(roundedIntPoint(point))) |
3807 return result; | 3829 return result; |
3808 } | 3830 } |
3809 frame->contentLayoutObject()->hitTest(result); | 3831 frame->contentLayoutObject()->hitTest(result); |
3810 return result; | 3832 return result; |
3811 } | 3833 } |
3812 | 3834 |
3813 bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event) | 3835 bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event) |
3814 { | 3836 { |
3815 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent"); | 3837 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent"); |
3816 | 3838 |
3817 const Vector<PlatformTouchPoint>& points = event.touchPoints(); | 3839 const Vector<PlatformTouchPoint>& points = event.touchPoints(); |
3818 | 3840 |
3819 unsigned i; | |
3820 bool freshTouchEvents = true; | 3841 bool freshTouchEvents = true; |
3821 bool allTouchReleased = true; | 3842 bool allTouchReleased = true; |
3822 for (i = 0; i < points.size(); ++i) { | 3843 for (unsigned i = 0; i < points.size(); ++i) { |
3823 const PlatformTouchPoint& point = points[i]; | 3844 const PlatformTouchPoint& point = points[i]; |
3824 if (point.state() != PlatformTouchPoint::TouchPressed) | 3845 if (point.state() != PlatformTouchPoint::TouchPressed) |
3825 freshTouchEvents = false; | 3846 freshTouchEvents = false; |
3826 if (point.state() != PlatformTouchPoint::TouchReleased && point.state()
!= PlatformTouchPoint::TouchCancelled) | 3847 if (point.state() != PlatformTouchPoint::TouchReleased && point.state()
!= PlatformTouchPoint::TouchCancelled) |
3827 allTouchReleased = false; | 3848 allTouchReleased = false; |
3828 } | 3849 } |
3829 if (freshTouchEvents) { | 3850 if (freshTouchEvents) { |
3830 // Ideally we'd ASSERT !m_touchSequenceDocument here since we should | 3851 // Ideally we'd ASSERT !m_touchSequenceDocument here since we should |
3831 // have cleared the active document when we saw the last release. But we | 3852 // have cleared the active document when we saw the last release. But we |
3832 // have some tests that violate this, ClusterFuzz could trigger it, and | 3853 // have some tests that violate this, ClusterFuzz could trigger it, and |
(...skipping 13 matching lines...) Expand all Loading... |
3846 m_touchSequenceUserGestureToken = gestureIndicator->currentToken(); | 3867 m_touchSequenceUserGestureToken = gestureIndicator->currentToken(); |
3847 | 3868 |
3848 ASSERT(m_frame->view()); | 3869 ASSERT(m_frame->view()); |
3849 if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touc
hSequenceDocument->frame()->view())) { | 3870 if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touc
hSequenceDocument->frame()->view())) { |
3850 // If the active touch document has no frame or view, it's probably bein
g destroyed | 3871 // If the active touch document has no frame or view, it's probably bein
g destroyed |
3851 // so we can't dispatch events. | 3872 // so we can't dispatch events. |
3852 return false; | 3873 return false; |
3853 } | 3874 } |
3854 | 3875 |
3855 // First do hit tests for any new touch points. | 3876 // First do hit tests for any new touch points. |
3856 for (i = 0; i < points.size(); ++i) { | 3877 for (unsigned i = 0; i < points.size(); ++i) { |
3857 const PlatformTouchPoint& point = points[i]; | 3878 const PlatformTouchPoint& point = points[i]; |
3858 | 3879 |
3859 // Touch events implicitly capture to the touched node, and don't change | 3880 // Touch events implicitly capture to the touched node, and don't change |
3860 // active/hover states themselves (Gesture events do). So we only need | 3881 // active/hover states themselves (Gesture events do). So we only need |
3861 // to hit-test on touchstart, and it can be read-only. | 3882 // to hit-test on touchstart, and it can be read-only. |
3862 if (point.state() == PlatformTouchPoint::TouchPressed) { | 3883 if (point.state() == PlatformTouchPoint::TouchPressed) { |
3863 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv
ent | HitTestRequest::ReadOnly | HitTestRequest::Active; | 3884 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv
ent | HitTestRequest::ReadOnly | HitTestRequest::Active; |
3864 LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->rootFram
eToContents(point.pos())); | 3885 LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->rootFram
eToContents(point.pos())); |
3865 HitTestResult result; | 3886 HitTestResult result; |
3866 if (!m_touchSequenceDocument) { | 3887 if (!m_touchSequenceDocument) { |
(...skipping 14 matching lines...) Expand all Loading... |
3881 node = ComposedTreeTraversal::parent(*node); | 3902 node = ComposedTreeTraversal::parent(*node); |
3882 | 3903 |
3883 if (!m_touchSequenceDocument) { | 3904 if (!m_touchSequenceDocument) { |
3884 // Keep track of which document should receive all touch events | 3905 // Keep track of which document should receive all touch events |
3885 // in the active sequence. This must be a single document to | 3906 // in the active sequence. This must be a single document to |
3886 // ensure we don't leak Nodes between documents. | 3907 // ensure we don't leak Nodes between documents. |
3887 m_touchSequenceDocument = &(result.innerNode()->document()); | 3908 m_touchSequenceDocument = &(result.innerNode()->document()); |
3888 ASSERT(m_touchSequenceDocument->frame()->view()); | 3909 ASSERT(m_touchSequenceDocument->frame()->view()); |
3889 } | 3910 } |
3890 | 3911 |
| 3912 // If it is the first TouchPressed we have seen so far, we will cons
ider it primary. |
| 3913 if (!m_primaryPointerId) |
| 3914 m_primaryPointerId = point.id(); |
| 3915 |
3891 // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id()) | 3916 // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id()) |
3892 // since we shouldn't get a touchstart for a touch that's already | 3917 // since we shouldn't get a touchstart for a touch that's already |
3893 // down. However EventSender allows this to be violated and there's | 3918 // down. However EventSender allows this to be violated and there's |
3894 // some tests that take advantage of it. There may also be edge | 3919 // some tests that take advantage of it. There may also be edge |
3895 // cases in the browser where this happens. | 3920 // cases in the browser where this happens. |
3896 // See http://crbug.com/345372. | 3921 // See http://crbug.com/345372. |
3897 m_targetForTouchID.set(point.id(), node); | 3922 m_targetForTouchID.set(point.id(), node); |
3898 | 3923 |
3899 TouchAction effectiveTouchAction = computeEffectiveTouchAction(*node
); | 3924 TouchAction effectiveTouchAction = computeEffectiveTouchAction(*node
); |
3900 if (effectiveTouchAction != TouchActionAuto) | 3925 if (effectiveTouchAction != TouchActionAuto) |
3901 m_frame->page()->chrome().client().setTouchAction(effectiveTouch
Action); | 3926 m_frame->page()->chrome().client().setTouchAction(effectiveTouch
Action); |
3902 } | 3927 } |
3903 } | 3928 } |
3904 | 3929 |
3905 m_touchPressed = !allTouchReleased; | 3930 m_touchPressed = !allTouchReleased; |
3906 | 3931 |
| 3932 unsigned lastPrimaryPointerId = m_primaryPointerId; |
| 3933 if (allTouchReleased) |
| 3934 m_primaryPointerId = 0; |
| 3935 |
3907 // If there's no document receiving touch events, or no handlers on the | 3936 // If there's no document receiving touch events, or no handlers on the |
3908 // document set to receive the events, then we can skip all the rest of | 3937 // document set to receive the events, then we can skip all the rest of |
3909 // this work. | 3938 // this work. |
3910 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !m_
touchSequenceDocument->frameHost()->eventHandlerRegistry().hasEventHandlers(Even
tHandlerRegistry::TouchEvent) || !m_touchSequenceDocument->frame()) { | 3939 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !m_
touchSequenceDocument->frameHost()->eventHandlerRegistry().hasEventHandlers(Even
tHandlerRegistry::TouchEvent) || !m_touchSequenceDocument->frame()) { |
3911 if (allTouchReleased) { | 3940 if (allTouchReleased) { |
3912 m_touchSequenceDocument.clear(); | 3941 m_touchSequenceDocument.clear(); |
3913 m_touchSequenceUserGestureToken.clear(); | 3942 m_touchSequenceUserGestureToken.clear(); |
3914 } | 3943 } |
3915 return false; | 3944 return false; |
3916 } | 3945 } |
(...skipping 14 matching lines...) Expand all Loading... |
3931 // Array of touches per state, used to assemble the 'changedTouches' list. | 3960 // Array of touches per state, used to assemble the 'changedTouches' list. |
3932 using EventTargetSet = WillBeHeapHashSet<RefPtrWillBeMember<EventTarget>>; | 3961 using EventTargetSet = WillBeHeapHashSet<RefPtrWillBeMember<EventTarget>>; |
3933 struct { | 3962 struct { |
3934 // The touches corresponding to the particular change state this struct | 3963 // The touches corresponding to the particular change state this struct |
3935 // instance represents. | 3964 // instance represents. |
3936 RefPtrWillBeMember<TouchList> m_touches; | 3965 RefPtrWillBeMember<TouchList> m_touches; |
3937 // Set of targets involved in m_touches. | 3966 // Set of targets involved in m_touches. |
3938 EventTargetSet m_targets; | 3967 EventTargetSet m_targets; |
3939 } changedTouches[PlatformTouchPoint::TouchStateEnd]; | 3968 } changedTouches[PlatformTouchPoint::TouchStateEnd]; |
3940 | 3969 |
3941 for (i = 0; i < points.size(); ++i) { | 3970 for (unsigned i = 0; i < points.size(); ++i) { |
3942 const PlatformTouchPoint& point = points[i]; | 3971 const PlatformTouchPoint& point = points[i]; |
3943 PlatformTouchPoint::State pointState = point.state(); | 3972 PlatformTouchPoint::State pointState = point.state(); |
3944 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr; | 3973 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr; |
3945 | 3974 |
3946 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla
tformTouchPoint::TouchCancelled) { | 3975 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla
tformTouchPoint::TouchCancelled) { |
3947 // The target should be the original target for this touch, so get | 3976 // The target should be the original target for this touch, so get |
3948 // it from the hashmap. As it's a release or cancel we also remove | 3977 // it from the hashmap. As it's a release or cancel we also remove |
3949 // it from the map. | 3978 // it from the map. |
3950 touchTarget = m_targetForTouchID.take(point.id()); | 3979 touchTarget = m_targetForTouchID.take(point.id()); |
3951 } else { | 3980 } else { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4024 changedTouches[pointState].m_touches = TouchList::create(); | 4053 changedTouches[pointState].m_touches = TouchList::create(); |
4025 changedTouches[pointState].m_touches->append(touch); | 4054 changedTouches[pointState].m_touches->append(touch); |
4026 changedTouches[pointState].m_targets.add(touchTarget); | 4055 changedTouches[pointState].m_targets.add(touchTarget); |
4027 } | 4056 } |
4028 } | 4057 } |
4029 if (allTouchReleased) { | 4058 if (allTouchReleased) { |
4030 m_touchSequenceDocument.clear(); | 4059 m_touchSequenceDocument.clear(); |
4031 m_touchSequenceUserGestureToken.clear(); | 4060 m_touchSequenceUserGestureToken.clear(); |
4032 } | 4061 } |
4033 | 4062 |
| 4063 bool swallowedEvent = false; |
| 4064 |
| 4065 if (RuntimeEnabledFeatures::pointerEventEnabled()) { |
| 4066 // Iterate the changedTouches list and m_targets within it, sending Poin
terEvents |
| 4067 // to the targets as required. |
| 4068 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++s
tate) { |
| 4069 if (!changedTouches[state].m_touches) |
| 4070 continue; |
| 4071 |
| 4072 const AtomicString& eventName(pointerEventNameForTouchPointState(sta
tic_cast<PlatformTouchPoint::State>(state))); |
| 4073 const EventTargetSet& targetsForState = changedTouches[state].m_targ
ets; |
| 4074 |
| 4075 for (const RefPtrWillBeMember<EventTarget>& eventTarget : targetsFor
State) { |
| 4076 EventTarget* pointerEventTarget = eventTarget.get(); |
| 4077 TouchList* touchesForTarget = touchesByTarget.get(pointerEventTa
rget); |
| 4078 for (unsigned i = 0; i < touchesForTarget->length(); i++) { |
| 4079 Touch* touch = touchesForTarget->item(i); |
| 4080 |
| 4081 PointerEventInit pointerEventInit; |
| 4082 pointerEventInit.setPointerId(touch->identifier()); |
| 4083 pointerEventInit.setWidth(touch->radiusX()); |
| 4084 pointerEventInit.setHeight(touch->radiusY()); |
| 4085 pointerEventInit.setPressure(touch->force()); |
| 4086 pointerEventInit.setTiltX(0.0); |
| 4087 pointerEventInit.setTiltY(0.0); |
| 4088 pointerEventInit.setPointerType(eventName); |
| 4089 pointerEventInit.setIsPrimary(lastPrimaryPointerId == touch-
>identifier()); |
| 4090 |
| 4091 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = PointerEvent
::create(eventName, pointerEventInit); |
| 4092 pointerEventTarget->toNode()->dispatchPointerEvent(pointerEv
ent.get()); |
| 4093 swallowedEvent = swallowedEvent || pointerEvent->defaultPrev
ented() || pointerEvent->defaultHandled(); |
| 4094 } |
| 4095 } |
| 4096 } |
| 4097 |
| 4098 // Skip firing TouchEvent's if any PointerEvent was consumed. |
| 4099 if (swallowedEvent) |
| 4100 return true; |
| 4101 } |
| 4102 |
4034 // Now iterate the changedTouches list and m_targets within it, sending | 4103 // Now iterate the changedTouches list and m_targets within it, sending |
4035 // events to the targets as required. | 4104 // TouchEvents to the targets as required. |
4036 bool swallowedEvent = false; | |
4037 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state
) { | 4105 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state
) { |
4038 if (!changedTouches[state].m_touches) | 4106 if (!changedTouches[state].m_touches) |
4039 continue; | 4107 continue; |
4040 | 4108 |
4041 const AtomicString& stateName(eventNameForTouchPointState(static_cast<Pl
atformTouchPoint::State>(state))); | 4109 const AtomicString& eventName(touchEventNameForTouchPointState(static_ca
st<PlatformTouchPoint::State>(state))); |
4042 const EventTargetSet& targetsForState = changedTouches[state].m_targets; | 4110 const EventTargetSet& targetsForState = changedTouches[state].m_targets; |
4043 for (const RefPtrWillBeMember<EventTarget>& eventTarget : targetsForStat
e) { | 4111 for (const RefPtrWillBeMember<EventTarget>& eventTarget : targetsForStat
e) { |
4044 EventTarget* touchEventTarget = eventTarget.get(); | 4112 EventTarget* touchEventTarget = eventTarget.get(); |
4045 RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create( | 4113 RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create( |
4046 touches.get(), touchesByTarget.get(touchEventTarget), changedTou
ches[state].m_touches.get(), | 4114 touches.get(), touchesByTarget.get(touchEventTarget), changedTou
ches[state].m_touches.get(), |
4047 stateName, touchEventTarget->toNode()->document().domWindow(), | 4115 eventName, touchEventTarget->toNode()->document().domWindow(), |
4048 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey
(), event.cancelable(), event.causesScrollingIfUncanceled(), event.timestamp()); | 4116 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey
(), event.cancelable(), event.causesScrollingIfUncanceled(), event.timestamp()); |
4049 touchEventTarget->toNode()->dispatchTouchEvent(touchEvent.get()); | 4117 touchEventTarget->toNode()->dispatchTouchEvent(touchEvent.get()); |
4050 swallowedEvent = swallowedEvent || touchEvent->defaultPrevented() ||
touchEvent->defaultHandled(); | 4118 swallowedEvent = swallowedEvent || touchEvent->defaultPrevented() ||
touchEvent->defaultHandled(); |
4051 } | 4119 } |
4052 } | 4120 } |
4053 | 4121 |
4054 return swallowedEvent; | 4122 return swallowedEvent; |
4055 } | 4123 } |
4056 | 4124 |
4057 TouchAction EventHandler::intersectTouchAction(TouchAction action1, TouchAction
action2) | 4125 TouchAction EventHandler::intersectTouchAction(TouchAction action1, TouchAction
action2) |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4169 unsigned EventHandler::accessKeyModifiers() | 4237 unsigned EventHandler::accessKeyModifiers() |
4170 { | 4238 { |
4171 #if OS(MACOSX) | 4239 #if OS(MACOSX) |
4172 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 4240 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
4173 #else | 4241 #else |
4174 return PlatformEvent::AltKey; | 4242 return PlatformEvent::AltKey; |
4175 #endif | 4243 #endif |
4176 } | 4244 } |
4177 | 4245 |
4178 } // namespace blink | 4246 } // namespace blink |
OLD | NEW |