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 #include "core/input/TouchEventManager.h" | 5 #include "core/input/TouchEventManager.h" |
6 | 6 |
7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
8 #include "core/events/TouchEvent.h" | 8 #include "core/events/TouchEvent.h" |
9 #include "core/frame/Deprecation.h" | 9 #include "core/frame/Deprecation.h" |
10 #include "core/frame/EventHandlerRegistry.h" | 10 #include "core/frame/EventHandlerRegistry.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 STACK_ALLOCATED(); | 74 STACK_ALLOCATED(); |
75 | 75 |
76 public: | 76 public: |
77 // The touches corresponding to the particular change state this struct | 77 // The touches corresponding to the particular change state this struct |
78 // instance represents. | 78 // instance represents. |
79 Member<TouchList> m_touches; | 79 Member<TouchList> m_touches; |
80 | 80 |
81 using EventTargetSet = HeapHashSet<Member<EventTarget>>; | 81 using EventTargetSet = HeapHashSet<Member<EventTarget>>; |
82 // Set of targets involved in m_touches. | 82 // Set of targets involved in m_touches. |
83 EventTargetSet m_targets; | 83 EventTargetSet m_targets; |
| 84 |
| 85 WebPointerProperties::PointerType m_pointerType; |
84 }; | 86 }; |
85 | 87 |
86 } // namespace | 88 } // namespace |
87 | 89 |
88 TouchEventManager::TouchEventManager(LocalFrame* frame) : m_frame(frame) { | 90 TouchEventManager::TouchEventManager(LocalFrame* frame) : m_frame(frame) { |
89 clear(); | 91 clear(); |
90 } | 92 } |
91 | 93 |
92 void TouchEventManager::clear() { | 94 void TouchEventManager::clear() { |
93 m_touchSequenceDocument.clear(); | 95 m_touchSequenceDocument.clear(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 // never be in the |changedTouches| list so we do not handle them | 159 // never be in the |changedTouches| list so we do not handle them |
158 // explicitly here. See https://bugs.webkit.org/show_bug.cgi?id=37609 | 160 // explicitly here. See https://bugs.webkit.org/show_bug.cgi?id=37609 |
159 // for further discussion about the TouchStationary state. | 161 // for further discussion about the TouchStationary state. |
160 if (pointState != PlatformTouchPoint::TouchStationary && | 162 if (pointState != PlatformTouchPoint::TouchStationary && |
161 touchInfo.knownTarget) { | 163 touchInfo.knownTarget) { |
162 ASSERT(pointState < PlatformTouchPoint::TouchStateEnd); | 164 ASSERT(pointState < PlatformTouchPoint::TouchStateEnd); |
163 if (!changedTouches[pointState].m_touches) | 165 if (!changedTouches[pointState].m_touches) |
164 changedTouches[pointState].m_touches = TouchList::create(); | 166 changedTouches[pointState].m_touches = TouchList::create(); |
165 changedTouches[pointState].m_touches->append(touch); | 167 changedTouches[pointState].m_touches->append(touch); |
166 changedTouches[pointState].m_targets.add(touchInfo.touchNode); | 168 changedTouches[pointState].m_targets.add(touchInfo.touchNode); |
| 169 changedTouches[pointState].m_pointerType = |
| 170 point.pointerProperties().pointerType; |
167 } | 171 } |
168 } | 172 } |
169 | 173 |
170 if (allTouchesReleased) { | 174 if (allTouchesReleased) { |
171 m_touchSequenceDocument.clear(); | 175 m_touchSequenceDocument.clear(); |
172 m_currentTouchAction = TouchActionAuto; | 176 m_currentTouchAction = TouchActionAuto; |
173 } | 177 } |
174 | 178 |
175 WebInputEventResult eventResult = WebInputEventResult::NotHandled; | 179 WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
176 | 180 |
177 // Now iterate through the |changedTouches| list and |m_targets| within it, | 181 // Now iterate through the |changedTouches| list and |m_targets| within it, |
178 // sending TouchEvents to the targets as required. | 182 // sending TouchEvents to the targets as required. |
179 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; | 183 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; |
180 ++state) { | 184 ++state) { |
181 if (!changedTouches[state].m_touches) | 185 if (!changedTouches[state].m_touches) |
182 continue; | 186 continue; |
183 | 187 |
184 const AtomicString& eventName(touchEventNameForTouchPointState( | 188 const AtomicString& eventName(touchEventNameForTouchPointState( |
185 static_cast<PlatformTouchPoint::TouchState>(state))); | 189 static_cast<PlatformTouchPoint::TouchState>(state))); |
186 for (const auto& eventTarget : changedTouches[state].m_targets) { | 190 for (const auto& eventTarget : changedTouches[state].m_targets) { |
187 EventTarget* touchEventTarget = eventTarget; | 191 EventTarget* touchEventTarget = eventTarget; |
188 TouchEvent* touchEvent = | 192 TouchEvent* touchEvent = TouchEvent::create( |
189 TouchEvent::create(touches, touchesByTarget.get(touchEventTarget), | 193 touches, touchesByTarget.get(touchEventTarget), |
190 changedTouches[state].m_touches.get(), eventName, | 194 changedTouches[state].m_touches.get(), eventName, |
191 touchEventTarget->toNode()->document().domWindow(), | 195 touchEventTarget->toNode()->document().domWindow(), |
192 event.getModifiers(), event.cancelable(), | 196 event.getModifiers(), event.cancelable(), |
193 event.causesScrollingIfUncanceled(), | 197 event.causesScrollingIfUncanceled(), |
194 event.touchStartOrFirstTouchMove(), | 198 event.touchStartOrFirstTouchMove(), event.timestamp(), |
195 event.timestamp(), m_currentTouchAction); | 199 m_currentTouchAction, changedTouches[state].m_pointerType); |
196 | 200 |
197 DispatchEventResult domDispatchResult = | 201 DispatchEventResult domDispatchResult = |
198 touchEventTarget->dispatchEvent(touchEvent); | 202 touchEventTarget->dispatchEvent(touchEvent); |
199 | 203 |
200 // Only report for top level documents with a single touch on | 204 // Only report for top level documents with a single touch on |
201 // touch-start or the first touch-move. | 205 // touch-start or the first touch-move. |
202 if (event.touchStartOrFirstTouchMove() && touchInfos.size() == 1 && | 206 if (event.touchStartOrFirstTouchMove() && touchInfos.size() == 1 && |
203 m_frame->isMainFrame()) { | 207 m_frame->isMainFrame()) { |
204 // Record the disposition and latency of touch starts and first touch | 208 // Record the disposition and latency of touch starts and first touch |
205 // moves before and after the page is fully loaded respectively. | 209 // moves before and after the page is fully loaded respectively. |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 } | 507 } |
504 | 508 |
505 return dispatchTouchEvents(event, touchInfos, allTouchesReleased); | 509 return dispatchTouchEvents(event, touchInfos, allTouchesReleased); |
506 } | 510 } |
507 | 511 |
508 bool TouchEventManager::isAnyTouchActive() const { | 512 bool TouchEventManager::isAnyTouchActive() const { |
509 return m_touchPressed; | 513 return m_touchPressed; |
510 } | 514 } |
511 | 515 |
512 } // namespace blink | 516 } // namespace blink |
OLD | NEW |