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

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

Issue 1670073004: Send node transition events for touch events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Applying comments Created 4 years, 10 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "core/events/PointerEventManager.h"
6
7 namespace blink {
8
9 namespace {
10
11 inline int toInt(WebPointerProperties::PointerType t) { return static_cast<int>( t); }
12
13 const char* pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerT ype type)
14 {
15 switch (type) {
16 case WebPointerProperties::PointerType::Unknown:
17 return "";
18 case WebPointerProperties::PointerType::Touch:
19 return "touch";
20 case WebPointerProperties::PointerType::Pen:
21 return "pen";
22 case WebPointerProperties::PointerType::Mouse:
23 return "mouse";
24 }
25 ASSERT_NOT_REACHED();
26 return "";
27 }
28
29 } // namespace
30
31 const PointerEventManager::MappedId PointerEventManager::s_invalidId = 0;
32
33 // Mouse id is 1 to behave the same as MS Edge for compatibility reasons.
34 const PointerEventManager::MappedId PointerEventManager::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
42 float getPointerEventPressure(float force, int buttons)
43 {
44 if (std::isnan(force))
45 return buttons ? 0.5 : 0;
46 return force;
47 }
48
49 void PointerEventManager::setIdAndType(PointerEventInit &pointerEventInit,
50 const WebPointerProperties &pointerProperties)
51 {
52 const WebPointerProperties::PointerType pointerType = pointerProperties.poin terType;
53 MappedId pointerId = add(PointerEventManager::IncomingId(toInt(pointerType), pointerProperties.id));
54 pointerEventInit.setPointerId(pointerId);
55 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe rType));
56 pointerEventInit.setIsPrimary(isPrimary(pointerId));
57 }
58
59 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr ing& type,
60 const PlatformMouseEvent& mouseEvent,
61 PassRefPtrWillBeRawPtr<Node> relatedTarget,
62 PassRefPtrWillBeRawPtr<AbstractView> view)
63 {
64 PointerEventInit pointerEventInit;
65
66 setIdAndType(pointerEventInit, mouseEvent.pointerProperties());
67
68 pointerEventInit.setScreenX(mouseEvent.globalPosition().x());
69 pointerEventInit.setScreenY(mouseEvent.globalPosition().y());
70 pointerEventInit.setClientX(mouseEvent.position().x());
71 pointerEventInit.setClientY(mouseEvent.position().y());
72
73 pointerEventInit.setButton(mouseEvent.button());
74 pointerEventInit.setButtons(MouseEvent::platformModifiersToButtons(mouseEven t.modifiers()));
75 pointerEventInit.setPressure(getPointerEventPressure(
76 mouseEvent.pointerProperties().force, pointerEventInit.buttons()));
77
78 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.m odifiers());
79
80 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter
81 && type != EventTypeNames::pointerleave);
82 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter
83 && type != EventTypeNames::pointerleave && type != EventTypeNames::point ercancel);
84
85 pointerEventInit.setView(view);
86 if (relatedTarget)
87 pointerEventInit.setRelatedTarget(relatedTarget);
88
89 return PointerEvent::create(type, pointerEventInit);
90 }
91
92 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr ing& type,
93 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
94 const double width, const double height,
95 const double clientX, const double clientY)
96 {
97 const PlatformTouchPoint::State pointState = touchPoint.state();
98
99 bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchRel eased
100 || pointState == PlatformTouchPoint::TouchCancelled;
101
102 bool isEnterOrLeave = false;
103
104 PointerEventInit pointerEventInit;
105
106 setIdAndType(pointerEventInit, touchPoint.pointerProperties());
107
108 pointerEventInit.setWidth(width);
109 pointerEventInit.setHeight(height);
110 pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX);
111 pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY);
112 pointerEventInit.setScreenX(touchPoint.screenPos().x());
113 pointerEventInit.setScreenY(touchPoint.screenPos().y());
114 pointerEventInit.setClientX(clientX);
115 pointerEventInit.setClientY(clientY);
116 pointerEventInit.setButton(0);
117 pointerEventInit.setButtons(pointerReleasedOrCancelled ? 0 : 1);
118 pointerEventInit.setPressure(getPointerEventPressure(
119 touchPoint.force(), pointerEventInit.buttons()));
120
121 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers);
122
123 pointerEventInit.setBubbles(!isEnterOrLeave);
124 pointerEventInit.setCancelable(!isEnterOrLeave && pointState != PlatformTouc hPoint::TouchCancelled);
125
126 return PointerEvent::create(type, pointerEventInit);
127 }
128
129
130 PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::createPointerCancel(co nst PlatformTouchPoint& touchPoint)
131 {
132 PointerEventInit pointerEventInit;
133
134 setIdAndType(pointerEventInit, touchPoint.pointerProperties());
135
136 pointerEventInit.setBubbles(true);
137 pointerEventInit.setCancelable(false);
138
139 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit) ;
140 }
141
142 PointerEventManager::PointerEventManager()
143 {
144 clear();
145 }
146
147 PointerEventManager::~PointerEventManager()
148 {
149 clear();
150 }
151
152 void PointerEventManager::clear()
153 {
154 for (int type = 0; type <= toInt(WebPointerProperties::PointerType::LastEntr y); type++) {
155 m_primaryId[type] = PointerEventManager::s_invalidId;
156 m_idCount[type] = 0;
157 }
158 m_idMapping.clear();
159 m_idReverseMapping.clear();
160
161 // 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
163 m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId;
164 m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::Poi nterType::Mouse), 0));
165
166 m_currentId = PointerEventManager::s_mouseId+1;
167 }
168
169 PointerEventManager::MappedId PointerEventManager::add(const IncomingId p)
170 {
171 // Do not add extra mouse pointer as it was added in initialization
172 if (p.first == toInt(WebPointerProperties::PointerType::Mouse))
173 return s_mouseId;
174
175 int type = p.first;
176 if (m_idMapping.contains(p))
177 return m_idMapping.get(p);
178 // We do not handle the overflow of m_currentId as it should be very rare
179 MappedId mappedId = m_currentId++;
180 if (!m_idCount[type])
181 m_primaryId[type] = mappedId;
182 m_idCount[type]++;
183 m_idMapping.add(p, mappedId);
184 m_idReverseMapping.add(mappedId, p);
185 return static_cast<PointerEventManager::MappedId>(mappedId);
186 }
187
188 void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> poin terEvent)
189 {
190 MappedId mappedId = pointerEvent->pointerId();
191 // Do not remove mouse pointer id as it should always be there
192 if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId))
193 return;
194
195 IncomingId p = m_idReverseMapping.get(mappedId);
196 int type = p.first;
197 m_idReverseMapping.remove(mappedId);
198 m_idMapping.remove(p);
199 if (m_primaryId[type] == mappedId)
200 m_primaryId[type] = PointerEventManager::s_invalidId;
201 m_idCount[type]--;
202 }
203
204 bool PointerEventManager::isPrimary(PointerEventManager::MappedId mappedId) cons t
205 {
206 if (!m_idReverseMapping.contains(mappedId))
207 return false;
208
209 IncomingId p = m_idReverseMapping.get(mappedId);
210 int type = p.first;
211 return m_primaryId[type] == mappedId;
212 }
213
214
215 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698