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

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

Issue 1635863006: Pointerevent capture APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698