Chromium Code Reviews| 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/PointerEventFactory.h" |
|
Ian Vollick
2016/02/12 15:01:17
Although the net result seems clearer, this patch
mustaq
2016/02/12 15:17:40
Yes, mainly to isolate:
(a) PointerEvent states
Navid Zolghadr
2016/02/12 16:30:47
Done
| |
| 6 | 6 |
| 7 namespace blink { | 7 namespace blink { |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 inline int toInt(WebPointerProperties::PointerType t) { return static_cast<int>( t); } | 11 inline int toInt(WebPointerProperties::PointerType t) { return static_cast<int>( t); } |
| 12 | 12 |
| 13 const char* pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerT ype type) | 13 const char* pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerT ype type) |
| 14 { | 14 { |
| 15 switch (type) { | 15 switch (type) { |
| 16 case WebPointerProperties::PointerType::Unknown: | 16 case WebPointerProperties::PointerType::Unknown: |
| 17 return ""; | 17 return ""; |
| 18 case WebPointerProperties::PointerType::Touch: | 18 case WebPointerProperties::PointerType::Touch: |
| 19 return "touch"; | 19 return "touch"; |
| 20 case WebPointerProperties::PointerType::Pen: | 20 case WebPointerProperties::PointerType::Pen: |
| 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 PointerEventFactory::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 PointerEventFactory::s_mouseId = 1; |
| 35 | |
| 36 EventTarget* PointerEventManager::getCapturingNode(PassRefPtrWillBeRawPtr<Pointe rEvent> pointerEvent) | |
| 37 { | |
| 38 // TODO(nzolghadr): Add APIs to set the capturing nodes and return the corre ct node here | |
| 39 return nullptr; | |
| 40 } | |
| 41 | 35 |
| 42 float getPointerEventPressure(float force, int buttons) | 36 float getPointerEventPressure(float force, int buttons) |
| 43 { | 37 { |
| 44 if (std::isnan(force)) | 38 if (std::isnan(force)) |
| 45 return buttons ? 0.5 : 0; | 39 return buttons ? 0.5 : 0; |
| 46 return force; | 40 return force; |
| 47 } | 41 } |
| 48 | 42 |
| 49 void PointerEventManager::setIdAndType(PointerEventInit &pointerEventInit, | 43 void PointerEventFactory::setIdAndType(PointerEventInit &pointerEventInit, |
| 50 const WebPointerProperties &pointerProperties) | 44 const WebPointerProperties &pointerProperties) |
| 51 { | 45 { |
| 52 const WebPointerProperties::PointerType pointerType = pointerProperties.poin terType; | 46 const WebPointerProperties::PointerType pointerType = pointerProperties.poin terType; |
| 53 MappedId pointerId = add(PointerEventManager::IncomingId(toInt(pointerType), pointerProperties.id)); | 47 int pointerId = add(PointerEventFactory::IncomingId(toInt(pointerType), poin terProperties.id)); |
| 54 pointerEventInit.setPointerId(pointerId); | 48 pointerEventInit.setPointerId(pointerId); |
| 55 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType)); | 49 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType)); |
| 56 pointerEventInit.setIsPrimary(isPrimary(pointerId)); | 50 pointerEventInit.setIsPrimary(isPrimary(pointerId)); |
| 57 } | 51 } |
| 58 | 52 |
| 59 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr ing& type, | 53 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventFactory::create(const AtomicStr ing& type, |
| 60 const PlatformMouseEvent& mouseEvent, | 54 const PlatformMouseEvent& mouseEvent, |
| 61 PassRefPtrWillBeRawPtr<Node> relatedTarget, | 55 PassRefPtrWillBeRawPtr<Node> relatedTarget, |
| 62 PassRefPtrWillBeRawPtr<AbstractView> view) | 56 PassRefPtrWillBeRawPtr<AbstractView> view) |
| 63 { | 57 { |
| 64 PointerEventInit pointerEventInit; | 58 PointerEventInit pointerEventInit; |
| 65 | 59 |
| 66 setIdAndType(pointerEventInit, mouseEvent.pointerProperties()); | 60 setIdAndType(pointerEventInit, mouseEvent.pointerProperties()); |
| 67 | 61 |
| 68 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); | 62 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); |
| 69 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); | 63 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 82 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter | 76 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter |
| 83 && type != EventTypeNames::pointerleave && type != EventTypeNames::point ercancel); | 77 && type != EventTypeNames::pointerleave && type != EventTypeNames::point ercancel); |
| 84 | 78 |
| 85 pointerEventInit.setView(view); | 79 pointerEventInit.setView(view); |
| 86 if (relatedTarget) | 80 if (relatedTarget) |
| 87 pointerEventInit.setRelatedTarget(relatedTarget); | 81 pointerEventInit.setRelatedTarget(relatedTarget); |
| 88 | 82 |
| 89 return PointerEvent::create(type, pointerEventInit); | 83 return PointerEvent::create(type, pointerEventInit); |
| 90 } | 84 } |
| 91 | 85 |
| 92 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr ing& type, | 86 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventFactory::create(const AtomicStr ing& type, |
| 93 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, | 87 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, |
| 94 const double width, const double height, | 88 const double width, const double height, |
| 95 const double clientX, const double clientY) | 89 const double clientX, const double clientY) |
| 96 { | 90 { |
| 97 const PlatformTouchPoint::State pointState = touchPoint.state(); | 91 const PlatformTouchPoint::State pointState = touchPoint.state(); |
| 98 | 92 |
| 99 bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchRel eased | 93 bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchRel eased |
| 100 || pointState == PlatformTouchPoint::TouchCancelled; | 94 || pointState == PlatformTouchPoint::TouchCancelled; |
| 101 | 95 |
| 102 bool isEnterOrLeave = false; | 96 bool isEnterOrLeave = false; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 120 | 114 |
| 121 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); | 115 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); |
| 122 | 116 |
| 123 pointerEventInit.setBubbles(!isEnterOrLeave); | 117 pointerEventInit.setBubbles(!isEnterOrLeave); |
| 124 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc hPoint::TouchCancelled); | 118 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc hPoint::TouchCancelled); |
| 125 | 119 |
| 126 return PointerEvent::create(type, pointerEventInit); | 120 return PointerEvent::create(type, pointerEventInit); |
| 127 } | 121 } |
| 128 | 122 |
| 129 | 123 |
| 130 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::createPointerCancel(co nst PlatformTouchPoint& touchPoint) | 124 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventFactory::createPointerCancel(co nst PlatformTouchPoint& touchPoint) |
| 131 { | 125 { |
| 132 PointerEventInit pointerEventInit; | 126 PointerEventInit pointerEventInit; |
| 133 | 127 |
| 134 setIdAndType(pointerEventInit, touchPoint.pointerProperties()); | 128 setIdAndType(pointerEventInit, touchPoint.pointerProperties()); |
| 135 | 129 |
| 136 pointerEventInit.setBubbles(true); | 130 pointerEventInit.setBubbles(true); |
| 137 pointerEventInit.setCancelable(false); | 131 pointerEventInit.setCancelable(false); |
| 138 | 132 |
| 139 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ; | 133 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ; |
| 140 } | 134 } |
| 141 | 135 |
| 142 PointerEventManager::PointerEventManager() | 136 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventFactory::create( |
| 137 PassRefPtrWillBeRawPtr<PointerEvent> pointerevent, | |
|
Ian Vollick
2016/02/12 15:01:17
nit: camel case.
Navid Zolghadr
2016/02/12 16:30:47
Done
| |
| 138 const AtomicString& type, | |
| 139 PassRefPtrWillBeRawPtr<EventTarget> relatedTarget) | |
| 140 { | |
| 141 PointerEventInit pointerEventInit; | |
| 142 | |
| 143 pointerEventInit.setPointerId(pointerevent->pointerId()); | |
| 144 pointerEventInit.setPointerType(pointerevent->pointerType()); | |
| 145 pointerEventInit.setIsPrimary(pointerevent->isPrimary()); | |
| 146 pointerEventInit.setWidth(pointerevent->width()); | |
| 147 pointerEventInit.setHeight(pointerevent->height()); | |
| 148 pointerEventInit.setTiltX(pointerevent->tiltX()); | |
| 149 pointerEventInit.setTiltY(pointerevent->tiltY()); | |
| 150 pointerEventInit.setScreenX(pointerevent->screenX()); | |
| 151 pointerEventInit.setScreenY(pointerevent->screenY()); | |
| 152 pointerEventInit.setClientX(pointerevent->clientX()); | |
| 153 pointerEventInit.setClientY(pointerevent->clientY()); | |
| 154 pointerEventInit.setButton(pointerevent->button()); | |
| 155 pointerEventInit.setButtons(pointerevent->buttons()); | |
| 156 pointerEventInit.setPressure(pointerevent->pressure()); | |
| 157 | |
| 158 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter | |
| 159 && type != EventTypeNames::pointerleave); | |
| 160 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter | |
| 161 && type != EventTypeNames::pointerleave | |
| 162 && type != EventTypeNames::pointercancel); | |
| 163 if (relatedTarget) | |
| 164 pointerEventInit.setRelatedTarget(relatedTarget); | |
| 165 | |
| 166 return PointerEvent::create(type, pointerEventInit); | |
| 167 } | |
| 168 | |
| 169 PointerEventFactory::PointerEventFactory() | |
| 143 { | 170 { |
| 144 clear(); | 171 clear(); |
| 145 } | 172 } |
| 146 | 173 |
| 147 PointerEventManager::~PointerEventManager() | 174 PointerEventFactory::~PointerEventFactory() |
| 148 { | 175 { |
| 149 clear(); | 176 clear(); |
| 150 } | 177 } |
| 151 | 178 |
| 152 void PointerEventManager::clear() | 179 void PointerEventFactory::clear() |
| 153 { | 180 { |
| 154 for (int type = 0; type <= toInt(WebPointerProperties::PointerType::LastEntr y); type++) { | 181 for (int type = 0; type <= toInt(WebPointerProperties::PointerType::LastEntr y); type++) { |
| 155 m_primaryId[type] = PointerEventManager::s_invalidId; | 182 m_primaryId[type] = PointerEventFactory::s_invalidId; |
| 156 m_idCount[type] = 0; | 183 m_idCount[type] = 0; |
| 157 } | 184 } |
| 158 m_idMapping.clear(); | 185 m_idMapping.clear(); |
| 159 m_idReverseMapping.clear(); | 186 m_idReverseMapping.clear(); |
| 160 | 187 |
| 161 // Always add mouse pointer in initialization and never remove it. | 188 // Always add mouse pointer in initialization and never remove it. |
| 162 // No need to add it to m_idMapping as it is not going to be used with the e xisting APIs | 189 // No need to add it to m_idMapping as it is not going to be used with the e xisting APIs |
| 163 m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId; | 190 m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId; |
| 164 m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::Poi nterType::Mouse), 0)); | 191 m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::Poi nterType::Mouse), 0)); |
| 165 | 192 |
| 166 m_currentId = PointerEventManager::s_mouseId+1; | 193 m_currentId = PointerEventFactory::s_mouseId+1; |
| 167 } | 194 } |
| 168 | 195 |
| 169 PointerEventManager::MappedId PointerEventManager::add(const IncomingId p) | 196 int PointerEventFactory::add(const IncomingId p) |
| 170 { | 197 { |
| 171 // Do not add extra mouse pointer as it was added in initialization | 198 // Do not add extra mouse pointer as it was added in initialization |
| 172 if (p.first == toInt(WebPointerProperties::PointerType::Mouse)) | 199 if (p.first == toInt(WebPointerProperties::PointerType::Mouse)) |
| 173 return s_mouseId; | 200 return s_mouseId; |
| 174 | 201 |
| 175 int type = p.first; | 202 int type = p.first; |
| 176 if (m_idMapping.contains(p)) | 203 if (m_idMapping.contains(p)) |
| 177 return m_idMapping.get(p); | 204 return m_idMapping.get(p); |
| 178 // We do not handle the overflow of m_currentId as it should be very rare | 205 // We do not handle the overflow of m_currentId as it should be very rare |
| 179 MappedId mappedId = m_currentId++; | 206 int mappedId = m_currentId++; |
| 180 if (!m_idCount[type]) | 207 if (!m_idCount[type]) |
| 181 m_primaryId[type] = mappedId; | 208 m_primaryId[type] = mappedId; |
| 182 m_idCount[type]++; | 209 m_idCount[type]++; |
| 183 m_idMapping.add(p, mappedId); | 210 m_idMapping.add(p, mappedId); |
| 184 m_idReverseMapping.add(mappedId, p); | 211 m_idReverseMapping.add(mappedId, p); |
| 185 return static_cast<PointerEventManager::MappedId>(mappedId); | 212 return static_cast<int>(mappedId); |
| 186 } | 213 } |
| 187 | 214 |
| 188 void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> poin terEvent) | 215 void PointerEventFactory::remove( |
| 216 const PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent) | |
| 189 { | 217 { |
| 190 MappedId mappedId = pointerEvent->pointerId(); | 218 int mappedId = pointerEvent->pointerId(); |
| 191 // Do not remove mouse pointer id as it should always be there | 219 // Do not remove mouse pointer id as it should always be there |
| 192 if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId)) | 220 if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId)) |
| 193 return; | 221 return; |
| 194 | 222 |
| 195 IncomingId p = m_idReverseMapping.get(mappedId); | 223 IncomingId p = m_idReverseMapping.get(mappedId); |
| 196 int type = p.first; | 224 int type = p.first; |
| 197 m_idReverseMapping.remove(mappedId); | 225 m_idReverseMapping.remove(mappedId); |
| 198 m_idMapping.remove(p); | 226 m_idMapping.remove(p); |
| 199 if (m_primaryId[type] == mappedId) | 227 if (m_primaryId[type] == mappedId) |
| 200 m_primaryId[type] = PointerEventManager::s_invalidId; | 228 m_primaryId[type] = PointerEventFactory::s_invalidId; |
| 201 m_idCount[type]--; | 229 m_idCount[type]--; |
| 202 } | 230 } |
| 203 | 231 |
| 204 bool PointerEventManager::isPrimary(PointerEventManager::MappedId mappedId) cons t | 232 bool PointerEventFactory::isPrimary(int mappedId) const |
| 205 { | 233 { |
| 206 if (!m_idReverseMapping.contains(mappedId)) | 234 if (!m_idReverseMapping.contains(mappedId)) |
| 207 return false; | 235 return false; |
| 208 | 236 |
| 209 IncomingId p = m_idReverseMapping.get(mappedId); | 237 IncomingId p = m_idReverseMapping.get(mappedId); |
| 210 int type = p.first; | 238 int type = p.first; |
| 211 return m_primaryId[type] == mappedId; | 239 return m_primaryId[type] == mappedId; |
| 212 } | 240 } |
| 213 | 241 |
| 214 | 242 |
| 215 } // namespace blink | 243 } // namespace blink |
| OLD | NEW |