diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc | 218 |
1 files changed, 109 insertions, 109 deletions
diff --git a/chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc b/chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc index fffde3296b6..990c1a953dc 100644 --- a/chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc +++ b/chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc @@ -77,7 +77,7 @@ void PointerEventManager::Clear() { non_hovering_pointers_canceled_ = false; pointer_event_factory_.Clear(); touch_ids_for_canceled_pointerdowns_.clear(); - node_under_pointer_.clear(); + element_under_pointer_.clear(); pointer_capture_target_.clear(); pending_pointer_capture_target_.clear(); user_gesture_holder_.reset(); @@ -86,7 +86,7 @@ void PointerEventManager::Clear() { void PointerEventManager::Trace(blink::Visitor* visitor) { visitor->Trace(frame_); - visitor->Trace(node_under_pointer_); + visitor->Trace(element_under_pointer_); visitor->Trace(pointer_capture_target_); visitor->Trace(pending_pointer_capture_target_); visitor->Trace(touch_event_manager_); @@ -157,7 +157,7 @@ WebInputEventResult PointerEventManager::DispatchPointerEvent( if (!target) return WebInputEventResult::kNotHandled; - const int pointer_id = pointer_event->pointerId(); + const PointerId pointer_id = pointer_event->pointerId(); const AtomicString& event_type = pointer_event->type(); if (!frame_ || !HasPointerEventListener(frame_->GetEventHandlerRegistry())) @@ -177,23 +177,24 @@ WebInputEventResult PointerEventManager::DispatchPointerEvent( UseCounter::Count(frame_, WebFeature::kPointerEventDispatchPointerDown); DCHECK(!dispatching_pointer_id_); - base::AutoReset<int> dispatch_holder(&dispatching_pointer_id_, pointer_id); + base::AutoReset<PointerId> dispatch_holder(&dispatching_pointer_id_, + pointer_id); DispatchEventResult dispatch_result = target->DispatchEvent(*pointer_event); return event_handling_util::ToWebInputEventResult(dispatch_result); } return WebInputEventResult::kNotHandled; } -EventTarget* PointerEventManager::GetEffectiveTargetForPointerEvent( - EventTarget* target, - int pointer_id) { - if (EventTarget* capturing_target = GetCapturingNode(pointer_id)) +Element* PointerEventManager::GetEffectiveTargetForPointerEvent( + Element* target, + PointerId pointer_id) { + if (Element* capturing_target = GetCapturingElement(pointer_id)) return capturing_target; return target; } void PointerEventManager::SendMouseAndPointerBoundaryEvents( - Node* entered_node, + Element* entered_element, const String& canvas_region_id, const WebMouseEvent& mouse_event) { // Mouse event type does not matter as this pointerevent will only be used @@ -215,7 +216,7 @@ void PointerEventManager::SendMouseAndPointerBoundaryEvents( mouse_event.pointer_type)] = false; } - ProcessCaptureAndPositionOfPointerEvent(dummy_pointer_event, entered_node, + ProcessCaptureAndPositionOfPointerEvent(dummy_pointer_event, entered_element, canvas_region_id, &mouse_event); } @@ -227,22 +228,22 @@ void PointerEventManager::SendBoundaryEvents(EventTarget* exited_target, boundary_event_dispatcher.SendBoundaryEvents(exited_target, entered_target); } -void PointerEventManager::SetNodeUnderPointer(PointerEvent* pointer_event, - EventTarget* target) { - if (node_under_pointer_.Contains(pointer_event->pointerId())) { +void PointerEventManager::SetElementUnderPointer(PointerEvent* pointer_event, + Element* target) { + if (element_under_pointer_.Contains(pointer_event->pointerId())) { EventTargetAttributes node = - node_under_pointer_.at(pointer_event->pointerId()); + element_under_pointer_.at(pointer_event->pointerId()); if (!target) { - node_under_pointer_.erase(pointer_event->pointerId()); + element_under_pointer_.erase(pointer_event->pointerId()); } else if (target != - node_under_pointer_.at(pointer_event->pointerId()).target) { - node_under_pointer_.Set(pointer_event->pointerId(), - EventTargetAttributes(target)); + element_under_pointer_.at(pointer_event->pointerId()).target) { + element_under_pointer_.Set(pointer_event->pointerId(), + EventTargetAttributes(target)); } SendBoundaryEvents(node.target, target, pointer_event); } else if (target) { - node_under_pointer_.insert(pointer_event->pointerId(), - EventTargetAttributes(target)); + element_under_pointer_.insert(pointer_event->pointerId(), + EventTargetAttributes(target)); SendBoundaryEvents(nullptr, target, pointer_event); } } @@ -265,10 +266,10 @@ void PointerEventManager::HandlePointerInterruption( // Cancel all non-hovering pointers if the pointer is not mouse. if (!non_hovering_pointers_canceled_) { - Vector<int> non_hovering_pointer_ids = + Vector<PointerId> non_hovering_pointer_ids = pointer_event_factory_.GetPointerIdsOfNonHoveringPointers(); - for (int pointer_id : non_hovering_pointer_ids) { + for (PointerId pointer_id : non_hovering_pointer_ids) { canceled_pointer_events.push_back( pointer_event_factory_.CreatePointerCancelEvent( pointer_id, web_pointer_event.TimeStamp())); @@ -281,9 +282,9 @@ void PointerEventManager::HandlePointerInterruption( for (auto pointer_event : canceled_pointer_events) { // If we are sending a pointercancel we have sent the pointerevent to some // target before. - DCHECK(node_under_pointer_.Contains(pointer_event->pointerId())); - EventTarget* target = - node_under_pointer_.at(pointer_event->pointerId()).target; + DCHECK(element_under_pointer_.Contains(pointer_event->pointerId())); + Element* target = + element_under_pointer_.at(pointer_event->pointerId()).target; DispatchPointerEvent( GetEffectiveTargetForPointerEvent(target, pointer_event->pointerId()), @@ -358,7 +359,8 @@ PointerEventManager::ComputePointerEventTarget( const WebPointerEvent& web_pointer_event) { event_handling_util::PointerEventTarget pointer_event_target; - int pointer_id = pointer_event_factory_.GetPointerEventId(web_pointer_event); + PointerId pointer_id = + pointer_event_factory_.GetPointerEventId(web_pointer_event); // Do the hit test either when the touch first starts or when the touch // is not captured. |m_pendingPointerCaptureTarget| indicates the target // that will be capturing this event. |m_pointerCaptureTarget| may not @@ -373,34 +375,27 @@ PointerEventManager::ComputePointerEventTarget( LayoutPoint(web_pointer_event.PositionInWidget()))); HitTestResult hit_test_tesult = frame_->GetEventHandler().HitTestResultAtLocation(location, hit_type); - Node* node = hit_test_tesult.InnerNode(); - if (node) { - pointer_event_target.target_frame = node->GetDocument().GetFrame(); - if (auto* canvas = ToHTMLCanvasElementOrNull(node)) { + Element* target = hit_test_tesult.InnerElement(); + if (target) { + pointer_event_target.target_frame = target->GetDocument().GetFrame(); + if (auto* canvas = ToHTMLCanvasElementOrNull(target)) { HitTestCanvasResult* hit_test_canvas_result = canvas->GetControlAndIdIfHitRegionExists( hit_test_tesult.PointInInnerNodeFrame()); if (hit_test_canvas_result->GetControl()) - node = hit_test_canvas_result->GetControl(); + target = hit_test_canvas_result->GetControl(); pointer_event_target.region = hit_test_canvas_result->GetId(); } - // TODO(crbug.com/612456): We need to investigate whether pointer - // events should go to text nodes or not. If so we need to - // update the mouse code as well. Also this logic looks similar - // to the one in TouchEventManager. We should be able to - // refactor it better after this investigation. - if (node->IsTextNode()) - node = FlatTreeTraversal::Parent(*node); - pointer_event_target.target_node = node; + pointer_event_target.target_element = target; } } else { - // Set the target of pointer event to the captured node as this + // Set the target of pointer event to the captured element as this // pointer is captured otherwise it would have gone to the if block // and perform a hit-test. - pointer_event_target.target_node = - pending_pointer_capture_target_.at(pointer_id)->ToNode(); + pointer_event_target.target_element = + pending_pointer_capture_target_.at(pointer_id); pointer_event_target.target_frame = - pointer_event_target.target_node->GetDocument().GetFrame(); + pointer_event_target.target_element->GetDocument().GetFrame(); } return pointer_event_target; } @@ -414,15 +409,15 @@ WebInputEventResult PointerEventManager::DispatchTouchPointerEvent( WebInputEvent::Type::kPointerCausedUaAction); WebInputEventResult result = WebInputEventResult::kHandledSystem; - if (pointer_event_target.target_node && pointer_event_target.target_frame && - !non_hovering_pointers_canceled_) { + if (pointer_event_target.target_element && + pointer_event_target.target_frame && !non_hovering_pointers_canceled_) { PointerEvent* pointer_event = pointer_event_factory_.Create( web_pointer_event, coalesced_events, predicted_events, - pointer_event_target.target_node - ? pointer_event_target.target_node->GetDocument().domWindow() + pointer_event_target.target_element + ? pointer_event_target.target_element->GetDocument().domWindow() : nullptr); - result = SendTouchPointerEvent(pointer_event_target.target_node, + result = SendTouchPointerEvent(pointer_event_target.target_element, pointer_event, web_pointer_event.hovering); // If a pointerdown has been canceled, queue the unique id to allow @@ -442,7 +437,7 @@ WebInputEventResult PointerEventManager::DispatchTouchPointerEvent( } WebInputEventResult PointerEventManager::SendTouchPointerEvent( - EventTarget* target, + Element* target, PointerEvent* pointer_event, bool hovering) { if (non_hovering_pointers_canceled_) @@ -516,7 +511,7 @@ WebInputEventResult PointerEventManager::HandlePointerEvent( } target = pointer_locked_element; } else { - target = ComputePointerEventTarget(event).target_node; + target = ComputePointerEventTarget(event).target_element; } PointerEvent* pointer_event = @@ -627,12 +622,13 @@ WebInputEventResult PointerEventManager::DirectDispatchMousePointerEvent( } WebInputEventResult PointerEventManager::SendMousePointerEvent( - Node* target, + Element* target, const String& canvas_region_id, const WebInputEvent::Type event_type, const WebMouseEvent& mouse_event, const Vector<WebMouseEvent>& coalesced_events, - const Vector<WebMouseEvent>& predicted_events) { + const Vector<WebMouseEvent>& predicted_events, + bool skip_click_dispatch) { DCHECK(event_type == WebInputEvent::kPointerDown || event_type == WebInputEvent::kPointerMove || event_type == WebInputEvent::kPointerUp); @@ -674,14 +670,14 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent( } } - EventTarget* pointer_event_target = ProcessCaptureAndPositionOfPointerEvent( + Element* pointer_event_target = ProcessCaptureAndPositionOfPointerEvent( pointer_event, target, canvas_region_id, &mouse_event); // Don't send fake mouse event to the DOM. if (fake_event) return WebInputEventResult::kHandledSuppressed; - EventTarget* effective_target = GetEffectiveTargetForPointerEvent( + Element* effective_target = GetEffectiveTargetForPointerEvent( pointer_event_target, pointer_event->pointerId()); if ((event_type == WebInputEvent::kPointerDown || @@ -706,27 +702,38 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent( mouse_event.pointer_type)] = true; } + // Only calculate mouse target if either mouse compatibility event or click + // should be sent. if (pointer_event->isPrimary() && - !prevent_mouse_event_for_pointer_type_[ToPointerTypeIndex( - mouse_event.pointer_type)]) { - EventTarget* mouse_target = effective_target; - // Event path could be null if pointer event is not dispatched and - // that happens for example when pointer event feature is not enabled. + (!prevent_mouse_event_for_pointer_type_[ToPointerTypeIndex( + mouse_event.pointer_type)] || + (!skip_click_dispatch && event_type == WebInputEvent::kPointerUp))) { + Element* mouse_target = effective_target; + // Event path could be null if the pointer event is not dispatched. if (!event_handling_util::IsInDocument(mouse_target) && pointer_event->HasEventPath()) { for (const auto& context : pointer_event->GetEventPath().NodeEventContexts()) { - if (event_handling_util::IsInDocument(&context.GetNode())) { - mouse_target = &context.GetNode(); + if (context.GetNode().IsElementNode() && + event_handling_util::IsInDocument(&context.GetNode())) { + mouse_target = ToElement(&context.GetNode()); break; } } } - result = event_handling_util::MergeEventResult( - result, - mouse_event_manager_->DispatchMouseEvent( - mouse_target, MouseEventNameForPointerEventInputType(event_type), - mouse_event, canvas_region_id, &last_mouse_position, nullptr)); + if (!prevent_mouse_event_for_pointer_type_[ToPointerTypeIndex( + mouse_event.pointer_type)]) { + result = event_handling_util::MergeEventResult( + result, + mouse_event_manager_->DispatchMouseEvent( + mouse_target, MouseEventNameForPointerEventInputType(event_type), + mouse_event, canvas_region_id, &last_mouse_position, nullptr)); + } + if (!skip_click_dispatch && mouse_target && + event_type == WebInputEvent::kPointerUp) { + mouse_event_manager_->DispatchMouseClickIfNeeded( + mouse_target, mouse_event, canvas_region_id); + } } if (pointer_event->type() == event_type_names::kPointerup || @@ -762,16 +769,16 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent( } bool PointerEventManager::GetPointerCaptureState( - int pointer_id, - EventTarget** pointer_capture_target, - EventTarget** pending_pointer_capture_target) { + PointerId pointer_id, + Element** pointer_capture_target, + Element** pending_pointer_capture_target) { PointerCapturingMap::const_iterator it; it = pointer_capture_target_.find(pointer_id); - EventTarget* pointer_capture_target_temp = + Element* pointer_capture_target_temp = (it != pointer_capture_target_.end()) ? it->value : nullptr; it = pending_pointer_capture_target_.find(pointer_id); - EventTarget* pending_pointercapture_target_temp = + Element* pending_pointercapture_target_temp = (it != pending_pointer_capture_target_.end()) ? it->value : nullptr; if (pointer_capture_target) @@ -782,33 +789,32 @@ bool PointerEventManager::GetPointerCaptureState( return pointer_capture_target_temp != pending_pointercapture_target_temp; } -EventTarget* PointerEventManager::ProcessCaptureAndPositionOfPointerEvent( +Element* PointerEventManager::ProcessCaptureAndPositionOfPointerEvent( PointerEvent* pointer_event, - EventTarget* hit_test_target, + Element* hit_test_target, const String& canvas_region_id, const WebMouseEvent* mouse_event) { ProcessPendingPointerCapture(pointer_event); PointerCapturingMap::const_iterator it = pointer_capture_target_.find(pointer_event->pointerId()); - if (EventTarget* pointercapture_target = + if (Element* pointercapture_target = (it != pointer_capture_target_.end()) ? it->value : nullptr) hit_test_target = pointercapture_target; - SetNodeUnderPointer(pointer_event, hit_test_target); + SetElementUnderPointer(pointer_event, hit_test_target); if (mouse_event) { - mouse_event_manager_->SetNodeUnderMouse( - hit_test_target ? hit_test_target->ToNode() : nullptr, canvas_region_id, - *mouse_event); + mouse_event_manager_->SetElementUnderMouse(hit_test_target, + canvas_region_id, *mouse_event); } return hit_test_target; } void PointerEventManager::ProcessPendingPointerCapture( PointerEvent* pointer_event) { - EventTarget* pointer_capture_target; - EventTarget* pending_pointer_capture_target; - const int pointer_id = pointer_event->pointerId(); + Element* pointer_capture_target; + Element* pending_pointer_capture_target; + const PointerId pointer_id = pointer_event->pointerId(); const bool is_capture_changed = GetPointerCaptureState( pointer_id, &pointer_capture_target, &pending_pointer_capture_target); @@ -821,8 +827,8 @@ void PointerEventManager::ProcessPendingPointerCapture( // Re-target lostpointercapture to the document when the element is // no longer participating in the tree. EventTarget* target = pointer_capture_target; - if (target->ToNode() && !target->ToNode()->isConnected()) { - target = target->ToNode()->ownerDocument(); + if (!pointer_capture_target->isConnected()) { + target = pointer_capture_target->ownerDocument(); } DispatchPointerEvent( target, pointer_event_factory_.CreatePointerCaptureEvent( @@ -830,7 +836,7 @@ void PointerEventManager::ProcessPendingPointerCapture( } if (pending_pointer_capture_target) { - SetNodeUnderPointer(pointer_event, pending_pointer_capture_target); + SetElementUnderPointer(pointer_event, pending_pointer_capture_target); DispatchPointerEvent( pending_pointer_capture_target, pointer_event_factory_.CreatePointerCaptureEvent( @@ -852,7 +858,7 @@ void PointerEventManager::ProcessPendingPointerCaptureForPointerLock( void PointerEventManager::RemoveTargetFromPointerCapturingMapping( PointerCapturingMap& map, - const EventTarget* target) { + const Element* target) { // We could have kept a reverse mapping to make this deletion possibly // faster but it adds some code complication which might not be worth of // the performance improvement considering there might not be a lot of @@ -864,28 +870,28 @@ void PointerEventManager::RemoveTargetFromPointerCapturingMapping( } } -EventTarget* PointerEventManager::GetCapturingNode(int pointer_id) { +Element* PointerEventManager::GetCapturingElement(PointerId pointer_id) { if (pointer_capture_target_.Contains(pointer_id)) return pointer_capture_target_.at(pointer_id); return nullptr; } void PointerEventManager::RemovePointer(PointerEvent* pointer_event) { - int pointer_id = pointer_event->pointerId(); + PointerId pointer_id = pointer_event->pointerId(); if (pointer_event_factory_.Remove(pointer_id)) { pending_pointer_capture_target_.erase(pointer_id); pointer_capture_target_.erase(pointer_id); - node_under_pointer_.erase(pointer_id); + element_under_pointer_.erase(pointer_id); } } -void PointerEventManager::ElementRemoved(EventTarget* target) { +void PointerEventManager::ElementRemoved(Element* target) { RemoveTargetFromPointerCapturingMapping(pending_pointer_capture_target_, target); } -void PointerEventManager::SetPointerCapture(int pointer_id, - EventTarget* target) { +void PointerEventManager::SetPointerCapture(PointerId pointer_id, + Element* target) { UseCounter::Count(frame_, WebFeature::kPointerEventSetCapture); if (pointer_event_factory_.IsActiveButtonsState(pointer_id)) { if (pointer_id != dispatching_pointer_id_) { @@ -896,8 +902,8 @@ void PointerEventManager::SetPointerCapture(int pointer_id, } } -void PointerEventManager::ReleasePointerCapture(int pointer_id, - EventTarget* target) { +void PointerEventManager::ReleasePointerCapture(PointerId pointer_id, + Element* target) { // Only the element that is going to get the next pointer event can release // the capture. Note that this might be different from // |m_pointercaptureTarget|. |m_pointercaptureTarget| holds the element @@ -913,22 +919,16 @@ void PointerEventManager::ReleaseMousePointerCapture() { ReleasePointerCapture(PointerEventFactory::kMouseId); } -bool PointerEventManager::HasPointerCapture(int pointer_id, - const EventTarget* target) const { +bool PointerEventManager::HasPointerCapture(PointerId pointer_id, + const Element* target) const { return pending_pointer_capture_target_.at(pointer_id) == target; } -bool PointerEventManager::HasProcessedPointerCapture( - int pointer_id, - const EventTarget* target) const { - return pointer_capture_target_.at(pointer_id) == target; -} - -void PointerEventManager::ReleasePointerCapture(int pointer_id) { +void PointerEventManager::ReleasePointerCapture(PointerId pointer_id) { pending_pointer_capture_target_.erase(pointer_id); } -bool PointerEventManager::IsActive(const int pointer_id) const { +bool PointerEventManager::IsActive(const PointerId pointer_id) const { return pointer_event_factory_.IsActive(pointer_id); } @@ -937,17 +937,17 @@ bool PointerEventManager::IsActive(const int pointer_id) const { // page managers to their target (event if target is in an iframe) and only // those managers will keep track of these pointer events. bool PointerEventManager::IsTouchPointerIdActiveOnFrame( - int pointer_id, + PointerId pointer_id, LocalFrame* frame) const { if (pointer_event_factory_.GetPointerType(pointer_id) != WebPointerProperties::PointerType::kTouch) return false; - Node* last_node_receiving_event = - node_under_pointer_.Contains(pointer_id) - ? node_under_pointer_.at(pointer_id).target->ToNode() + Element* last_element_receiving_event = + element_under_pointer_.Contains(pointer_id) + ? element_under_pointer_.at(pointer_id).target : nullptr; - return last_node_receiving_event && - last_node_receiving_event->GetDocument().GetFrame() == frame; + return last_element_receiving_event && + last_element_receiving_event->GetDocument().GetFrame() == frame; } bool PointerEventManager::IsAnyTouchActive() const { |