Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: third_party/WebKit/Source/core/input/TouchEventManager.cpp

Issue 2475443004: Add use counter when touch-action isn't used when preventDefault'd. (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 TouchEventManager::TouchEventManager(LocalFrame* frame) : m_frame(frame) { 87 TouchEventManager::TouchEventManager(LocalFrame* frame) : m_frame(frame) {
88 clear(); 88 clear();
89 } 89 }
90 90
91 void TouchEventManager::clear() { 91 void TouchEventManager::clear() {
92 m_touchSequenceDocument.clear(); 92 m_touchSequenceDocument.clear();
93 m_targetForTouchID.clear(); 93 m_targetForTouchID.clear();
94 m_regionForTouchID.clear(); 94 m_regionForTouchID.clear();
95 m_touchPressed = false; 95 m_touchPressed = false;
96 m_currentEvent = PlatformEvent::NoType; 96 m_currentEvent = PlatformEvent::NoType;
97 m_currentTouchAction = TouchActionAuto;
97 } 98 }
98 99
99 DEFINE_TRACE(TouchEventManager) { 100 DEFINE_TRACE(TouchEventManager) {
100 visitor->trace(m_frame); 101 visitor->trace(m_frame);
101 visitor->trace(m_touchSequenceDocument); 102 visitor->trace(m_touchSequenceDocument);
102 visitor->trace(m_targetForTouchID); 103 visitor->trace(m_targetForTouchID);
103 } 104 }
104 105
105 WebInputEventResult TouchEventManager::dispatchTouchEvents( 106 WebInputEventResult TouchEventManager::dispatchTouchEvents(
106 const PlatformTouchEvent& event, 107 const PlatformTouchEvent& event,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 ASSERT(pointState < PlatformTouchPoint::TouchStateEnd); 161 ASSERT(pointState < PlatformTouchPoint::TouchStateEnd);
161 if (!changedTouches[pointState].m_touches) 162 if (!changedTouches[pointState].m_touches)
162 changedTouches[pointState].m_touches = TouchList::create(); 163 changedTouches[pointState].m_touches = TouchList::create();
163 changedTouches[pointState].m_touches->append(touch); 164 changedTouches[pointState].m_touches->append(touch);
164 changedTouches[pointState].m_targets.add(touchInfo.touchNode); 165 changedTouches[pointState].m_targets.add(touchInfo.touchNode);
165 } 166 }
166 } 167 }
167 168
168 if (allTouchesReleased) { 169 if (allTouchesReleased) {
169 m_touchSequenceDocument.clear(); 170 m_touchSequenceDocument.clear();
171 m_currentTouchAction = TouchActionAuto;
170 } 172 }
171 173
172 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 174 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
173 175
174 // Now iterate through the |changedTouches| list and |m_targets| within it, 176 // Now iterate through the |changedTouches| list and |m_targets| within it,
175 // sending TouchEvents to the targets as required. 177 // sending TouchEvents to the targets as required.
176 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; 178 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd;
177 ++state) { 179 ++state) {
178 if (!changedTouches[state].m_touches) 180 if (!changedTouches[state].m_touches)
179 continue; 181 continue;
180 182
181 const AtomicString& eventName(touchEventNameForTouchPointState( 183 const AtomicString& eventName(touchEventNameForTouchPointState(
182 static_cast<PlatformTouchPoint::TouchState>(state))); 184 static_cast<PlatformTouchPoint::TouchState>(state)));
183 for (const auto& eventTarget : changedTouches[state].m_targets) { 185 for (const auto& eventTarget : changedTouches[state].m_targets) {
184 EventTarget* touchEventTarget = eventTarget; 186 EventTarget* touchEventTarget = eventTarget;
185 TouchEvent* touchEvent = TouchEvent::create( 187 TouchEvent* touchEvent =
186 touches, touchesByTarget.get(touchEventTarget), 188 TouchEvent::create(touches, touchesByTarget.get(touchEventTarget),
187 changedTouches[state].m_touches.get(), eventName, 189 changedTouches[state].m_touches.get(), eventName,
188 touchEventTarget->toNode()->document().domWindow(), 190 touchEventTarget->toNode()->document().domWindow(),
189 event.getModifiers(), event.cancelable(), 191 event.getModifiers(), event.cancelable(),
190 event.causesScrollingIfUncanceled(), 192 event.causesScrollingIfUncanceled(),
191 event.touchStartOrFirstTouchMove(), event.timestamp()); 193 event.touchStartOrFirstTouchMove(),
194 event.timestamp(), m_currentTouchAction);
192 195
193 DispatchEventResult domDispatchResult = 196 DispatchEventResult domDispatchResult =
194 touchEventTarget->dispatchEvent(touchEvent); 197 touchEventTarget->dispatchEvent(touchEvent);
195 198
196 // Only report for top level documents with a single touch on 199 // Only report for top level documents with a single touch on
197 // touch-start or the first touch-move. 200 // touch-start or the first touch-move.
198 if (event.touchStartOrFirstTouchMove() && touchInfos.size() == 1 && 201 if (event.touchStartOrFirstTouchMove() && touchInfos.size() == 1 &&
199 m_frame->isMainFrame()) { 202 m_frame->isMainFrame()) {
200 // Record the disposition and latency of touch starts and first touch 203 // Record the disposition and latency of touch starts and first touch
201 // moves before and after the page is fully loaded respectively. 204 // moves before and after the page is fully loaded respectively.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 // down. However EventSender allows this to be violated and there's 329 // down. However EventSender allows this to be violated and there's
327 // some tests that take advantage of it. There may also be edge 330 // some tests that take advantage of it. There may also be edge
328 // cases in the browser where this happens. 331 // cases in the browser where this happens.
329 // See http://crbug.com/345372. 332 // See http://crbug.com/345372.
330 m_targetForTouchID.set(touchInfo.point.id(), touchInfo.touchNode); 333 m_targetForTouchID.set(touchInfo.point.id(), touchInfo.touchNode);
331 334
332 m_regionForTouchID.set(touchInfo.point.id(), touchInfo.region); 335 m_regionForTouchID.set(touchInfo.point.id(), touchInfo.region);
333 336
334 TouchAction effectiveTouchAction = 337 TouchAction effectiveTouchAction =
335 TouchActionUtil::computeEffectiveTouchAction(*touchInfo.touchNode); 338 TouchActionUtil::computeEffectiveTouchAction(*touchInfo.touchNode);
336 if (effectiveTouchAction != TouchActionAuto) 339 if (effectiveTouchAction != TouchActionAuto) {
337 m_frame->page()->chromeClient().setTouchAction(effectiveTouchAction); 340 m_frame->page()->chromeClient().setTouchAction(effectiveTouchAction);
341
342 // Combine the current touch action sequence with the touch action
343 // for the current finger press.
344 m_currentTouchAction &= effectiveTouchAction;
345 }
338 } 346 }
339 } 347 }
340 } 348 }
341 349
342 void TouchEventManager::setAllPropertiesOfTouchInfos( 350 void TouchEventManager::setAllPropertiesOfTouchInfos(
343 HeapVector<TouchInfo>& touchInfos) { 351 HeapVector<TouchInfo>& touchInfos) {
344 for (auto& touchInfo : touchInfos) { 352 for (auto& touchInfo : touchInfos) {
345 PlatformTouchPoint::TouchState pointState = touchInfo.point.state(); 353 PlatformTouchPoint::TouchState pointState = touchInfo.point.state();
346 Node* touchNode = nullptr; 354 Node* touchNode = nullptr;
347 String regionID; 355 String regionID;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 } 499 }
492 500
493 return dispatchTouchEvents(event, touchInfos, allTouchesReleased); 501 return dispatchTouchEvents(event, touchInfos, allTouchesReleased);
494 } 502 }
495 503
496 bool TouchEventManager::isAnyTouchActive() const { 504 bool TouchEventManager::isAnyTouchActive() const {
497 return m_touchPressed; 505 return m_touchPressed;
498 } 506 }
499 507
500 } // namespace blink 508 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698