summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/input/pointer_event_manager.cc
diff options
context:
space:
mode:
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.cc148
1 files changed, 89 insertions, 59 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 2c3f634f0ff..fffde3296b6 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
@@ -41,11 +41,11 @@ const AtomicString& MouseEventNameForPointerEventInputType(
const WebInputEvent::Type& event_type) {
switch (event_type) {
case WebInputEvent::Type::kPointerDown:
- return EventTypeNames::mousedown;
+ return event_type_names::kMousedown;
case WebInputEvent::Type::kPointerUp:
- return EventTypeNames::mouseup;
+ return event_type_names::kMouseup;
case WebInputEvent::Type::kPointerMove:
- return EventTypeNames::mousemove;
+ return event_type_names::kMousemove;
default:
NOTREACHED();
return g_empty_atom;
@@ -65,7 +65,7 @@ Element* GetPointerLockedElement(LocalFrame* frame) {
PointerEventManager::PointerEventManager(LocalFrame& frame,
MouseEventManager& mouse_event_manager)
: frame_(frame),
- touch_event_manager_(new TouchEventManager(frame)),
+ touch_event_manager_(MakeGarbageCollected<TouchEventManager>(frame)),
mouse_event_manager_(mouse_event_manager) {
Clear();
}
@@ -103,20 +103,20 @@ PointerEventManager::PointerEventBoundaryEventDispatcher::
void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOut(
EventTarget* target,
EventTarget* related_target) {
- Dispatch(target, related_target, EventTypeNames::pointerout, false);
+ Dispatch(target, related_target, event_type_names::kPointerout, false);
}
void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOver(
EventTarget* target,
EventTarget* related_target) {
- Dispatch(target, related_target, EventTypeNames::pointerover, false);
+ Dispatch(target, related_target, event_type_names::kPointerover, false);
}
void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchLeave(
EventTarget* target,
EventTarget* related_target,
bool check_for_listener) {
- Dispatch(target, related_target, EventTypeNames::pointerleave,
+ Dispatch(target, related_target, event_type_names::kPointerleave,
check_for_listener);
}
@@ -124,18 +124,18 @@ void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchEnter(
EventTarget* target,
EventTarget* related_target,
bool check_for_listener) {
- Dispatch(target, related_target, EventTypeNames::pointerenter,
+ Dispatch(target, related_target, event_type_names::kPointerenter,
check_for_listener);
}
AtomicString
PointerEventManager::PointerEventBoundaryEventDispatcher::GetLeaveEvent() {
- return EventTypeNames::pointerleave;
+ return event_type_names::kPointerleave;
}
AtomicString
PointerEventManager::PointerEventBoundaryEventDispatcher::GetEnterEvent() {
- return EventTypeNames::pointerenter;
+ return event_type_names::kPointerenter;
}
void PointerEventManager::PointerEventBoundaryEventDispatcher::Dispatch(
@@ -163,7 +163,7 @@ WebInputEventResult PointerEventManager::DispatchPointerEvent(
if (!frame_ || !HasPointerEventListener(frame_->GetEventHandlerRegistry()))
return WebInputEventResult::kNotHandled;
- if (event_type == EventTypeNames::pointerdown) {
+ if (event_type == event_type_names::kPointerdown) {
Node* node = target->ToNode();
if (node && IsHTMLCanvasElement(*node) &&
ToHTMLCanvasElement(*node).NeedsUnbufferedInputEvents()) {
@@ -173,13 +173,13 @@ WebInputEventResult PointerEventManager::DispatchPointerEvent(
if (!check_for_listener || target->HasEventListeners(event_type)) {
UseCounter::Count(frame_, WebFeature::kPointerEventDispatch);
- if (event_type == EventTypeNames::pointerdown)
+ if (event_type == event_type_names::kPointerdown)
UseCounter::Count(frame_, WebFeature::kPointerEventDispatchPointerDown);
DCHECK(!dispatching_pointer_id_);
base::AutoReset<int> dispatch_holder(&dispatching_pointer_id_, pointer_id);
DispatchEventResult dispatch_result = target->DispatchEvent(*pointer_event);
- return EventHandlingUtil::ToWebInputEventResult(dispatch_result);
+ return event_handling_util::ToWebInputEventResult(dispatch_result);
}
return WebInputEventResult::kNotHandled;
}
@@ -202,7 +202,7 @@ void PointerEventManager::SendMouseAndPointerBoundaryEvents(
const WebPointerEvent web_pointer_event(WebInputEvent::kPointerMove,
mouse_event);
PointerEvent* dummy_pointer_event = pointer_event_factory_.Create(
- web_pointer_event, Vector<WebPointerEvent>(),
+ web_pointer_event, Vector<WebPointerEvent>(), Vector<WebPointerEvent>(),
frame_->GetDocument()->domWindow());
// TODO(crbug/545647): This state should reset with pointercancel too.
@@ -353,10 +353,10 @@ void PointerEventManager::AdjustTouchPointerEvent(
pointer_event.unique_touch_event_id, pointer_event.PositionInWidget());
}
-EventHandlingUtil::PointerEventTarget
+event_handling_util::PointerEventTarget
PointerEventManager::ComputePointerEventTarget(
const WebPointerEvent& web_pointer_event) {
- EventHandlingUtil::PointerEventTarget pointer_event_target;
+ event_handling_util::PointerEventTarget pointer_event_target;
int pointer_id = pointer_event_factory_.GetPointerEventId(web_pointer_event);
// Do the hit test either when the touch first starts or when the touch
@@ -408,7 +408,8 @@ PointerEventManager::ComputePointerEventTarget(
WebInputEventResult PointerEventManager::DispatchTouchPointerEvent(
const WebPointerEvent& web_pointer_event,
const Vector<WebPointerEvent>& coalesced_events,
- const EventHandlingUtil::PointerEventTarget& pointer_event_target) {
+ const Vector<WebPointerEvent>& predicted_events,
+ const event_handling_util::PointerEventTarget& pointer_event_target) {
DCHECK_NE(web_pointer_event.GetType(),
WebInputEvent::Type::kPointerCausedUaAction);
@@ -416,7 +417,7 @@ WebInputEventResult PointerEventManager::DispatchTouchPointerEvent(
if (pointer_event_target.target_node && pointer_event_target.target_frame &&
!non_hovering_pointers_canceled_) {
PointerEvent* pointer_event = pointer_event_factory_.Create(
- web_pointer_event, coalesced_events,
+ web_pointer_event, coalesced_events, predicted_events,
pointer_event_target.target_node
? pointer_event_target.target_node->GetDocument().domWindow()
: nullptr);
@@ -431,7 +432,7 @@ WebInputEventResult PointerEventManager::DispatchTouchPointerEvent(
// primary pointers.
// TODO(mustaq): What about other cases (e.g. GestureTwoFingerTap)?
if (result != WebInputEventResult::kNotHandled &&
- pointer_event->type() == EventTypeNames::pointerdown &&
+ pointer_event->type() == event_type_names::kPointerdown &&
pointer_event->isPrimary()) {
touch_ids_for_canceled_pointerdowns_.push_back(
web_pointer_event.unique_touch_event_id);
@@ -450,15 +451,15 @@ WebInputEventResult PointerEventManager::SendTouchPointerEvent(
ProcessCaptureAndPositionOfPointerEvent(pointer_event, target);
// Setting the implicit capture for touch
- if (pointer_event->type() == EventTypeNames::pointerdown)
+ if (pointer_event->type() == event_type_names::kPointerdown)
SetPointerCapture(pointer_event->pointerId(), target);
WebInputEventResult result = DispatchPointerEvent(
GetEffectiveTargetForPointerEvent(target, pointer_event->pointerId()),
pointer_event);
- if (pointer_event->type() == EventTypeNames::pointerup ||
- pointer_event->type() == EventTypeNames::pointercancel) {
+ if (pointer_event->type() == event_type_names::kPointerup ||
+ pointer_event->type() == event_type_names::kPointercancel) {
ReleasePointerCapture(pointer_event->pointerId());
// If the pointer is not hovering it implies that pointerup also means
@@ -484,7 +485,8 @@ WebInputEventResult PointerEventManager::FlushEvents() {
WebInputEventResult PointerEventManager::HandlePointerEvent(
const WebPointerEvent& event,
- const Vector<WebPointerEvent>& coalesced_events) {
+ const Vector<WebPointerEvent>& coalesced_events,
+ const Vector<WebPointerEvent>& predicted_events) {
if (event.GetType() == WebInputEvent::Type::kPointerRawMove) {
if (!RuntimeEnabledFeatures::PointerRawMoveEnabled() ||
!frame_->GetEventHandlerRegistry().HasEventHandlers(
@@ -508,8 +510,8 @@ WebInputEventResult PointerEventManager::HandlePointerEvent(
if (!target_frame)
return WebInputEventResult::kHandledSystem;
if (target_frame != frame_) {
- target_frame->GetEventHandler().HandlePointerEvent(event,
- coalesced_events);
+ target_frame->GetEventHandler().HandlePointerEvent(
+ event, coalesced_events, predicted_events);
return WebInputEventResult::kHandledSystem;
}
target = pointer_locked_element;
@@ -517,8 +519,9 @@ WebInputEventResult PointerEventManager::HandlePointerEvent(
target = ComputePointerEventTarget(event).target_node;
}
- PointerEvent* pointer_event = pointer_event_factory_.Create(
- event, coalesced_events, frame_->GetDocument()->domWindow());
+ PointerEvent* pointer_event =
+ pointer_event_factory_.Create(event, coalesced_events, predicted_events,
+ frame_->GetDocument()->domWindow());
DispatchPointerEvent(target, pointer_event);
return WebInputEventResult::kHandledSystem;
}
@@ -540,7 +543,7 @@ WebInputEventResult PointerEventManager::HandlePointerEvent(
WebPointerEvent pointer_event = event.WebPointerEventInRootFrame();
if (ShouldAdjustPointerEvent(event))
AdjustTouchPointerEvent(pointer_event);
- EventHandlingUtil::PointerEventTarget pointer_event_target =
+ event_handling_util::PointerEventTarget pointer_event_target =
ComputePointerEventTarget(pointer_event);
// Any finger lifting is a user gesture only when it wasn't associated with a
@@ -557,8 +560,8 @@ WebInputEventResult PointerEventManager::HandlePointerEvent(
LocalFrame::NotifyUserActivation(pointer_event_target.target_frame);
}
- WebInputEventResult result =
- DispatchTouchPointerEvent(event, coalesced_events, pointer_event_target);
+ WebInputEventResult result = DispatchTouchPointerEvent(
+ event, coalesced_events, predicted_events, pointer_event_target);
touch_event_manager_->HandleTouchPoint(event, coalesced_events,
pointer_event_target);
@@ -570,15 +573,16 @@ WebInputEventResult PointerEventManager::CreateAndDispatchPointerEvent(
Node* target,
const AtomicString& mouse_event_name,
const WebMouseEvent& mouse_event,
- const Vector<WebMouseEvent>& coalesced_events) {
+ const Vector<WebMouseEvent>& coalesced_events,
+ const Vector<WebMouseEvent>& predicted_events) {
WebInputEvent::Type event_type;
// TODO(crbug.com/665924): The following ifs skip the mouseover/leave cases,
// we should fixed them when further merge the code path.
- if (mouse_event_name == EventTypeNames::mousemove)
+ if (mouse_event_name == event_type_names::kMousemove)
event_type = WebInputEvent::kPointerMove;
- else if (mouse_event_name == EventTypeNames::mousedown)
+ else if (mouse_event_name == event_type_names::kMousedown)
event_type = WebInputEvent::kPointerDown;
- else if (mouse_event_name == EventTypeNames::mouseup)
+ else if (mouse_event_name == event_type_names::kMouseup)
event_type = WebInputEvent::kPointerUp;
else
return WebInputEventResult::kNotHandled;
@@ -587,10 +591,13 @@ WebInputEventResult PointerEventManager::CreateAndDispatchPointerEvent(
Vector<WebPointerEvent> pointer_coalesced_events;
for (const WebMouseEvent& e : coalesced_events)
pointer_coalesced_events.push_back(WebPointerEvent(event_type, e));
+ Vector<WebPointerEvent> pointer_predicted_events;
+ for (const WebMouseEvent& e : predicted_events)
+ pointer_predicted_events.push_back(WebPointerEvent(event_type, e));
- PointerEvent* pointer_event =
- pointer_event_factory_.Create(web_pointer_event, pointer_coalesced_events,
- target->GetDocument().domWindow());
+ PointerEvent* pointer_event = pointer_event_factory_.Create(
+ web_pointer_event, pointer_coalesced_events, pointer_predicted_events,
+ target->GetDocument().domWindow());
return DispatchPointerEvent(target, pointer_event);
}
@@ -601,13 +608,20 @@ WebInputEventResult PointerEventManager::DirectDispatchMousePointerEvent(
const WebMouseEvent& event,
const AtomicString& mouse_event_type,
const Vector<WebMouseEvent>& coalesced_events,
+ const Vector<WebMouseEvent>& predicted_events,
const String& canvas_region_id) {
+ // Fetch the last_mouse_position for creating MouseEvent before
+ // pointer_event_factory updates it.
+ FloatPoint last_mouse_position =
+ pointer_event_factory_.GetLastPointerPosition(
+ PointerEventFactory::kMouseId, event);
WebInputEventResult result = CreateAndDispatchPointerEvent(
- target, mouse_event_type, event, coalesced_events);
+ target, mouse_event_type, event, coalesced_events, predicted_events);
- result = EventHandlingUtil::MergeEventResult(
+ result = event_handling_util::MergeEventResult(
result, mouse_event_manager_->DispatchMouseEvent(
- target, mouse_event_type, event, canvas_region_id, nullptr));
+ target, mouse_event_type, event, canvas_region_id,
+ &last_mouse_position, nullptr));
return result;
}
@@ -617,7 +631,8 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent(
const String& canvas_region_id,
const WebInputEvent::Type event_type,
const WebMouseEvent& mouse_event,
- const Vector<WebMouseEvent>& coalesced_events) {
+ const Vector<WebMouseEvent>& coalesced_events,
+ const Vector<WebMouseEvent>& predicted_events) {
DCHECK(event_type == WebInputEvent::kPointerDown ||
event_type == WebInputEvent::kPointerMove ||
event_type == WebInputEvent::kPointerUp);
@@ -626,10 +641,19 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent(
Vector<WebPointerEvent> pointer_coalesced_events;
for (const WebMouseEvent& e : coalesced_events)
pointer_coalesced_events.push_back(WebPointerEvent(event_type, e));
+ Vector<WebPointerEvent> pointer_predicted_events;
+ for (const WebMouseEvent& e : predicted_events)
+ pointer_predicted_events.push_back(WebPointerEvent(event_type, e));
- PointerEvent* pointer_event =
- pointer_event_factory_.Create(web_pointer_event, pointer_coalesced_events,
- frame_->GetDocument()->domWindow());
+ // Fetch the last_mouse_position for creating MouseEvent before
+ // pointer_event_factory updates it.
+ FloatPoint last_mouse_position =
+ pointer_event_factory_.GetLastPointerPosition(
+ PointerEventFactory::kMouseId, mouse_event);
+
+ PointerEvent* pointer_event = pointer_event_factory_.Create(
+ web_pointer_event, pointer_coalesced_events, pointer_predicted_events,
+ frame_->GetDocument()->domWindow());
bool fake_event = (web_pointer_event.GetModifiers() &
WebInputEvent::Modifiers::kRelativeMotionEvent);
@@ -662,7 +686,7 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent(
if ((event_type == WebInputEvent::kPointerDown ||
event_type == WebInputEvent::kPointerUp) &&
- pointer_event->type() == EventTypeNames::pointermove &&
+ pointer_event->type() == event_type_names::kPointermove &&
RuntimeEnabledFeatures::PointerRawMoveEnabled() &&
frame_->GetEventHandlerRegistry().HasEventHandlers(
EventHandlerRegistry::kPointerRawMoveEvent)) {
@@ -676,7 +700,7 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent(
DispatchPointerEvent(effective_target, pointer_event);
if (result != WebInputEventResult::kNotHandled &&
- pointer_event->type() == EventTypeNames::pointerdown &&
+ pointer_event->type() == event_type_names::kPointerdown &&
pointer_event->isPrimary()) {
prevent_mouse_event_for_pointer_type_[ToPointerTypeIndex(
mouse_event.pointer_type)] = true;
@@ -688,29 +712,29 @@ WebInputEventResult PointerEventManager::SendMousePointerEvent(
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.
- if (!EventHandlingUtil::IsInDocument(mouse_target) &&
+ if (!event_handling_util::IsInDocument(mouse_target) &&
pointer_event->HasEventPath()) {
for (const auto& context :
pointer_event->GetEventPath().NodeEventContexts()) {
- if (EventHandlingUtil::IsInDocument(context.GetNode())) {
- mouse_target = context.GetNode();
+ if (event_handling_util::IsInDocument(&context.GetNode())) {
+ mouse_target = &context.GetNode();
break;
}
}
}
- result = EventHandlingUtil::MergeEventResult(
+ result = event_handling_util::MergeEventResult(
result,
mouse_event_manager_->DispatchMouseEvent(
mouse_target, MouseEventNameForPointerEventInputType(event_type),
- mouse_event, canvas_region_id, nullptr));
+ mouse_event, canvas_region_id, &last_mouse_position, nullptr));
}
- if (pointer_event->type() == EventTypeNames::pointerup ||
- pointer_event->type() == EventTypeNames::pointercancel) {
+ if (pointer_event->type() == event_type_names::kPointerup ||
+ pointer_event->type() == event_type_names::kPointercancel) {
ReleasePointerCapture(pointer_event->pointerId());
// Send got/lostpointercapture rightaway if necessary.
- if (pointer_event->type() == EventTypeNames::pointerup) {
+ if (pointer_event->type() == event_type_names::kPointerup) {
// If pointerup releases the capture we also send boundary events
// rightaway when the pointer that supports hover. The following function
// does nothing when there was no capture to begin with in the first
@@ -802,14 +826,15 @@ void PointerEventManager::ProcessPendingPointerCapture(
}
DispatchPointerEvent(
target, pointer_event_factory_.CreatePointerCaptureEvent(
- pointer_event, EventTypeNames::lostpointercapture));
+ pointer_event, event_type_names::kLostpointercapture));
}
if (pending_pointer_capture_target) {
SetNodeUnderPointer(pointer_event, pending_pointer_capture_target);
- DispatchPointerEvent(pending_pointer_capture_target,
- pointer_event_factory_.CreatePointerCaptureEvent(
- pointer_event, EventTypeNames::gotpointercapture));
+ DispatchPointerEvent(
+ pending_pointer_capture_target,
+ pointer_event_factory_.CreatePointerCaptureEvent(
+ pointer_event, event_type_names::kGotpointercapture));
pointer_capture_target_.Set(pointer_id, pending_pointer_capture_target);
} else {
pointer_capture_target_.erase(pointer_id);
@@ -820,7 +845,8 @@ void PointerEventManager::ProcessPendingPointerCaptureForPointerLock(
const WebMouseEvent& mouse_event) {
PointerEvent* pointer_event = pointer_event_factory_.Create(
WebPointerEvent(WebInputEvent::kPointerMove, mouse_event),
- Vector<WebPointerEvent>(), frame_->GetDocument()->domWindow());
+ Vector<WebPointerEvent>(), Vector<WebPointerEvent>(),
+ frame_->GetDocument()->domWindow());
ProcessPendingPointerCapture(pointer_event);
}
@@ -944,4 +970,8 @@ bool PointerEventManager::PrimaryPointerdownCanceled(
return false;
}
+void PointerEventManager::RemoveLastMousePosition() {
+ pointer_event_factory_.RemoveLastPosition(PointerEventFactory::kMouseId);
+}
+
} // namespace blink