| 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/input/PointerEventManager.h" | 5 #include "core/input/PointerEventManager.h" | 
| 6 | 6 | 
| 7 #include "core/dom/ElementTraversal.h" | 7 #include "core/dom/ElementTraversal.h" | 
| 8 #include "core/dom/UserGestureIndicator.h" | 8 #include "core/dom/UserGestureIndicator.h" | 
| 9 #include "core/dom/shadow/FlatTreeTraversal.h" | 9 #include "core/dom/shadow/FlatTreeTraversal.h" | 
| 10 #include "core/events/MouseEvent.h" | 10 #include "core/events/MouseEvent.h" | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 26 | 26 | 
| 27 namespace { | 27 namespace { | 
| 28 | 28 | 
| 29 size_t ToPointerTypeIndex(WebPointerProperties::PointerType t) { | 29 size_t ToPointerTypeIndex(WebPointerProperties::PointerType t) { | 
| 30   return static_cast<size_t>(t); | 30   return static_cast<size_t>(t); | 
| 31 } | 31 } | 
| 32 bool HasPointerEventListener(const EventHandlerRegistry& registry) { | 32 bool HasPointerEventListener(const EventHandlerRegistry& registry) { | 
| 33   return registry.HasEventHandlers(EventHandlerRegistry::kPointerEvent); | 33   return registry.HasEventHandlers(EventHandlerRegistry::kPointerEvent); | 
| 34 } | 34 } | 
| 35 | 35 | 
|  | 36 Vector<WebPointerEvent> GetCoalescedWebPointerEventsWithNoTransformation( | 
|  | 37     const Vector<WebTouchEvent>& coalesced_events, | 
|  | 38     int id) { | 
|  | 39   Vector<WebPointerEvent> related_pointer_events; | 
|  | 40   for (const auto& touch_event : coalesced_events) { | 
|  | 41     for (unsigned i = 0; i < touch_event.touches_length; ++i) { | 
|  | 42       if (touch_event.touches[i].id == id && | 
|  | 43           touch_event.touches[i].state != WebTouchPoint::kStateStationary) { | 
|  | 44         related_pointer_events.push_back( | 
|  | 45             WebPointerEvent(touch_event, touch_event.touches[i])); | 
|  | 46       } | 
|  | 47     } | 
|  | 48   } | 
|  | 49   return related_pointer_events; | 
|  | 50 } | 
|  | 51 | 
| 36 Vector<std::pair<WebTouchPoint, TimeTicks>> GetCoalescedPoints( | 52 Vector<std::pair<WebTouchPoint, TimeTicks>> GetCoalescedPoints( | 
| 37     const Vector<WebTouchEvent>& coalesced_events, | 53     const Vector<WebTouchEvent>& coalesced_events, | 
| 38     int id) { | 54     int id) { | 
| 39   Vector<std::pair<WebTouchPoint, TimeTicks>> related_points; | 55   Vector<std::pair<WebTouchPoint, TimeTicks>> related_points; | 
| 40   for (const auto& touch_event : coalesced_events) { | 56   for (const auto& touch_event : coalesced_events) { | 
| 41     for (unsigned i = 0; i < touch_event.touches_length; ++i) { | 57     for (unsigned i = 0; i < touch_event.touches_length; ++i) { | 
| 42       if (touch_event.touches[i].id == id && | 58       if (touch_event.touches[i].id == id && | 
| 43           touch_event.touches[i].state != WebTouchPoint::kStateStationary) { | 59           touch_event.touches[i].state != WebTouchPoint::kStateStationary) { | 
| 44         related_points.push_back(std::pair<WebTouchPoint, TimeTicks>( | 60         related_points.push_back(std::pair<WebTouchPoint, TimeTicks>( | 
| 45             touch_event.TouchPointInRootFrame(i), | 61             touch_event.TouchPointInRootFrame(i), | 
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 317   // associated with so just pick the first finger. | 333   // associated with so just pick the first finger. | 
| 318   RefPtr<UserGestureToken> possible_gesture_token; | 334   RefPtr<UserGestureToken> possible_gesture_token; | 
| 319   if (event.GetType() == WebInputEvent::kTouchEnd && | 335   if (event.GetType() == WebInputEvent::kTouchEnd && | 
| 320       !in_canceled_state_for_pointer_type_touch_ && event.touches_length && | 336       !in_canceled_state_for_pointer_type_touch_ && event.touches_length && | 
| 321       first_pointer_event_target.target_frame) { | 337       first_pointer_event_target.target_frame) { | 
| 322     possible_gesture_token = UserGestureToken::Create( | 338     possible_gesture_token = UserGestureToken::Create( | 
| 323         first_pointer_event_target.target_frame->GetDocument()); | 339         first_pointer_event_target.target_frame->GetDocument()); | 
| 324   } | 340   } | 
| 325   UserGestureIndicator holder(possible_gesture_token); | 341   UserGestureIndicator holder(possible_gesture_token); | 
| 326 | 342 | 
| 327   HeapVector<EventHandlingUtil::PointerEventTarget> pointer_event_targets; |  | 
| 328 | 343 | 
| 329   for (unsigned touch_point_idx = 0; touch_point_idx < event.touches_length; | 344   for (unsigned touch_point_idx = 0; touch_point_idx < event.touches_length; | 
| 330        ++touch_point_idx) { | 345        ++touch_point_idx) { | 
| 331     // Do any necessary hit-tests and compute the event targets for all pointers | 346     // Do any necessary hit-tests and compute the event targets for all pointers | 
| 332     // in the event. | 347     // in the event. | 
| 333     const auto& touch_point = event.TouchPointInRootFrame(touch_point_idx); | 348     const auto& touch_point = event.TouchPointInRootFrame(touch_point_idx); | 
| 334     EventHandlingUtil::PointerEventTarget pointer_event_target = | 349     EventHandlingUtil::PointerEventTarget pointer_event_target = | 
| 335         touch_point_idx ? ComputePointerEventTarget(touch_point) | 350         touch_point_idx ? ComputePointerEventTarget(touch_point) | 
| 336                         : first_pointer_event_target; | 351                         : first_pointer_event_target; | 
| 337     pointer_event_targets.push_back(pointer_event_target); |  | 
| 338 | 352 | 
| 339     DispatchTouchPointerEvent( | 353     if (touch_point.state != blink::WebTouchPoint::kStateStationary) { | 
| 340         touch_point, pointer_event_target, | 354       DispatchTouchPointerEvent( | 
| 341         GetCoalescedPoints(coalesced_events, touch_point.id), | 355           touch_point, pointer_event_target, | 
| 342         static_cast<WebInputEvent::Modifiers>(event.GetModifiers()), | 356           GetCoalescedPoints(coalesced_events, touch_point.id), | 
| 343         event.TimeStampSeconds(), event.unique_touch_event_id); | 357           static_cast<WebInputEvent::Modifiers>(event.GetModifiers()), | 
|  | 358           event.TimeStampSeconds(), event.unique_touch_event_id); | 
|  | 359 | 
|  | 360       touch_event_manager_->HandleTouchPoint( | 
|  | 361           WebPointerEvent(event, event.touches[touch_point_idx]), | 
|  | 362           GetCoalescedWebPointerEventsWithNoTransformation( | 
|  | 363               coalesced_events, event.touches[touch_point_idx].id), | 
|  | 364           pointer_event_target); | 
|  | 365     } | 
| 344   } | 366   } | 
| 345 | 367 | 
| 346   return touch_event_manager_->HandleTouchEvent(event, coalesced_events, | 368   // Calling this function |FlushEvents| will be moved to MainThreadEventQueue | 
| 347                                                 pointer_event_targets); | 369   // class. It will be called before rAF and also whenever we run in low latency | 
|  | 370   // mode as mentioned in crbug.com/728250. | 
|  | 371   return touch_event_manager_->FlushEvents(); | 
| 348 } | 372 } | 
| 349 | 373 | 
| 350 EventHandlingUtil::PointerEventTarget | 374 EventHandlingUtil::PointerEventTarget | 
| 351 PointerEventManager::ComputePointerEventTarget( | 375 PointerEventManager::ComputePointerEventTarget( | 
| 352     const WebTouchPoint& touch_point) { | 376     const WebTouchPoint& touch_point) { | 
| 353   EventHandlingUtil::PointerEventTarget pointer_event_target; | 377   EventHandlingUtil::PointerEventTarget pointer_event_target; | 
| 354 | 378 | 
| 355   int pointer_id = pointer_event_factory_.GetPointerEventId(touch_point); | 379   int pointer_id = pointer_event_factory_.GetPointerEventId(touch_point); | 
| 356   // Do the hit test either when the touch first starts or when the touch | 380   // Do the hit test either when the touch first starts or when the touch | 
| 357   // is not captured. |m_pendingPointerCaptureTarget| indicates the target | 381   // is not captured. |m_pendingPointerCaptureTarget| indicates the target | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 403     const WebTouchPoint& touch_point, | 427     const WebTouchPoint& touch_point, | 
| 404     const EventHandlingUtil::PointerEventTarget& pointer_event_target, | 428     const EventHandlingUtil::PointerEventTarget& pointer_event_target, | 
| 405     const Vector<std::pair<WebTouchPoint, TimeTicks>>& coalesced_events, | 429     const Vector<std::pair<WebTouchPoint, TimeTicks>>& coalesced_events, | 
| 406     WebInputEvent::Modifiers modifiers, | 430     WebInputEvent::Modifiers modifiers, | 
| 407     double timestamp, | 431     double timestamp, | 
| 408     uint32_t unique_touch_event_id) { | 432     uint32_t unique_touch_event_id) { | 
| 409   // Iterate through the touch points, sending PointerEvents to the targets as | 433   // Iterate through the touch points, sending PointerEvents to the targets as | 
| 410   // required. | 434   // required. | 
| 411   // Do not send pointer events for stationary touches or null targetFrame | 435   // Do not send pointer events for stationary touches or null targetFrame | 
| 412   if (pointer_event_target.target_node && pointer_event_target.target_frame && | 436   if (pointer_event_target.target_node && pointer_event_target.target_frame && | 
| 413       touch_point.state != WebTouchPoint::kStateStationary && |  | 
| 414       !in_canceled_state_for_pointer_type_touch_) { | 437       !in_canceled_state_for_pointer_type_touch_) { | 
| 415     PointerEvent* pointer_event = pointer_event_factory_.Create( | 438     PointerEvent* pointer_event = pointer_event_factory_.Create( | 
| 416         touch_point, coalesced_events, | 439         touch_point, coalesced_events, | 
| 417         static_cast<WebInputEvent::Modifiers>(modifiers), | 440         static_cast<WebInputEvent::Modifiers>(modifiers), | 
| 418         TimeTicks::FromSeconds(timestamp), pointer_event_target.target_frame, | 441         TimeTicks::FromSeconds(timestamp), pointer_event_target.target_frame, | 
| 419         pointer_event_target.target_node | 442         pointer_event_target.target_node | 
| 420             ? pointer_event_target.target_node->GetDocument().domWindow() | 443             ? pointer_event_target.target_node->GetDocument().domWindow() | 
| 421             : nullptr); | 444             : nullptr); | 
| 422 | 445 | 
| 423     WebInputEventResult result = | 446     WebInputEventResult result = | 
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 751     if (first_id > unique_touch_event_id) | 774     if (first_id > unique_touch_event_id) | 
| 752       return false; | 775       return false; | 
| 753     touch_ids_for_canceled_pointerdowns_.TakeFirst(); | 776     touch_ids_for_canceled_pointerdowns_.TakeFirst(); | 
| 754     if (first_id == unique_touch_event_id) | 777     if (first_id == unique_touch_event_id) | 
| 755       return true; | 778       return true; | 
| 756   } | 779   } | 
| 757   return false; | 780   return false; | 
| 758 } | 781 } | 
| 759 | 782 | 
| 760 }  // namespace blink | 783 }  // namespace blink | 
| OLD | NEW | 
|---|