| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |