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

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: Rebased 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
172 PointerEvent* PointerEventFactory::createPointerCancelEvent(
173 const int pointerId, const WebPointerProperties::PointerType pointerType)
174 {
175 ASSERT(m_pointerIdMapping.contains(pointerId));
176 m_pointerIdMapping.set(pointerId, PointerAttributes(m_pointerIdMapping.get(p ointerId).incomingId, false));
169 177
170 PointerEvent* PointerEventFactory::createPointerCancelEvent(const PlatformTouchP oint& touchPoint)
171 {
172 PointerEventInit pointerEventInit; 178 PointerEventInit pointerEventInit;
173 179
174 setIdTypeButtons(pointerEventInit, touchPoint.pointerProperties(), 0); 180 pointerEventInit.setPointerId(pointerId);
175 181 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType));
182 pointerEventInit.setIsPrimary(isPrimary(pointerId));
176 pointerEventInit.setBubbles(true); 183 pointerEventInit.setBubbles(true);
177 pointerEventInit.setCancelable(false); 184 pointerEventInit.setCancelable(false);
178 185
179 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ; 186 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ;
180 } 187 }
181 188
182 PointerEvent* PointerEventFactory::createPointerCaptureEvent( 189 PointerEvent* PointerEventFactory::createPointerCaptureEvent(
183 PointerEvent* pointerEvent, 190 PointerEvent* pointerEvent,
184 const AtomicString& type) 191 const AtomicString& type)
185 { 192 {
(...skipping 30 matching lines...) Expand all
216 pointerEventInit.setTiltX(pointerEvent->tiltX()); 223 pointerEventInit.setTiltX(pointerEvent->tiltX());
217 pointerEventInit.setTiltY(pointerEvent->tiltY()); 224 pointerEventInit.setTiltY(pointerEvent->tiltY());
218 pointerEventInit.setScreenX(pointerEvent->screenX()); 225 pointerEventInit.setScreenX(pointerEvent->screenX());
219 pointerEventInit.setScreenY(pointerEvent->screenY()); 226 pointerEventInit.setScreenY(pointerEvent->screenY());
220 pointerEventInit.setClientX(pointerEvent->clientX()); 227 pointerEventInit.setClientX(pointerEvent->clientX());
221 pointerEventInit.setClientY(pointerEvent->clientY()); 228 pointerEventInit.setClientY(pointerEvent->clientY());
222 pointerEventInit.setButton(pointerEvent->button()); 229 pointerEventInit.setButton(pointerEvent->button());
223 pointerEventInit.setButtons(pointerEvent->buttons()); 230 pointerEventInit.setButtons(pointerEvent->buttons());
224 pointerEventInit.setPressure(pointerEvent->pressure()); 231 pointerEventInit.setPressure(pointerEvent->pressure());
225 232
226 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter 233 setBubblesAndCancelable(pointerEventInit, type);
227 && type != EventTypeNames::pointerleave); 234
228 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter
229 && type != EventTypeNames::pointerleave
230 && type != EventTypeNames::pointercancel);
231 if (relatedTarget) 235 if (relatedTarget)
232 pointerEventInit.setRelatedTarget(relatedTarget); 236 pointerEventInit.setRelatedTarget(relatedTarget);
233 237
234 return PointerEvent::create(type, pointerEventInit); 238 return PointerEvent::create(type, pointerEventInit);
235 } 239 }
236 240
237 PointerEventFactory::PointerEventFactory() 241 PointerEventFactory::PointerEventFactory()
238 { 242 {
239 clear(); 243 clear();
240 } 244 }
(...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 286 // We do not handle the overflow of m_currentId as it should be very rare
283 int mappedId = m_currentId++; 287 int mappedId = m_currentId++;
284 if (!m_idCount[type]) 288 if (!m_idCount[type])
285 m_primaryId[type] = mappedId; 289 m_primaryId[type] = mappedId;
286 m_idCount[type]++; 290 m_idCount[type]++;
287 m_pointerIncomingIdMapping.add(p, mappedId); 291 m_pointerIncomingIdMapping.add(p, mappedId);
288 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons)); 292 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons));
289 return mappedId; 293 return mappedId;
290 } 294 }
291 295
292 bool PointerEventFactory::remove( 296 bool PointerEventFactory::remove(const int mappedId)
293 const PointerEvent* pointerEvent)
294 { 297 {
295 int mappedId = pointerEvent->pointerId();
296 // Do not remove mouse pointer id as it should always be there 298 // Do not remove mouse pointer id as it should always be there
297 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId)) 299 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId))
298 return false; 300 return false;
299 301
300 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; 302 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId;
301 int type = p.pointerType(); 303 int type = p.pointerType();
302 m_pointerIdMapping.remove(mappedId); 304 m_pointerIdMapping.remove(mappedId);
303 m_pointerIncomingIdMapping.remove(p); 305 m_pointerIncomingIdMapping.remove(p);
304 if (m_primaryId[type] == mappedId) 306 if (m_primaryId[type] == mappedId)
305 m_primaryId[type] = PointerEventFactory::s_invalidId; 307 m_primaryId[type] = PointerEventFactory::s_invalidId;
306 m_idCount[type]--; 308 m_idCount[type]--;
307 return true; 309 return true;
308 } 310 }
309 311
312 HeapVector<int> PointerEventFactory::getPointerIdsOfType(WebPointerProperties::P ointerType pointerType)
313 {
314 HeapVector<int> mappedIds;
315
316 for (auto iter = m_pointerIdMapping.begin(); iter != m_pointerIdMapping.end( ); ++iter) {
317 int mappedId = iter->key;
318 if (iter->value.incomingId.pointerType() == static_cast<int>(pointerType ))
319 mappedIds.append(mappedId);
320 }
321
322 // Sorting for a predictable ordering.
323 std::sort(mappedIds.begin(), mappedIds.end());
324 return mappedIds;
325 }
326
310 bool PointerEventFactory::isPrimary(int mappedId) const 327 bool PointerEventFactory::isPrimary(int mappedId) const
311 { 328 {
312 if (!m_pointerIdMapping.contains(mappedId)) 329 if (!m_pointerIdMapping.contains(mappedId))
313 return false; 330 return false;
314 331
315 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; 332 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId;
316 return m_primaryId[p.pointerType()] == mappedId; 333 return m_primaryId[p.pointerType()] == mappedId;
317 } 334 }
318 335
319 WebPointerProperties::PointerType PointerEventFactory::getPointerType( 336 WebPointerProperties::PointerType PointerEventFactory::getPointerType(
(...skipping 11 matching lines...) Expand all
331 return m_pointerIdMapping.contains(pointerId); 348 return m_pointerIdMapping.contains(pointerId);
332 } 349 }
333 350
334 bool PointerEventFactory::isActiveButtonsState(const int pointerId) 351 bool PointerEventFactory::isActiveButtonsState(const int pointerId)
335 { 352 {
336 return m_pointerIdMapping.contains(pointerId) 353 return m_pointerIdMapping.contains(pointerId)
337 && m_pointerIdMapping.get(pointerId).isActiveButtons; 354 && m_pointerIdMapping.get(pointerId).isActiveButtons;
338 } 355 }
339 356
340 } // namespace blink 357 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698