Index: third_party/WebKit/Source/core/input/EventHandler.cpp |
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp |
index 35cea31c489be6b23b08458ca07ff67809868d14..1d310088b319f7e41adeae92c293a44ae30039d9 100644 |
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp |
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp |
@@ -568,14 +568,13 @@ OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, |
} |
WebInputEventResult EventHandler::handleMousePressEvent( |
- const PlatformMouseEvent& mouseEvent) { |
+ const WebMouseEvent& mouseEvent) { |
TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); |
// For 4th/5th button in the mouse since Chrome does not yet send |
// button value to Blink but in some cases it does send the event. |
// This check is needed to suppress such an event (crbug.com/574959) |
- if (mouseEvent.pointerProperties().button == |
- WebPointerProperties::Button::NoButton) |
+ if (mouseEvent.button == WebPointerProperties::Button::NoButton) |
return WebInputEventResult::HandledSuppressed; |
if (m_eventHandlerWillResetCapturingMouseEventsNode) |
@@ -588,8 +587,8 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
HitTestRequest request(HitTestRequest::Active); |
// Save the document point we generate in case the window coordinate is |
// invalidated by what happens when we dispatch the event. |
- LayoutPoint documentPoint = |
- m_frame->view()->rootFrameToContents(mouseEvent.position()); |
+ LayoutPoint documentPoint = m_frame->view()->rootFrameToContents( |
+ flooredIntPoint(mouseEvent.positionInRootFrame())); |
MouseEventWithHitTestResults mev = |
m_frame->document()->performMouseEventHitTest(request, documentPoint, |
mouseEvent); |
@@ -642,7 +641,7 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
} |
} |
- m_mouseEventManager->setClickCount(mouseEvent.clickCount()); |
+ m_mouseEventManager->setClickCount(mouseEvent.clickCount); |
m_mouseEventManager->setClickNode( |
mev.innerNode()->isTextNode() |
? FlatTreeTraversal::parent(*mev.innerNode()) |
@@ -652,15 +651,16 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
m_frame->selection().setCaretBlinkingSuspended(true); |
WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( |
- EventTypeNames::mousedown, mev.innerNode(), mev.event(), |
- Vector<PlatformMouseEvent>()); |
+ EventTypeNames::mousedown, mev.innerNode(), mev.canvasRegionId(), |
+ mev.event(), Vector<WebMouseEvent>()); |
if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) { |
FrameView* view = m_frame->view(); |
PaintLayer* layer = mev.innerNode()->layoutObject() |
? mev.innerNode()->layoutObject()->enclosingLayer() |
: nullptr; |
- IntPoint p = view->rootFrameToContents(mouseEvent.position()); |
+ IntPoint p = view->rootFrameToContents( |
+ flooredIntPoint(mouseEvent.positionInRootFrame())); |
if (layer && layer->getScrollableArea() && |
layer->getScrollableArea()->isPointInResizeControl(p, |
ResizerForPointer)) { |
@@ -678,7 +678,7 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
HitTestResult hitTestResult = EventHandlingUtil::hitTestResultInFrame( |
m_frame, documentPoint, HitTestRequest::ReadOnly); |
InputDeviceCapabilities* sourceCapabilities = |
- mouseEvent.getSyntheticEventType() == PlatformMouseEvent::FromTouch |
+ mouseEvent.fromTouch() |
? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() |
: InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); |
if (eventResult == WebInputEventResult::NotHandled) { |
@@ -719,9 +719,8 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
} |
if (mev.hitTestResult().innerNode() && |
- mouseEvent.pointerProperties().button == |
- WebPointerProperties::Button::Left) { |
- ASSERT(mouseEvent.type() == PlatformEvent::MousePressed); |
+ mouseEvent.button == WebPointerProperties::Button::Left) { |
+ DCHECK_EQ(WebInputEvent::MouseDown, mouseEvent.type()); |
HitTestResult result = mev.hitTestResult(); |
result.setToShadowHostIfInUserAgentShadowRoot(); |
m_frame->chromeClient().onMouseDown(result.innerNode()); |
@@ -731,8 +730,8 @@ WebInputEventResult EventHandler::handleMousePressEvent( |
} |
WebInputEventResult EventHandler::handleMouseMoveEvent( |
- const PlatformMouseEvent& event, |
- const Vector<PlatformMouseEvent>& coalescedEvents) { |
+ const WebMouseEvent& event, |
+ const Vector<WebMouseEvent>& coalescedEvents) { |
TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); |
HitTestResult hoveredNode = HitTestResult(); |
@@ -759,16 +758,15 @@ WebInputEventResult EventHandler::handleMouseMoveEvent( |
return result; |
} |
-void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) { |
+void EventHandler::handleMouseLeaveEvent(const WebMouseEvent& event) { |
TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); |
- handleMouseMoveOrLeaveEvent(event, Vector<PlatformMouseEvent>(), 0, false, |
- true); |
+ handleMouseMoveOrLeaveEvent(event, Vector<WebMouseEvent>(), 0, false, true); |
} |
WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
- const PlatformMouseEvent& mouseEvent, |
- const Vector<PlatformMouseEvent>& coalescedEvents, |
+ const WebMouseEvent& mouseEvent, |
+ const Vector<WebMouseEvent>& coalescedEvents, |
HitTestResult* hoveredNode, |
bool onlyUpdateScrollbars, |
bool forceLeave) { |
@@ -784,9 +782,9 @@ WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
m_mouseEventManager->handleSvgPanIfNeeded(false); |
if (m_frameSetBeingResized) { |
- return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, |
- m_frameSetBeingResized.get(), |
- mouseEvent, coalescedEvents); |
+ return updatePointerTargetAndDispatchEvents( |
+ EventTypeNames::mousemove, m_frameSetBeingResized.get(), String(), |
+ mouseEvent, coalescedEvents); |
} |
// Send events right to a scrollbar if the mouse is pressed. |
@@ -862,7 +860,8 @@ WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
if (newSubframe) { |
// Update over/out state before passing the event to the subframe. |
m_pointerEventManager->sendMouseAndPointerBoundaryEvents( |
- updateMouseEventTargetNode(mev.innerNode()), mev.event()); |
+ updateMouseEventTargetNode(mev.innerNode()), mev.canvasRegionId(), |
+ mev.event()); |
// Event dispatch in sendMouseAndPointerBoundaryEvents may have caused the |
// subframe of the target node to be detached from its FrameView, in which |
@@ -891,7 +890,8 @@ WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
return eventResult; |
eventResult = updatePointerTargetAndDispatchEvents( |
- EventTypeNames::mousemove, mev.innerNode(), mev.event(), coalescedEvents); |
+ EventTypeNames::mousemove, mev.innerNode(), mev.canvasRegionId(), |
+ mev.event(), coalescedEvents); |
if (eventResult != WebInputEventResult::NotHandled) |
return eventResult; |
@@ -899,14 +899,13 @@ WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
} |
WebInputEventResult EventHandler::handleMouseReleaseEvent( |
- const PlatformMouseEvent& mouseEvent) { |
+ const WebMouseEvent& mouseEvent) { |
TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); |
// For 4th/5th button in the mouse since Chrome does not yet send |
// button value to Blink but in some cases it does send the event. |
// This check is needed to suppress such an event (crbug.com/574959) |
- if (mouseEvent.pointerProperties().button == |
- WebPointerProperties::Button::NoButton) |
+ if (mouseEvent.button == WebPointerProperties::Button::NoButton) |
return WebInputEventResult::HandledSuppressed; |
if (!mouseEvent.fromTouch()) |
@@ -924,7 +923,7 @@ WebInputEventResult EventHandler::handleMouseReleaseEvent( |
if (m_frameSetBeingResized) { |
return m_mouseEventManager->setMousePositionAndDispatchMouseEvent( |
- updateMouseEventTargetNode(m_frameSetBeingResized.get()), |
+ updateMouseEventTargetNode(m_frameSetBeingResized.get()), String(), |
EventTypeNames::mouseup, mouseEvent); |
} |
@@ -933,7 +932,7 @@ WebInputEventResult EventHandler::handleMouseReleaseEvent( |
m_lastScrollbarUnderMouse->mouseUp(mouseEvent); |
return updatePointerTargetAndDispatchEvents( |
EventTypeNames::mouseup, m_mouseEventManager->getNodeUnderMouse(), |
- mouseEvent, Vector<PlatformMouseEvent>()); |
+ String(), mouseEvent, Vector<WebMouseEvent>()); |
} |
// Mouse events simulated from touch should not hit-test again. |
@@ -971,8 +970,8 @@ WebInputEventResult EventHandler::handleMouseReleaseEvent( |
} |
WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( |
- EventTypeNames::mouseup, mev.innerNode(), mev.event(), |
- Vector<PlatformMouseEvent>()); |
+ EventTypeNames::mouseup, mev.innerNode(), mev.canvasRegionId(), |
+ mev.event(), Vector<WebMouseEvent>()); |
WebInputEventResult clickEventResult = |
m_mouseEventManager->dispatchMouseClickIfNeeded(mev); |
@@ -1044,7 +1043,7 @@ static bool findDropZone(Node* target, DataTransfer* dataTransfer) { |
} |
WebInputEventResult EventHandler::updateDragAndDrop( |
- const PlatformMouseEvent& event, |
+ const WebMouseEvent& event, |
DataTransfer* dataTransfer) { |
WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
@@ -1062,9 +1061,11 @@ WebInputEventResult EventHandler::updateDragAndDrop( |
newTarget = FlatTreeTraversal::parent(*newTarget); |
if (AutoscrollController* controller = |
- m_scrollManager->autoscrollController()) |
- controller->updateDragAndDrop(newTarget, event.position(), |
- event.timestamp()); |
+ m_scrollManager->autoscrollController()) { |
+ controller->updateDragAndDrop( |
+ newTarget, flooredIntPoint(event.positionInRootFrame()), |
+ TimeTicks::FromSeconds(event.timeStampSeconds())); |
+ } |
if (m_dragTarget != newTarget) { |
// FIXME: this ordering was explicitly chosen to match WinIE. However, |
@@ -1137,7 +1138,7 @@ WebInputEventResult EventHandler::updateDragAndDrop( |
return eventResult; |
} |
-void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, |
+void EventHandler::cancelDragAndDrop(const WebMouseEvent& event, |
DataTransfer* dataTransfer) { |
LocalFrame* targetFrame; |
if (targetIsFrame(m_dragTarget.get(), targetFrame)) { |
@@ -1153,7 +1154,7 @@ void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, |
} |
WebInputEventResult EventHandler::performDragAndDrop( |
- const PlatformMouseEvent& event, |
+ const WebMouseEvent& event, |
DataTransfer* dataTransfer) { |
LocalFrame* targetFrame; |
WebInputEventResult result = WebInputEventResult::NotHandled; |
@@ -1256,15 +1257,16 @@ void EventHandler::elementRemoved(EventTarget* target) { |
WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents( |
const AtomicString& mouseEventType, |
Node* targetNode, |
- const PlatformMouseEvent& mouseEvent, |
- const Vector<PlatformMouseEvent>& coalescedEvents) { |
+ const String& canvasRegionId, |
+ const WebMouseEvent& mouseEvent, |
+ const Vector<WebMouseEvent>& coalescedEvents) { |
ASSERT(mouseEventType == EventTypeNames::mousedown || |
mouseEventType == EventTypeNames::mousemove || |
mouseEventType == EventTypeNames::mouseup); |
const auto& eventResult = m_pointerEventManager->sendMousePointerEvent( |
- updateMouseEventTargetNode(targetNode), mouseEventType, mouseEvent, |
- coalescedEvents); |
+ updateMouseEventTargetNode(targetNode), canvasRegionId, mouseEventType, |
+ mouseEvent, coalescedEvents); |
return eventResult; |
} |
@@ -1617,33 +1619,33 @@ void EventHandler::updateGestureTargetNodeForMouseEvent( |
const WebGestureEvent& gestureEvent = targetedEvent.event(); |
unsigned modifiers = gestureEvent.modifiers(); |
- PlatformMouseEvent fakeMouseMove( |
- gestureEvent, WebPointerProperties::Button::NoButton, |
- PlatformEvent::MouseMoved, |
- /* clickCount */ 0, static_cast<PlatformEvent::Modifiers>(modifiers), |
- PlatformMouseEvent::FromTouch, |
- TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), |
- WebPointerProperties::PointerType::Mouse); |
+ WebMouseEvent fakeMouseMove( |
+ WebInputEvent::MouseMove, gestureEvent, |
+ WebPointerProperties::Button::NoButton, |
+ /* clickCount */ 0, |
+ modifiers | WebInputEvent::Modifiers::IsCompatibilityEventForTouch, |
+ gestureEvent.timeStampSeconds()); |
// Update the mouseout/mouseleave event |
size_t indexExitedFrameChain = exitedFrameChain.size(); |
while (indexExitedFrameChain) { |
LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; |
leaveFrame->eventHandler().m_mouseEventManager->setNodeUnderMouse( |
- updateMouseEventTargetNode(nullptr), fakeMouseMove); |
+ updateMouseEventTargetNode(nullptr), String(), fakeMouseMove); |
} |
// update the mouseover/mouseenter event |
while (indexEnteredFrameChain) { |
Frame* parentFrame = |
enteredFrameChain[--indexEnteredFrameChain]->tree().parent(); |
- if (parentFrame && parentFrame->isLocalFrame()) |
+ if (parentFrame && parentFrame->isLocalFrame()) { |
toLocalFrame(parentFrame) |
->eventHandler() |
.m_mouseEventManager->setNodeUnderMouse( |
updateMouseEventTargetNode(toHTMLFrameOwnerElement( |
enteredFrameChain[indexEnteredFrameChain]->owner())), |
- fakeMouseMove); |
+ String(), fakeMouseMove); |
+ } |
} |
} |
@@ -1782,7 +1784,7 @@ void EventHandler::applyTouchAdjustment(WebGestureEvent* gestureEvent, |
} |
WebInputEventResult EventHandler::sendContextMenuEvent( |
- const PlatformMouseEvent& event, |
+ const WebMouseEvent& event, |
Node* overrideTargetNode) { |
FrameView* v = m_frame->view(); |
if (!v) |
@@ -1791,7 +1793,8 @@ WebInputEventResult EventHandler::sendContextMenuEvent( |
// Clear mouse press state to avoid initiating a drag while context menu is |
// up. |
m_mouseEventManager->setMousePressed(false); |
- LayoutPoint positionInContents = v->rootFrameToContents(event.position()); |
+ LayoutPoint positionInContents = |
+ v->rootFrameToContents(flooredIntPoint(event.positionInRootFrame())); |
HitTestRequest request(HitTestRequest::Active); |
MouseEventWithHitTestResults mev = |
m_frame->document()->performMouseEventHitTest(request, positionInContents, |
@@ -1806,7 +1809,7 @@ WebInputEventResult EventHandler::sendContextMenuEvent( |
Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode(); |
return m_mouseEventManager->dispatchMouseEvent( |
updateMouseEventTargetNode(targetNode), EventTypeNames::contextmenu, |
- event, 0); |
+ event, mev.hitTestResult().canvasRegionId(), 0); |
} |
WebInputEventResult EventHandler::sendContextMenuEventForKey( |
@@ -1883,15 +1886,20 @@ WebInputEventResult EventHandler::sendContextMenuEventForKey( |
// The contextmenu event is a mouse event even when invoked using the |
// keyboard. This is required for web compatibility. |
- PlatformEvent::EventType eventType = PlatformEvent::MousePressed; |
+ WebInputEvent::Type eventType = WebInputEvent::MouseDown; |
if (m_frame->settings() && m_frame->settings()->getShowContextMenuOnMouseUp()) |
- eventType = PlatformEvent::MouseReleased; |
+ eventType = WebInputEvent::MouseUp; |
+ |
+ WebMouseEvent mouseEvent( |
+ eventType, |
+ WebFloatPoint(locationInRootFrame.x(), locationInRootFrame.y()), |
+ WebFloatPoint(globalPosition.x(), globalPosition.y()), |
+ WebPointerProperties::Button::NoButton, /* clickCount */ 0, |
+ PlatformEvent::NoModifiers, TimeTicks::Now().InSeconds()); |
- PlatformMouseEvent mouseEvent( |
- locationInRootFrame, globalPosition, |
- WebPointerProperties::Button::NoButton, eventType, /* clickCount */ 0, |
- PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistinguishable, |
- TimeTicks::Now(), WebPointerProperties::PointerType::Mouse); |
+ // TODO(dtapuska): Transition the mouseEvent to be created really in viewport |
+ // coordinates instead of root frame coordinates. |
+ mouseEvent.setFrameScale(1); |
return sendContextMenuEvent(mouseEvent, overrideTargetElement); |
} |
@@ -1987,7 +1995,7 @@ void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) { |
event, m_mouseEventManager->mousePressNode()); |
} |
-void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, |
+void EventHandler::dragSourceEndedAt(const WebMouseEvent& event, |
DragOperation operation) { |
// Asides from routing the event to the correct frame, the hit test is also an |
// opportunity for Layer to update the :hover and :active pseudoclasses. |
@@ -2100,7 +2108,7 @@ WebInputEventResult EventHandler::passMousePressEventToSubframe( |
WebInputEventResult EventHandler::passMouseMoveEventToSubframe( |
MouseEventWithHitTestResults& mev, |
- const Vector<PlatformMouseEvent>& coalescedEvents, |
+ const Vector<WebMouseEvent>& coalescedEvents, |
LocalFrame* subframe, |
HitTestResult* hoveredNode) { |
if (m_mouseEventManager->mouseDownMayStartDrag()) |