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

Side by Side Diff: third_party/WebKit/Source/core/events/PointerEventFactory.cpp

Issue 1800143002: Notify Blink about start of gesture scroll through a queued event. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a few checks. Created 4 years, 8 months 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/events/PointerEventFactory.h" 5 #include "core/events/PointerEventFactory.h"
6 6
7 namespace blink { 7 namespace blink {
8 8
9 namespace { 9 namespace {
10 10
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 // Mouse id is 1 to behave the same as MS Edge for compatibility reasons. 55 // Mouse id is 1 to behave the same as MS Edge for compatibility reasons.
56 const int PointerEventFactory::s_mouseId = 1; 56 const int PointerEventFactory::s_mouseId = 1;
57 57
58 float getPointerEventPressure(float force, int buttons) 58 float getPointerEventPressure(float force, int buttons)
59 { 59 {
60 if (std::isnan(force)) 60 if (std::isnan(force))
61 return buttons ? 0.5 : 0; 61 return buttons ? 0.5 : 0;
62 return force; 62 return force;
63 } 63 }
64 64
65 void PointerEventFactory::setIdTypeButtons(PointerEventInit &pointerEventInit, 65 void PointerEventFactory::setIdTypeButtons(PointerEventInit& pointerEventInit,
66 const WebPointerProperties &pointerProperties, unsigned buttons) 66 const WebPointerProperties& pointerProperties, unsigned buttons)
67 { 67 {
68 const WebPointerProperties::PointerType pointerType = pointerProperties.poin terType; 68 const WebPointerProperties::PointerType pointerType = pointerProperties.poin terType;
69 const IncomingId incomingId(pointerType, pointerProperties.id); 69 const IncomingId incomingId(pointerType, pointerProperties.id);
70 int pointerId = addIdAndActiveButtons(incomingId, buttons != 0); 70 int pointerId = addIdAndActiveButtons(incomingId, buttons != 0);
71 71
72 pointerEventInit.setButtons(buttons); 72 pointerEventInit.setButtons(buttons);
73 pointerEventInit.setPointerId(pointerId); 73 pointerEventInit.setPointerId(pointerId);
74 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType)); 74 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType));
75 pointerEventInit.setIsPrimary(isPrimary(pointerId)); 75 pointerEventInit.setIsPrimary(isPrimary(pointerId));
76 } 76 }
77 77
78 void PointerEventFactory::setBubblesAndCancelable(PointerEventInit& pointerEvent Init,
79 const AtomicString& type)
80 {
81 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter
82 && type != EventTypeNames::pointerleave);
83 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter
84 && type != EventTypeNames::pointerleave && type != EventTypeNames::point ercancel);
85 }
86
78 PointerEvent* PointerEventFactory::create( 87 PointerEvent* PointerEventFactory::create(
79 const AtomicString& mouseEventName, const PlatformMouseEvent& mouseEvent, 88 const AtomicString& mouseEventName, const PlatformMouseEvent& mouseEvent,
80 EventTarget* relatedTarget, 89 EventTarget* relatedTarget,
81 AbstractView* view) 90 AbstractView* view)
82 { 91 {
83 AtomicString pointerEventName = pointerEventNameForMouseEventName(mouseEvent Name); 92 AtomicString pointerEventName = pointerEventNameForMouseEventName(mouseEvent Name);
84 unsigned buttons = MouseEvent::platformModifiersToButtons(mouseEvent.getModi fiers()); 93 unsigned buttons = MouseEvent::platformModifiersToButtons(mouseEvent.getModi fiers());
85 PointerEventInit pointerEventInit; 94 PointerEventInit pointerEventInit;
86 95
87 setIdTypeButtons(pointerEventInit, mouseEvent.pointerProperties(), buttons); 96 setIdTypeButtons(pointerEventInit, mouseEvent.pointerProperties(), buttons);
97 setBubblesAndCancelable(pointerEventInit, pointerEventName);
88 98
89 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); 99 pointerEventInit.setScreenX(mouseEvent.globalPosition().x());
90 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); 100 pointerEventInit.setScreenY(mouseEvent.globalPosition().y());
91 pointerEventInit.setClientX(mouseEvent.position().x()); 101 pointerEventInit.setClientX(mouseEvent.position().x());
92 pointerEventInit.setClientY(mouseEvent.position().y()); 102 pointerEventInit.setClientY(mouseEvent.position().y());
93 103
94 if (pointerEventName == EventTypeNames::pointerdown 104 if (pointerEventName == EventTypeNames::pointerdown
95 || pointerEventName == EventTypeNames::pointerup) { 105 || pointerEventName == EventTypeNames::pointerup) {
96 pointerEventInit.setButton(mouseEvent.button()); 106 pointerEventInit.setButton(mouseEvent.button());
97 } else { 107 } else {
98 // TODO(crbug.com/587955): We are setting NoButton for transition 108 // TODO(crbug.com/587955): We are setting NoButton for transition
99 // pointerevents should be resolved as part of this bug 109 // pointerevents should be resolved as part of this bug
100 pointerEventInit.setButton(NoButton); 110 pointerEventInit.setButton(NoButton);
101 } 111 }
102 pointerEventInit.setPressure(getPointerEventPressure( 112 pointerEventInit.setPressure(getPointerEventPressure(
103 mouseEvent.pointerProperties().force, pointerEventInit.buttons())); 113 mouseEvent.pointerProperties().force, pointerEventInit.buttons()));
104 114
105 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.g etModifiers()); 115 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.g etModifiers());
106 116
107 // Make sure chorded buttons fire pointermove instead of pointerup/down. 117 // Make sure chorded buttons fire pointermove instead of pointerup/down.
108 if ((pointerEventName == EventTypeNames::pointerdown 118 if ((pointerEventName == EventTypeNames::pointerdown
109 && (buttons & ~MouseEvent::buttonToButtons(mouseEvent.button())) != 0) 119 && (buttons & ~MouseEvent::buttonToButtons(mouseEvent.button())) != 0)
110 || (pointerEventName == EventTypeNames::pointerup && buttons != 0)) 120 || (pointerEventName == EventTypeNames::pointerup && buttons != 0))
111 pointerEventName = EventTypeNames::pointermove; 121 pointerEventName = EventTypeNames::pointermove;
112 122
113 pointerEventInit.setBubbles(
114 pointerEventName != EventTypeNames::pointerenter
115 && pointerEventName != EventTypeNames::pointerleave);
116 pointerEventInit.setCancelable(
117 pointerEventName != EventTypeNames::pointerenter
118 && pointerEventName != EventTypeNames::pointerleave
119 && pointerEventName != EventTypeNames::pointercancel);
120 123
121 pointerEventInit.setView(view); 124 pointerEventInit.setView(view);
122 if (relatedTarget) 125 if (relatedTarget)
123 pointerEventInit.setRelatedTarget(relatedTarget); 126 pointerEventInit.setRelatedTarget(relatedTarget);
124 127
125 return PointerEvent::create(pointerEventName, pointerEventInit); 128 return PointerEvent::create(pointerEventName, pointerEventInit);
126 } 129 }
127 130
128 PointerEvent* PointerEventFactory::create(const AtomicString& type, 131 PointerEvent* PointerEventFactory::create(const AtomicString& type,
129 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, 132 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
(...skipping 29 matching lines...) Expand all
159 touchPoint.force(), pointerEventInit.buttons())); 162 touchPoint.force(), pointerEventInit.buttons()));
160 163
161 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); 164 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers);
162 165
163 pointerEventInit.setBubbles(!isEnterOrLeave); 166 pointerEventInit.setBubbles(!isEnterOrLeave);
164 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc hPoint::TouchCancelled); 167 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc hPoint::TouchCancelled);
165 168
166 return PointerEvent::create(type, pointerEventInit); 169 return PointerEvent::create(type, pointerEventInit);
167 } 170 }
168 171
169 172 PointerEvent* PointerEventFactory::createPointerCancelEvent(
170 PointerEvent* PointerEventFactory::createPointerCancelEvent(const PlatformTouchP oint& touchPoint) 173 const int pointerId, const WebPointerProperties::PointerType pointerType)
171 { 174 {
172 PointerEventInit pointerEventInit; 175 PointerEventInit pointerEventInit;
173 176
174 setIdTypeButtons(pointerEventInit, touchPoint.pointerProperties(), 0); 177 pointerEventInit.setPointerId(pointerId);
bokan 2016/04/12 22:42:45 setIdTypeButtons used to add a bunch of data into
mustaq 2016/04/13 14:56:27 You are right that we don't need those mappings: t
bokan 2016/04/13 22:59:48 Acknowledged.
175 178 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType));
179 pointerEventInit.setIsPrimary(isPrimary(pointerId));
176 pointerEventInit.setBubbles(true); 180 pointerEventInit.setBubbles(true);
177 pointerEventInit.setCancelable(false); 181 pointerEventInit.setCancelable(false);
178 182
179 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ; 183 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ;
180 } 184 }
181 185
182 PointerEvent* PointerEventFactory::createPointerCaptureEvent( 186 PointerEvent* PointerEventFactory::createPointerCaptureEvent(
183 PointerEvent* pointerEvent, 187 PointerEvent* pointerEvent,
184 const AtomicString& type) 188 const AtomicString& type)
185 { 189 {
(...skipping 30 matching lines...) Expand all
216 pointerEventInit.setTiltX(pointerEvent->tiltX()); 220 pointerEventInit.setTiltX(pointerEvent->tiltX());
217 pointerEventInit.setTiltY(pointerEvent->tiltY()); 221 pointerEventInit.setTiltY(pointerEvent->tiltY());
218 pointerEventInit.setScreenX(pointerEvent->screenX()); 222 pointerEventInit.setScreenX(pointerEvent->screenX());
219 pointerEventInit.setScreenY(pointerEvent->screenY()); 223 pointerEventInit.setScreenY(pointerEvent->screenY());
220 pointerEventInit.setClientX(pointerEvent->clientX()); 224 pointerEventInit.setClientX(pointerEvent->clientX());
221 pointerEventInit.setClientY(pointerEvent->clientY()); 225 pointerEventInit.setClientY(pointerEvent->clientY());
222 pointerEventInit.setButton(pointerEvent->button()); 226 pointerEventInit.setButton(pointerEvent->button());
223 pointerEventInit.setButtons(pointerEvent->buttons()); 227 pointerEventInit.setButtons(pointerEvent->buttons());
224 pointerEventInit.setPressure(pointerEvent->pressure()); 228 pointerEventInit.setPressure(pointerEvent->pressure());
225 229
226 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter 230 setBubblesAndCancelable(pointerEventInit, type);
227 && type != EventTypeNames::pointerleave); 231
228 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter
229 && type != EventTypeNames::pointerleave
230 && type != EventTypeNames::pointercancel);
231 if (relatedTarget) 232 if (relatedTarget)
232 pointerEventInit.setRelatedTarget(relatedTarget); 233 pointerEventInit.setRelatedTarget(relatedTarget);
233 234
234 return PointerEvent::create(type, pointerEventInit); 235 return PointerEvent::create(type, pointerEventInit);
235 } 236 }
236 237
237 PointerEventFactory::PointerEventFactory() 238 PointerEventFactory::PointerEventFactory()
238 { 239 {
239 clear(); 240 clear();
240 } 241 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 // We do not handle the overflow of m_currentId as it should be very rare 283 // We do not handle the overflow of m_currentId as it should be very rare
283 int mappedId = m_currentId++; 284 int mappedId = m_currentId++;
284 if (!m_idCount[type]) 285 if (!m_idCount[type])
285 m_primaryId[type] = mappedId; 286 m_primaryId[type] = mappedId;
286 m_idCount[type]++; 287 m_idCount[type]++;
287 m_pointerIncomingIdMapping.add(p, mappedId); 288 m_pointerIncomingIdMapping.add(p, mappedId);
288 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons)); 289 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons));
289 return mappedId; 290 return mappedId;
290 } 291 }
291 292
292 bool PointerEventFactory::remove( 293 bool PointerEventFactory::remove(const int mappedId)
293 const PointerEvent* pointerEvent)
294 { 294 {
295 int mappedId = pointerEvent->pointerId();
296 // Do not remove mouse pointer id as it should always be there 295 // Do not remove mouse pointer id as it should always be there
297 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId)) 296 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId))
298 return false; 297 return false;
299 298
300 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; 299 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId;
301 int type = p.pointerType(); 300 int type = p.pointerType();
302 m_pointerIdMapping.remove(mappedId); 301 m_pointerIdMapping.remove(mappedId);
303 m_pointerIncomingIdMapping.remove(p); 302 m_pointerIncomingIdMapping.remove(p);
304 if (m_primaryId[type] == mappedId) 303 if (m_primaryId[type] == mappedId)
305 m_primaryId[type] = PointerEventFactory::s_invalidId; 304 m_primaryId[type] = PointerEventFactory::s_invalidId;
306 m_idCount[type]--; 305 m_idCount[type]--;
307 return true; 306 return true;
308 } 307 }
309 308
309 HeapVector<int> PointerEventFactory::getPointerIdsOfType(WebPointerProperties::P ointerType pointerType)
310 {
311 HeapVector<int> mappedIds;
312
313 for (auto iter = m_pointerIdMapping.begin(); iter != m_pointerIdMapping.end( ); ++iter) {
314 int mappedId = iter->key;
315 if (iter->value.incomingId.pointerType() == static_cast<int>(pointerType ))
316 mappedIds.append(mappedId);
317 }
318
319 // Sorting for a predictable ordering.
320 std::sort(mappedIds.begin(), mappedIds.end());
321 return mappedIds;
322 }
323
310 bool PointerEventFactory::isPrimary(int mappedId) const 324 bool PointerEventFactory::isPrimary(int mappedId) const
311 { 325 {
312 if (!m_pointerIdMapping.contains(mappedId)) 326 if (!m_pointerIdMapping.contains(mappedId))
313 return false; 327 return false;
314 328
315 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; 329 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId;
316 return m_primaryId[p.pointerType()] == mappedId; 330 return m_primaryId[p.pointerType()] == mappedId;
317 } 331 }
318 332
319 WebPointerProperties::PointerType PointerEventFactory::getPointerType( 333 WebPointerProperties::PointerType PointerEventFactory::getPointerType(
(...skipping 11 matching lines...) Expand all
331 return m_pointerIdMapping.contains(pointerId); 345 return m_pointerIdMapping.contains(pointerId);
332 } 346 }
333 347
334 bool PointerEventFactory::isActiveButtonsState(const int pointerId) 348 bool PointerEventFactory::isActiveButtonsState(const int pointerId)
335 { 349 {
336 return m_pointerIdMapping.contains(pointerId) 350 return m_pointerIdMapping.contains(pointerId)
337 && m_pointerIdMapping.get(pointerId).isActiveButtons; 351 && m_pointerIdMapping.get(pointerId).isActiveButtons;
338 } 352 }
339 353
340 } // namespace blink 354 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698