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 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "platform/geometry/FloatSize.h" | 8 #include "platform/geometry/FloatSize.h" |
9 | 9 |
10 namespace blink { | 10 namespace blink { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 pointerEventInit.setPointerId(pointerId); | 201 pointerEventInit.setPointerId(pointerId); |
202 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe
rType)); | 202 pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointe
rType)); |
203 pointerEventInit.setIsPrimary(isPrimary(pointerId)); | 203 pointerEventInit.setIsPrimary(isPrimary(pointerId)); |
204 pointerEventInit.setBubbles(true); | 204 pointerEventInit.setBubbles(true); |
205 pointerEventInit.setCancelable(false); | 205 pointerEventInit.setCancelable(false); |
206 | 206 |
207 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit)
; | 207 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit)
; |
208 } | 208 } |
209 | 209 |
210 PointerEvent* PointerEventFactory::createPointerCaptureEvent( | 210 PointerEvent* PointerEventFactory::createPointerCaptureEvent( |
211 const int pointerId, | 211 PointerEvent* pointerEvent, |
212 const AtomicString& type) | 212 const AtomicString& type) |
213 { | 213 { |
214 ASSERT(type == EventTypeNames::gotpointercapture | 214 ASSERT(type == EventTypeNames::gotpointercapture |
215 || type == EventTypeNames::lostpointercapture); | 215 || type == EventTypeNames::lostpointercapture); |
216 | 216 |
217 // See https://github.com/w3c/pointerevents/issues/113 as why we don't set | |
218 // any other attributes for got/lostpointercapture. | |
219 PointerEventInit pointerEventInit; | 217 PointerEventInit pointerEventInit; |
220 pointerEventInit.setPointerId(pointerId); | 218 pointerEventInit.setPointerId(pointerEvent->pointerId()); |
| 219 pointerEventInit.setPointerType(pointerEvent->pointerType()); |
| 220 pointerEventInit.setIsPrimary(pointerEvent->isPrimary()); |
221 pointerEventInit.setBubbles(true); | 221 pointerEventInit.setBubbles(true); |
222 pointerEventInit.setCancelable(false); | 222 pointerEventInit.setCancelable(false); |
223 | 223 |
224 return PointerEvent::create(type, pointerEventInit); | 224 return PointerEvent::create(type, pointerEventInit); |
225 } | 225 } |
226 | 226 |
227 PointerEvent* PointerEventFactory::createPointerBoundaryEvent( | 227 PointerEvent* PointerEventFactory::createPointerBoundaryEvent( |
228 PointerEvent* pointerEvent, | 228 PointerEvent* pointerEvent, |
229 const AtomicString& type, | 229 const AtomicString& type, |
230 EventTarget* relatedTarget) | 230 EventTarget* relatedTarget) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 m_pointerIdMapping.add(s_mouseId, PointerAttributes( | 287 m_pointerIdMapping.add(s_mouseId, PointerAttributes( |
288 IncomingId(WebPointerProperties::PointerType::Mouse, 0), 0)); | 288 IncomingId(WebPointerProperties::PointerType::Mouse, 0), 0)); |
289 | 289 |
290 m_currentId = PointerEventFactory::s_mouseId+1; | 290 m_currentId = PointerEventFactory::s_mouseId+1; |
291 } | 291 } |
292 | 292 |
293 int PointerEventFactory::addIdAndActiveButtons(const IncomingId p, | 293 int PointerEventFactory::addIdAndActiveButtons(const IncomingId p, |
294 bool isActiveButtons) | 294 bool isActiveButtons) |
295 { | 295 { |
296 // Do not add extra mouse pointer as it was added in initialization | 296 // Do not add extra mouse pointer as it was added in initialization |
297 if (p.pointerType() == WebPointerProperties::PointerType::Mouse) { | 297 if (p.pointerType() == toInt(WebPointerProperties::PointerType::Mouse)) { |
298 m_pointerIdMapping.set(s_mouseId, PointerAttributes(p, isActiveButtons))
; | 298 m_pointerIdMapping.set(s_mouseId, PointerAttributes(p, isActiveButtons))
; |
299 return s_mouseId; | 299 return s_mouseId; |
300 } | 300 } |
301 | 301 |
302 int type = p.pointerTypeInt(); | 302 int type = p.pointerType(); |
303 if (m_pointerIncomingIdMapping.contains(p)) { | 303 if (m_pointerIncomingIdMapping.contains(p)) { |
304 int mappedId = m_pointerIncomingIdMapping.get(p); | 304 int mappedId = m_pointerIncomingIdMapping.get(p); |
305 m_pointerIdMapping.set(mappedId, PointerAttributes(p, isActiveButtons)); | 305 m_pointerIdMapping.set(mappedId, PointerAttributes(p, isActiveButtons)); |
306 return mappedId; | 306 return mappedId; |
307 } | 307 } |
308 // We do not handle the overflow of m_currentId as it should be very rare | 308 // We do not handle the overflow of m_currentId as it should be very rare |
309 int mappedId = m_currentId++; | 309 int mappedId = m_currentId++; |
310 if (!m_idCount[type]) | 310 if (!m_idCount[type]) |
311 m_primaryId[type] = mappedId; | 311 m_primaryId[type] = mappedId; |
312 m_idCount[type]++; | 312 m_idCount[type]++; |
313 m_pointerIncomingIdMapping.add(p, mappedId); | 313 m_pointerIncomingIdMapping.add(p, mappedId); |
314 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons)); | 314 m_pointerIdMapping.add(mappedId, PointerAttributes(p, isActiveButtons)); |
315 return mappedId; | 315 return mappedId; |
316 } | 316 } |
317 | 317 |
318 bool PointerEventFactory::remove(const int mappedId) | 318 bool PointerEventFactory::remove(const int mappedId) |
319 { | 319 { |
320 // Do not remove mouse pointer id as it should always be there | 320 // Do not remove mouse pointer id as it should always be there |
321 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId)) | 321 if (mappedId == s_mouseId || !m_pointerIdMapping.contains(mappedId)) |
322 return false; | 322 return false; |
323 | 323 |
324 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; | 324 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; |
325 int type = p.pointerTypeInt(); | 325 int type = p.pointerType(); |
326 m_pointerIdMapping.remove(mappedId); | 326 m_pointerIdMapping.remove(mappedId); |
327 m_pointerIncomingIdMapping.remove(p); | 327 m_pointerIncomingIdMapping.remove(p); |
328 if (m_primaryId[type] == mappedId) | 328 if (m_primaryId[type] == mappedId) |
329 m_primaryId[type] = PointerEventFactory::s_invalidId; | 329 m_primaryId[type] = PointerEventFactory::s_invalidId; |
330 m_idCount[type]--; | 330 m_idCount[type]--; |
331 return true; | 331 return true; |
332 } | 332 } |
333 | 333 |
334 Vector<int> PointerEventFactory::getPointerIdsOfType( | 334 Vector<int> PointerEventFactory::getPointerIdsOfType( |
335 WebPointerProperties::PointerType pointerType) const | 335 WebPointerProperties::PointerType pointerType) const |
336 { | 336 { |
337 Vector<int> mappedIds; | 337 Vector<int> mappedIds; |
338 | 338 |
339 for (auto iter = m_pointerIdMapping.begin(); iter != m_pointerIdMapping.end(
); ++iter) { | 339 for (auto iter = m_pointerIdMapping.begin(); iter != m_pointerIdMapping.end(
); ++iter) { |
340 int mappedId = iter->key; | 340 int mappedId = iter->key; |
341 if (iter->value.incomingId.pointerType() == pointerType) | 341 if (iter->value.incomingId.pointerType() == static_cast<int>(pointerType
)) |
342 mappedIds.append(mappedId); | 342 mappedIds.append(mappedId); |
343 } | 343 } |
344 | 344 |
345 // Sorting for a predictable ordering. | 345 // Sorting for a predictable ordering. |
346 std::sort(mappedIds.begin(), mappedIds.end()); | 346 std::sort(mappedIds.begin(), mappedIds.end()); |
347 return mappedIds; | 347 return mappedIds; |
348 } | 348 } |
349 | 349 |
350 bool PointerEventFactory::isPrimary(int mappedId) const | 350 bool PointerEventFactory::isPrimary(int mappedId) const |
351 { | 351 { |
352 if (!m_pointerIdMapping.contains(mappedId)) | 352 if (!m_pointerIdMapping.contains(mappedId)) |
353 return false; | 353 return false; |
354 | 354 |
355 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; | 355 IncomingId p = m_pointerIdMapping.get(mappedId).incomingId; |
356 return m_primaryId[p.pointerTypeInt()] == mappedId; | 356 return m_primaryId[p.pointerType()] == mappedId; |
357 } | 357 } |
358 | 358 |
359 bool PointerEventFactory::isActive(const int pointerId) const | 359 bool PointerEventFactory::isActive(const int pointerId) const |
360 { | 360 { |
361 return m_pointerIdMapping.contains(pointerId); | 361 return m_pointerIdMapping.contains(pointerId); |
362 } | 362 } |
363 | 363 |
364 bool PointerEventFactory::isActiveButtonsState(const int pointerId) const | 364 bool PointerEventFactory::isActiveButtonsState(const int pointerId) const |
365 { | 365 { |
366 return m_pointerIdMapping.contains(pointerId) | 366 return m_pointerIdMapping.contains(pointerId) |
367 && m_pointerIdMapping.get(pointerId).isActiveButtons; | 367 && m_pointerIdMapping.get(pointerId).isActiveButtons; |
368 } | 368 } |
369 | 369 |
370 int PointerEventFactory::getPointerEventId( | 370 int PointerEventFactory::getPointerEventId( |
371 const WebPointerProperties& properties) const | 371 const WebPointerProperties& properties) const |
372 { | 372 { |
373 if (properties.pointerType | 373 if (properties.pointerType |
374 == WebPointerProperties::PointerType::Mouse) | 374 == WebPointerProperties::PointerType::Mouse) |
375 return PointerEventFactory::s_mouseId; | 375 return PointerEventFactory::s_mouseId; |
376 IncomingId id(properties.pointerType, properties.id); | 376 IncomingId id(properties.pointerType, properties.id); |
377 if (m_pointerIncomingIdMapping.contains(id)) | 377 if (m_pointerIncomingIdMapping.contains(id)) |
378 return m_pointerIncomingIdMapping.get(id); | 378 return m_pointerIncomingIdMapping.get(id); |
379 return PointerEventFactory::s_invalidId; | 379 return PointerEventFactory::s_invalidId; |
380 } | 380 } |
381 | 381 |
382 } // namespace blink | 382 } // namespace blink |
OLD | NEW |