| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/PointerEventManager.h" | 5 #include "core/events/PointerEventManager.h" |
| 6 | 6 |
| 7 namespace blink { | 7 namespace blink { |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 return "pen"; | 21 return "pen"; |
| 22 case WebPointerProperties::PointerType::Mouse: | 22 case WebPointerProperties::PointerType::Mouse: |
| 23 return "mouse"; | 23 return "mouse"; |
| 24 } | 24 } |
| 25 ASSERT_NOT_REACHED(); | 25 ASSERT_NOT_REACHED(); |
| 26 return ""; | 26 return ""; |
| 27 } | 27 } |
| 28 | 28 |
| 29 } // namespace | 29 } // namespace |
| 30 | 30 |
| 31 const PointerEventManager::MappedId PointerEventManager::s_invalidId = 0; | 31 const int PointerEventManager::s_invalidId = 0; |
| 32 | 32 |
| 33 // Mouse id is 1 to behave the same as MS Edge for compatibility reasons. | 33 // Mouse id is 1 to behave the same as MS Edge for compatibility reasons. |
| 34 const PointerEventManager::MappedId PointerEventManager::s_mouseId = 1; | 34 const int PointerEventManager::s_mouseId = 1; |
| 35 | 35 |
| 36 EventTarget* PointerEventManager::getCapturingNode(PassRefPtrWillBeRawPtr<Pointe
rEvent> pointerEvent) | 36 EventTarget* PointerEventManager::getCapturingNode(PassRefPtrWillBeRawPtr<Pointe
rEvent> pointerEvent) |
| 37 { | 37 { |
| 38 // TODO(nzolghadr): Add APIs to set the capturing nodes and return the corre
ct node here | 38 if (m_pointerCaptureTarget.contains(pointerEvent->pointerId())) |
| 39 return m_pointerCaptureTarget.get(pointerEvent->pointerId()); |
| 39 return nullptr; | 40 return nullptr; |
| 40 } | 41 } |
| 41 | 42 |
| 43 void PointerEventManager::removeTargetFromPointerCapturingMapping(PointerCapturi
ngMap& map, EventTarget* target) |
| 44 { |
| 45 // We could have kept a reverse mapping to make this deletion possibly |
| 46 // faster but it adds some code complication which might not be worth of |
| 47 // the performance improvement considering there might not be a lot of |
| 48 // active pointer or pointer captures at the same time. |
| 49 PointerCapturingMap tmp = m_pointerCaptureTarget; |
| 50 for (PointerCapturingMap::iterator it = tmp.begin(); it != tmp.end(); ++it)
{ |
| 51 if (it->value == target) |
| 52 map.remove(it->key); |
| 53 } |
| 54 } |
| 55 |
| 56 EventTarget* PointerEventManager::getMouseCapturingNode() |
| 57 { |
| 58 if (m_pointerCaptureTarget.contains(s_mouseId)) |
| 59 return m_pointerCaptureTarget.get(s_mouseId); |
| 60 return nullptr; |
| 61 } |
| 62 |
| 63 void PointerEventManager::elementRemoved(EventTarget* target) |
| 64 { |
| 65 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target); |
| 66 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe
t); |
| 67 // TODO(nzolghadr): Process sending lostpointercapture to the document |
| 68 } |
| 69 |
| 70 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) |
| 71 { |
| 72 if (isActiveButtons(pointerId)) |
| 73 m_pendingPointerCaptureTarget.set(pointerId, target); |
| 74 } |
| 75 |
| 76 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ
et) |
| 77 { |
| 78 if (m_pointerCaptureTarget.contains(pointerId) && m_pointerCaptureTarget.ge
t(pointerId) == target) |
| 79 implicitReleasePointerCapture(pointerId); |
| 80 } |
| 81 |
| 82 void PointerEventManager::implicitReleasePointerCapture(int pointerId) |
| 83 { |
| 84 if (m_pendingPointerCaptureTarget.contains(pointerId)) |
| 85 m_pendingPointerCaptureTarget.remove(pointerId); |
| 86 } |
| 42 void PointerEventManager::setIdAndType(PointerEventInit &pointerEventInit, | 87 void PointerEventManager::setIdAndType(PointerEventInit &pointerEventInit, |
| 43 const WebPointerProperties &pointerProperties) | 88 const WebPointerProperties &pointerProperties, int buttons) |
| 44 { | 89 { |
| 45 const WebPointerProperties::PointerType pointerType = pointerProperties.poin
terType; | 90 const WebPointerProperties::PointerType pointerType = pointerProperties.poin
terType; |
| 46 MappedId pointerId = add(PointerEventManager::IncomingId(toInt(pointerType),
pointerProperties.id)); | 91 int pointerId = addAndUpdateButtons(PointerEventManager::IncomingId(toInt(po
interType), pointerProperties.id), buttons); |
| 47 pointerEventInit.setPointerId(pointerId); | 92 pointerEventInit.setPointerId(pointerId); |
| 48 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe
rType)); | 93 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe
rType)); |
| 49 pointerEventInit.setIsPrimary(isPrimary(pointerId)); | 94 pointerEventInit.setIsPrimary(isPrimary(pointerId)); |
| 95 processPendingPointerCapture(pointerId); |
| 96 } |
| 97 |
| 98 void PointerEventManager::processPendingPointerCapture(int pointerId) |
| 99 { |
| 100 // TODO(nzolghadr): Process sending got/lostpointercapture |
| 101 |
| 102 if (!m_pendingPointerCaptureTarget.contains(pointerId)) |
| 103 m_pointerCaptureTarget.remove(pointerId); |
| 104 else |
| 105 m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get(
pointerId)); |
| 50 } | 106 } |
| 51 | 107 |
| 52 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
ing& type, | 108 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
ing& type, |
| 53 const PlatformMouseEvent& mouseEvent, | 109 const PlatformMouseEvent& mouseEvent, |
| 54 PassRefPtrWillBeRawPtr<Node> relatedTarget, | 110 PassRefPtrWillBeRawPtr<Node> relatedTarget, |
| 55 PassRefPtrWillBeRawPtr<AbstractView> view) | 111 PassRefPtrWillBeRawPtr<AbstractView> view) |
| 56 { | 112 { |
| 57 PointerEventInit pointerEventInit; | 113 PointerEventInit pointerEventInit; |
| 114 int buttons = MouseEvent::platformModifiersToButtons(mouseEvent.modifiers())
; |
| 58 | 115 |
| 59 setIdAndType(pointerEventInit, mouseEvent.pointerProperties()); | 116 setIdAndType(pointerEventInit, mouseEvent.pointerProperties(), buttons); |
| 60 | 117 |
| 61 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); | 118 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); |
| 62 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); | 119 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); |
| 63 pointerEventInit.setClientX(mouseEvent.position().x()); | 120 pointerEventInit.setClientX(mouseEvent.position().x()); |
| 64 pointerEventInit.setClientY(mouseEvent.position().y()); | 121 pointerEventInit.setClientY(mouseEvent.position().y()); |
| 65 | 122 |
| 66 pointerEventInit.setButton(mouseEvent.button()); | 123 pointerEventInit.setButton(mouseEvent.button()); |
| 67 pointerEventInit.setButtons(MouseEvent::platformModifiersToButtons(mouseEven
t.modifiers())); | 124 pointerEventInit.setButtons(buttons); |
| 68 | 125 |
| 69 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.m
odifiers()); | 126 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.m
odifiers()); |
| 70 | 127 |
| 71 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter | 128 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter |
| 72 && type != EventTypeNames::pointerleave); | 129 && type != EventTypeNames::pointerleave); |
| 73 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter | 130 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter |
| 74 && type != EventTypeNames::pointerleave && type != EventTypeNames::point
ercancel); | 131 && type != EventTypeNames::pointerleave && type != EventTypeNames::point
ercancel); |
| 75 | 132 |
| 76 pointerEventInit.setView(view); | 133 pointerEventInit.setView(view); |
| 77 if (relatedTarget) | 134 if (relatedTarget && !m_pointerCaptureTarget.contains(pointerEventInit.point
erId())) |
| 78 pointerEventInit.setRelatedTarget(relatedTarget); | 135 pointerEventInit.setRelatedTarget(relatedTarget); |
| 79 | 136 |
| 80 return PointerEvent::create(type, pointerEventInit); | 137 return PointerEvent::create(type, pointerEventInit); |
| 81 } | 138 } |
| 82 | 139 |
| 83 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
ing& type, | 140 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
ing& type, |
| 84 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, | 141 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, |
| 85 const double width, const double height, | 142 const double width, const double height, |
| 86 const double clientX, const double clientY) | 143 const double clientX, const double clientY) |
| 87 { | 144 { |
| 88 const PlatformTouchPoint::State pointState = touchPoint.state(); | 145 const PlatformTouchPoint::State pointState = touchPoint.state(); |
| 89 | 146 |
| 90 bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchRel
eased | 147 bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchRel
eased |
| 91 || pointState == PlatformTouchPoint::TouchCancelled; | 148 || pointState == PlatformTouchPoint::TouchCancelled; |
| 92 | 149 |
| 93 bool isEnterOrLeave = false; | 150 bool isEnterOrLeave = false; |
| 94 | 151 |
| 95 PointerEventInit pointerEventInit; | 152 PointerEventInit pointerEventInit; |
| 153 int buttons = pointerReleasedOrCancelled ? 0 : 1; |
| 96 | 154 |
| 97 setIdAndType(pointerEventInit, touchPoint.pointerProperties()); | 155 setIdAndType(pointerEventInit, touchPoint.pointerProperties(), buttons); |
| 98 | 156 |
| 99 pointerEventInit.setWidth(width); | 157 pointerEventInit.setWidth(width); |
| 100 pointerEventInit.setHeight(height); | 158 pointerEventInit.setHeight(height); |
| 101 pointerEventInit.setPressure(touchPoint.force()); | 159 pointerEventInit.setPressure(touchPoint.force()); |
| 102 pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX); | 160 pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX); |
| 103 pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY); | 161 pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY); |
| 104 pointerEventInit.setScreenX(touchPoint.screenPos().x()); | 162 pointerEventInit.setScreenX(touchPoint.screenPos().x()); |
| 105 pointerEventInit.setScreenY(touchPoint.screenPos().y()); | 163 pointerEventInit.setScreenY(touchPoint.screenPos().y()); |
| 106 pointerEventInit.setClientX(clientX); | 164 pointerEventInit.setClientX(clientX); |
| 107 pointerEventInit.setClientY(clientY); | 165 pointerEventInit.setClientY(clientY); |
| 108 pointerEventInit.setButton(0); | 166 pointerEventInit.setButton(0); |
| 109 pointerEventInit.setButtons(pointerReleasedOrCancelled ? 0 : 1); | 167 pointerEventInit.setButtons(buttons); |
| 110 | 168 |
| 111 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); | 169 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); |
| 112 | 170 |
| 113 pointerEventInit.setBubbles(!isEnterOrLeave); | 171 pointerEventInit.setBubbles(!isEnterOrLeave); |
| 114 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc
hPoint::TouchCancelled); | 172 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc
hPoint::TouchCancelled); |
| 115 | 173 |
| 116 return PointerEvent::create(type, pointerEventInit); | 174 return PointerEvent::create(type, pointerEventInit); |
| 117 } | 175 } |
| 118 | 176 |
| 119 | 177 |
| 120 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::createPointerCancel(co
nst PlatformTouchPoint& touchPoint) | 178 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::createPointerCancel(co
nst PlatformTouchPoint& touchPoint) |
| 121 { | 179 { |
| 122 PointerEventInit pointerEventInit; | 180 PointerEventInit pointerEventInit; |
| 123 | 181 |
| 124 setIdAndType(pointerEventInit, touchPoint.pointerProperties()); | 182 setIdAndType(pointerEventInit, touchPoint.pointerProperties(), 0); |
| 125 | 183 |
| 126 pointerEventInit.setBubbles(true); | 184 pointerEventInit.setBubbles(true); |
| 127 pointerEventInit.setCancelable(false); | 185 pointerEventInit.setCancelable(false); |
| 128 | 186 |
| 129 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit)
; | 187 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit)
; |
| 130 } | 188 } |
| 131 | 189 |
| 132 PointerEventManager::PointerEventManager() | 190 PointerEventManager::PointerEventManager() |
| 133 { | 191 { |
| 134 clear(); | 192 clear(); |
| 135 } | 193 } |
| 136 | 194 |
| 137 PointerEventManager::~PointerEventManager() | 195 PointerEventManager::~PointerEventManager() |
| 138 { | 196 { |
| 139 clear(); | 197 clear(); |
| 140 } | 198 } |
| 141 | 199 |
| 142 void PointerEventManager::clear() | 200 void PointerEventManager::clear() |
| 143 { | 201 { |
| 144 for (int type = 0; type <= toInt(WebPointerProperties::PointerType::LastEntr
y); type++) { | 202 for (int type = 0; type <= toInt(WebPointerProperties::PointerType::LastEntr
y); type++) { |
| 145 m_primaryId[type] = PointerEventManager::s_invalidId; | 203 m_primaryId[type] = PointerEventManager::s_invalidId; |
| 146 m_idCount[type] = 0; | 204 m_idCount[type] = 0; |
| 147 } | 205 } |
| 206 m_pointerCaptureTarget.clear(); |
| 207 m_pendingPointerCaptureTarget.clear(); |
| 148 m_idMapping.clear(); | 208 m_idMapping.clear(); |
| 149 m_idReverseMapping.clear(); | 209 m_idReverseMapping.clear(); |
| 210 m_lastButtons.clear(); |
| 150 | 211 |
| 151 // Always add mouse pointer in initialization and never remove it. | 212 // Always add mouse pointer in initialization and never remove it. |
| 152 // No need to add it to m_idMapping as it is not going to be used with the e
xisting APIs | 213 // No need to add it to m_idMapping as it is not going to be used with the e
xisting APIs |
| 153 m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId; | 214 m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId; |
| 154 m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::Poi
nterType::Mouse), 0)); | 215 m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::Poi
nterType::Mouse), 0)); |
| 216 m_lastButtons.add(s_mouseId, 0); |
| 155 | 217 |
| 156 m_currentId = PointerEventManager::s_mouseId+1; | 218 m_currentId = PointerEventManager::s_mouseId+1; |
| 157 } | 219 } |
| 158 | 220 |
| 159 PointerEventManager::MappedId PointerEventManager::add(const IncomingId p) | 221 int PointerEventManager::addAndUpdateButtons(const IncomingId p, const int butto
ns) |
| 222 { |
| 223 int mappedId = add(p); |
| 224 m_lastButtons.set(mappedId, buttons); |
| 225 return mappedId; |
| 226 } |
| 227 |
| 228 int PointerEventManager::add(const IncomingId p) |
| 160 { | 229 { |
| 161 // Do not add extra mouse pointer as it was added in initialization | 230 // Do not add extra mouse pointer as it was added in initialization |
| 162 if (p.first == toInt(WebPointerProperties::PointerType::Mouse)) | 231 if (p.first == toInt(WebPointerProperties::PointerType::Mouse)) |
| 163 return s_mouseId; | 232 return s_mouseId; |
| 164 | 233 |
| 165 int type = p.first; | 234 int type = p.first; |
| 166 if (m_idMapping.contains(p)) | 235 if (m_idMapping.contains(p)) |
| 167 return m_idMapping.get(p); | 236 return m_idMapping.get(p); |
| 168 // We do not handle the overflow of m_currentId as it should be very rare | 237 // We do not handle the overflow of m_currentId as it should be very rare |
| 169 MappedId mappedId = m_currentId++; | 238 int mappedId = m_currentId++; |
| 170 if (!m_idCount[type]) | 239 if (!m_idCount[type]) |
| 171 m_primaryId[type] = mappedId; | 240 m_primaryId[type] = mappedId; |
| 172 m_idCount[type]++; | 241 m_idCount[type]++; |
| 173 m_idMapping.add(p, mappedId); | 242 m_idMapping.add(p, mappedId); |
| 174 m_idReverseMapping.add(mappedId, p); | 243 m_idReverseMapping.add(mappedId, p); |
| 175 return static_cast<PointerEventManager::MappedId>(mappedId); | 244 return mappedId; |
| 176 } | 245 } |
| 177 | 246 |
| 178 void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> poin
terEvent) | 247 void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> poin
terEvent) |
| 179 { | 248 { |
| 180 MappedId mappedId = pointerEvent->pointerId(); | 249 int mappedId = pointerEvent->pointerId(); |
| 181 // Do not remove mouse pointer id as it should always be there | 250 // Do not remove mouse pointer id as it should always be there |
| 182 if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId)) | 251 if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId)) |
| 183 return; | 252 return; |
| 184 | 253 |
| 185 IncomingId p = m_idReverseMapping.get(mappedId); | 254 IncomingId p = m_idReverseMapping.get(mappedId); |
| 186 int type = p.first; | 255 int type = p.first; |
| 256 implicitReleasePointerCapture(mappedId); |
| 187 m_idReverseMapping.remove(mappedId); | 257 m_idReverseMapping.remove(mappedId); |
| 188 m_idMapping.remove(p); | 258 m_idMapping.remove(p); |
| 189 if (m_primaryId[type] == mappedId) | 259 if (m_primaryId[type] == mappedId) |
| 190 m_primaryId[type] = PointerEventManager::s_invalidId; | 260 m_primaryId[type] = PointerEventManager::s_invalidId; |
| 191 m_idCount[type]--; | 261 m_idCount[type]--; |
| 192 } | 262 } |
| 193 | 263 |
| 194 bool PointerEventManager::isPrimary(PointerEventManager::MappedId mappedId) cons
t | 264 bool PointerEventManager::isPrimary(int mappedId) const |
| 195 { | 265 { |
| 196 if (!m_idReverseMapping.contains(mappedId)) | 266 if (!m_idReverseMapping.contains(mappedId)) |
| 197 return false; | 267 return false; |
| 198 | 268 |
| 199 IncomingId p = m_idReverseMapping.get(mappedId); | 269 IncomingId p = m_idReverseMapping.get(mappedId); |
| 200 int type = p.first; | 270 int type = p.first; |
| 201 return m_primaryId[type] == mappedId; | 271 return m_primaryId[type] == mappedId; |
| 202 } | 272 } |
| 203 | 273 |
| 274 bool PointerEventManager::isActive(const int pointerId) |
| 275 { |
| 276 return m_idReverseMapping.contains(pointerId); |
| 277 } |
| 278 |
| 279 bool PointerEventManager::isActiveButtons(const int pointerId) |
| 280 { |
| 281 return m_lastButtons.contains(pointerId) && m_lastButtons.get(pointerId); |
| 282 } |
| 204 | 283 |
| 205 } // namespace blink | 284 } // namespace blink |
| OLD | NEW |