Index: third_party/WebKit/Source/core/input/MouseEventManager.cpp |
diff --git a/third_party/WebKit/Source/core/input/MouseEventManager.cpp b/third_party/WebKit/Source/core/input/MouseEventManager.cpp |
index bb2943116f4784d1693ddff9ccce864dc8ca6d5a..aaca3de4a6922a173bbbca8e925282d38145c232 100644 |
--- a/third_party/WebKit/Source/core/input/MouseEventManager.cpp |
+++ b/third_party/WebKit/Source/core/input/MouseEventManager.cpp |
@@ -35,25 +35,21 @@ namespace blink { |
namespace { |
-PlatformMouseEvent mouseEventWithRegion(Node* node, |
- const PlatformMouseEvent& mouseEvent) { |
+String canvasRegionId(Node* node, const WebMouseEvent& mouseEvent) { |
if (!node->isElementNode()) |
- return mouseEvent; |
+ return String(); |
Element* element = toElement(node); |
if (!element->isInCanvasSubtree()) |
- return mouseEvent; |
+ return String(); |
HTMLCanvasElement* canvas = |
Traversal<HTMLCanvasElement>::firstAncestorOrSelf(*element); |
// In this case, the event target is canvas and mouse rerouting doesn't |
// happen. |
if (canvas == element) |
- return mouseEvent; |
- String region = canvas->getIdFromControl(element); |
- PlatformMouseEvent newMouseEvent = mouseEvent; |
- newMouseEvent.setRegion(region); |
- return newMouseEvent; |
+ return String(); |
+ return canvas->getIdFromControl(element); |
} |
// The amount of time to wait before sending a fake mouse event triggered |
@@ -100,7 +96,7 @@ void MouseEventManager::clear() { |
m_clickNode = nullptr; |
m_mouseDownPos = IntPoint(); |
m_mouseDownTimestamp = TimeTicks(); |
- m_mouseDown = PlatformMouseEvent(); |
+ m_mouseDown = WebMouseEvent(); |
m_svgPan = false; |
m_dragStartPos = LayoutPoint(); |
m_fakeMouseMoveEventTimer.stop(); |
@@ -118,46 +114,45 @@ DEFINE_TRACE(MouseEventManager) { |
} |
MouseEventManager::MouseEventBoundaryEventDispatcher:: |
- MouseEventBoundaryEventDispatcher( |
- MouseEventManager* mouseEventManager, |
- const PlatformMouseEvent* platformMouseEvent, |
- EventTarget* exitedTarget) |
+ MouseEventBoundaryEventDispatcher(MouseEventManager* mouseEventManager, |
+ const WebMouseEvent* webMouseEvent, |
+ EventTarget* exitedTarget, |
+ const String& canvasRegionId) |
: m_mouseEventManager(mouseEventManager), |
- m_platformMouseEvent(platformMouseEvent), |
- m_exitedTarget(exitedTarget) {} |
+ m_webMouseEvent(webMouseEvent), |
+ m_exitedTarget(exitedTarget), |
+ m_canvasRegionId(canvasRegionId) {} |
void MouseEventManager::MouseEventBoundaryEventDispatcher::dispatchOut( |
EventTarget* target, |
EventTarget* relatedTarget) { |
- dispatch( |
- target, relatedTarget, EventTypeNames::mouseout, |
- mouseEventWithRegion(m_exitedTarget->toNode(), *m_platformMouseEvent), |
- false); |
+ dispatch(target, relatedTarget, EventTypeNames::mouseout, |
+ canvasRegionId(m_exitedTarget->toNode(), *m_webMouseEvent), |
+ *m_webMouseEvent, false); |
} |
void MouseEventManager::MouseEventBoundaryEventDispatcher::dispatchOver( |
EventTarget* target, |
EventTarget* relatedTarget) { |
- dispatch(target, relatedTarget, EventTypeNames::mouseover, |
- *m_platformMouseEvent, false); |
+ dispatch(target, relatedTarget, EventTypeNames::mouseover, m_canvasRegionId, |
+ *m_webMouseEvent, false); |
} |
void MouseEventManager::MouseEventBoundaryEventDispatcher::dispatchLeave( |
EventTarget* target, |
EventTarget* relatedTarget, |
bool checkForListener) { |
- dispatch( |
- target, relatedTarget, EventTypeNames::mouseleave, |
- mouseEventWithRegion(m_exitedTarget->toNode(), *m_platformMouseEvent), |
- checkForListener); |
+ dispatch(target, relatedTarget, EventTypeNames::mouseleave, |
+ canvasRegionId(m_exitedTarget->toNode(), *m_webMouseEvent), |
+ *m_webMouseEvent, checkForListener); |
} |
void MouseEventManager::MouseEventBoundaryEventDispatcher::dispatchEnter( |
EventTarget* target, |
EventTarget* relatedTarget, |
bool checkForListener) { |
- dispatch(target, relatedTarget, EventTypeNames::mouseenter, |
- *m_platformMouseEvent, checkForListener); |
+ dispatch(target, relatedTarget, EventTypeNames::mouseenter, m_canvasRegionId, |
+ *m_webMouseEvent, checkForListener); |
} |
AtomicString |
@@ -174,25 +169,28 @@ void MouseEventManager::MouseEventBoundaryEventDispatcher::dispatch( |
EventTarget* target, |
EventTarget* relatedTarget, |
const AtomicString& type, |
- const PlatformMouseEvent& platformMouseEvent, |
+ const String& canvasRegionId, |
+ const WebMouseEvent& webMouseEvent, |
bool checkForListener) { |
- m_mouseEventManager->dispatchMouseEvent(target, type, platformMouseEvent, |
- relatedTarget, checkForListener); |
+ m_mouseEventManager->dispatchMouseEvent(target, type, webMouseEvent, |
+ canvasRegionId, relatedTarget, |
+ checkForListener); |
} |
-void MouseEventManager::sendBoundaryEvents( |
- EventTarget* exitedTarget, |
- EventTarget* enteredTarget, |
- const PlatformMouseEvent& mousePlatformEvent) { |
+void MouseEventManager::sendBoundaryEvents(EventTarget* exitedTarget, |
+ EventTarget* enteredTarget, |
+ const String& canvasRegionId, |
+ const WebMouseEvent& mouseEvent) { |
MouseEventBoundaryEventDispatcher boundaryEventDispatcher( |
- this, &mousePlatformEvent, exitedTarget); |
+ this, &mouseEvent, exitedTarget, canvasRegionId); |
boundaryEventDispatcher.sendBoundaryEvents(exitedTarget, enteredTarget); |
} |
WebInputEventResult MouseEventManager::dispatchMouseEvent( |
EventTarget* target, |
const AtomicString& mouseEventType, |
- const PlatformMouseEvent& mouseEvent, |
+ const WebMouseEvent& mouseEvent, |
+ const String& canvasRegionId, |
EventTarget* relatedTarget, |
bool checkForListener) { |
if (target && target->toNode() && |
@@ -206,9 +204,10 @@ WebInputEventResult MouseEventManager::dispatchMouseEvent( |
mouseEventType == EventTypeNames::dblclick) { |
clickCount = m_clickCount; |
} |
- MouseEvent* event = MouseEvent::create( |
- mouseEventType, targetNode->document().domWindow(), mouseEvent, |
- clickCount, relatedTarget ? relatedTarget->toNode() : nullptr); |
+ MouseEvent* event = |
+ MouseEvent::create(mouseEventType, targetNode->document().domWindow(), |
+ mouseEvent, clickCount, canvasRegionId, |
+ relatedTarget ? relatedTarget->toNode() : nullptr); |
DispatchEventResult dispatchResult = target->dispatchEvent(event); |
return EventHandlingUtil::toWebInputEventResult(dispatchResult); |
} |
@@ -217,32 +216,32 @@ WebInputEventResult MouseEventManager::dispatchMouseEvent( |
WebInputEventResult MouseEventManager::setMousePositionAndDispatchMouseEvent( |
Node* targetNode, |
+ const String& canvasRegionId, |
const AtomicString& eventType, |
- const PlatformMouseEvent& platformMouseEvent) { |
+ const WebMouseEvent& webMouseEvent) { |
// If the target node is a text node, dispatch on the parent node. |
if (targetNode && targetNode->isTextNode()) |
targetNode = FlatTreeTraversal::parent(*targetNode); |
- setNodeUnderMouse(targetNode, platformMouseEvent); |
+ setNodeUnderMouse(targetNode, canvasRegionId, webMouseEvent); |
- return dispatchMouseEvent(m_nodeUnderMouse, eventType, platformMouseEvent, |
- nullptr); |
+ return dispatchMouseEvent(m_nodeUnderMouse, eventType, webMouseEvent, |
+ canvasRegionId, nullptr); |
} |
WebInputEventResult MouseEventManager::dispatchMouseClickIfNeeded( |
const MouseEventWithHitTestResults& mev) { |
// We only prevent click event when the click may cause contextmenu to popup. |
// However, we always send auxclick. |
- bool contextMenuEvent = !RuntimeEnabledFeatures::auxclickEnabled() && |
- mev.event().pointerProperties().button == |
- WebPointerProperties::Button::Right; |
+ bool contextMenuEvent = |
+ !RuntimeEnabledFeatures::auxclickEnabled() && |
+ mev.event().button == WebPointerProperties::Button::Right; |
#if OS(MACOSX) |
// FIXME: The Mac port achieves the same behavior by checking whether the |
// context menu is currently open in WebPage::mouseEvent(). Consider merging |
// the implementations. |
- if (mev.event().pointerProperties().button == |
- WebPointerProperties::Button::Left && |
- mev.event().getModifiers() & PlatformEvent::CtrlKey) |
+ if (mev.event().button == WebPointerProperties::Button::Left && |
+ mev.event().modifiers() & WebInputEvent::Modifiers::ControlKey) |
contextMenuEvent = true; |
#endif |
@@ -269,12 +268,12 @@ WebInputEventResult MouseEventManager::dispatchMouseClickIfNeeded( |
} |
if (clickTargetNode) { |
clickEventResult = dispatchMouseEvent( |
- clickTargetNode, !RuntimeEnabledFeatures::auxclickEnabled() || |
- (mev.event().pointerProperties().button == |
- WebPointerProperties::Button::Left) |
- ? EventTypeNames::click |
- : EventTypeNames::auxclick, |
- mev.event(), nullptr); |
+ clickTargetNode, |
+ !RuntimeEnabledFeatures::auxclickEnabled() || |
+ (mev.event().button == WebPointerProperties::Button::Left) |
+ ? EventTypeNames::click |
+ : EventTypeNames::auxclick, |
+ mev.event(), mev.canvasRegionId(), nullptr); |
} |
} |
return clickEventResult; |
@@ -300,14 +299,17 @@ void MouseEventManager::fakeMouseMoveEventTimerFired(TimerBase* timer) { |
if (!m_frame->page()->isCursorVisible()) |
return; |
- PlatformMouseEvent fakeMouseMoveEvent( |
- m_lastKnownMousePosition, m_lastKnownMouseGlobalPosition, |
- WebPointerProperties::Button::NoButton, PlatformEvent::MouseMoved, 0, |
- static_cast<PlatformEvent::Modifiers>( |
- KeyboardEventManager::getCurrentModifierState()), |
- PlatformMouseEvent::RealOrIndistinguishable, TimeTicks::Now(), |
- WebPointerProperties::PointerType::Mouse); |
- Vector<PlatformMouseEvent> coalescedEvents; |
+ WebMouseEvent fakeMouseMoveEvent( |
+ WebInputEvent::MouseMove, |
+ WebFloatPoint(m_lastKnownMousePosition.x(), m_lastKnownMousePosition.y()), |
+ WebFloatPoint(m_lastKnownMouseGlobalPosition.x(), |
+ m_lastKnownMouseGlobalPosition.y()), |
+ WebPointerProperties::Button::NoButton, 0, |
+ KeyboardEventManager::getCurrentModifierState(), |
+ TimeTicks::Now().InSeconds()); |
+ // TODO(dtapuska): Update m_lastKnowMousePosition to be viewport coordinates. |
bokan
2017/01/27 16:57:17
Ditto here
dtapuska
2017/01/27 21:00:00
same reasoning.
|
+ fakeMouseMoveEvent.setFrameScale(1); |
+ Vector<WebMouseEvent> coalescedEvents; |
m_frame->eventHandler().handleMouseMoveEvent(fakeMouseMoveEvent, |
coalescedEvents); |
} |
@@ -316,9 +318,9 @@ void MouseEventManager::cancelFakeMouseMoveEvent() { |
m_fakeMouseMoveEventTimer.stop(); |
} |
-void MouseEventManager::setNodeUnderMouse( |
- Node* target, |
- const PlatformMouseEvent& platformMouseEvent) { |
+void MouseEventManager::setNodeUnderMouse(Node* target, |
+ const String& canvasRegionId, |
+ const WebMouseEvent& webMouseEvent) { |
Node* lastNodeUnderMouse = m_nodeUnderMouse; |
m_nodeUnderMouse = target; |
@@ -367,7 +369,8 @@ void MouseEventManager::setNodeUnderMouse( |
lastNodeUnderMouse = nullptr; |
} |
- sendBoundaryEvents(lastNodeUnderMouse, m_nodeUnderMouse, platformMouseEvent); |
+ sendBoundaryEvents(lastNodeUnderMouse, m_nodeUnderMouse, canvasRegionId, |
+ webMouseEvent); |
} |
void MouseEventManager::nodeChildrenWillBeRemoved(ContainerNode& container) { |
@@ -493,17 +496,18 @@ bool MouseEventManager::slideFocusOnShadowHostIfNecessary( |
} |
void MouseEventManager::handleMousePressEventUpdateStates( |
- const PlatformMouseEvent& mouseEvent) { |
+ const WebMouseEvent& mouseEvent) { |
cancelFakeMouseMoveEvent(); |
m_mousePressed = true; |
m_capturesDragging = true; |
setLastKnownMousePosition(mouseEvent); |
m_mouseDownMayStartDrag = false; |
m_mouseDownMayStartAutoscroll = false; |
- m_mouseDownTimestamp = mouseEvent.timestamp(); |
+ m_mouseDownTimestamp = TimeTicks::FromSeconds(mouseEvent.timeStampSeconds()); |
if (FrameView* view = m_frame->view()) { |
- m_mouseDownPos = view->rootFrameToContents(mouseEvent.position()); |
+ m_mouseDownPos = view->rootFrameToContents( |
+ flooredIntPoint(mouseEvent.positionInRootFrame())); |
} else { |
invalidateClick(); |
} |
@@ -517,11 +521,10 @@ IntPoint MouseEventManager::lastKnownMousePosition() { |
return m_lastKnownMousePosition; |
} |
-void MouseEventManager::setLastKnownMousePosition( |
- const PlatformMouseEvent& event) { |
+void MouseEventManager::setLastKnownMousePosition(const WebMouseEvent& event) { |
m_isMousePositionUnknown = false; |
- m_lastKnownMousePosition = event.position(); |
- m_lastKnownMouseGlobalPosition = event.globalPosition(); |
+ m_lastKnownMousePosition = flooredIntPoint(event.positionInRootFrame()); |
+ m_lastKnownMouseGlobalPosition = IntPoint(event.globalX, event.globalY); |
} |
void MouseEventManager::dispatchFakeMouseMoveEventSoon() { |
@@ -561,11 +564,12 @@ WebInputEventResult MouseEventManager::handleMousePressEvent( |
m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
if (FrameView* frameView = m_frame->view()) { |
- if (frameView->isPointInScrollbarCorner(event.event().position())) |
+ if (frameView->isPointInScrollbarCorner( |
+ flooredIntPoint(event.event().positionInRootFrame()))) |
return WebInputEventResult::NotHandled; |
} |
- bool singleClick = event.event().clickCount() <= 1; |
+ bool singleClick = event.event().clickCount <= 1; |
m_mouseDownMayStartDrag = |
singleClick && !isLinkSelection(event) && !isExtendingSelection(event); |
@@ -576,10 +580,12 @@ WebInputEventResult MouseEventManager::handleMousePressEvent( |
if (m_frame->document()->isSVGDocument() && |
m_frame->document()->accessSVGExtensions().zoomAndPanEnabled()) { |
- if (event.event().shiftKey() && singleClick) { |
+ if ((event.event().modifiers() & WebInputEvent::Modifiers::ShiftKey) && |
+ singleClick) { |
m_svgPan = true; |
m_frame->document()->accessSVGExtensions().startPan( |
- m_frame->view()->rootFrameToContents(event.event().position())); |
+ m_frame->view()->rootFrameToContents( |
+ flooredIntPoint(event.event().positionInRootFrame()))); |
return WebInputEventResult::HandledSystem; |
} |
} |
@@ -593,16 +599,16 @@ WebInputEventResult MouseEventManager::handleMousePressEvent( |
m_mousePressNode = innerNode; |
m_frame->document()->setSequentialFocusNavigationStartingPoint(innerNode); |
- m_dragStartPos = event.event().position(); |
+ m_dragStartPos = flooredIntPoint(event.event().positionInRootFrame()); |
bool swallowEvent = false; |
m_mousePressed = true; |
- if (event.event().clickCount() == 2) { |
+ if (event.event().clickCount == 2) { |
swallowEvent = m_frame->eventHandler() |
.selectionController() |
.handleMousePressEventDoubleClick(event); |
- } else if (event.event().clickCount() >= 3) { |
+ } else if (event.event().clickCount >= 3) { |
swallowEvent = m_frame->eventHandler() |
.selectionController() |
.handleMousePressEventTripleClick(event); |
@@ -647,30 +653,28 @@ bool MouseEventManager::handleDragDropIfPossible( |
// TODO(mustaq): Suppressing long-tap MouseEvents could break |
// drag-drop. Will do separately because of the risk. crbug.com/606938. |
- PlatformMouseEvent mouseDownEvent( |
- gestureEvent, WebPointerProperties::Button::Left, |
- PlatformEvent::MousePressed, 1, |
- static_cast<PlatformEvent::Modifiers>(modifiers | |
- PlatformEvent::LeftButtonDown), |
- PlatformMouseEvent::FromTouch, TimeTicks::Now(), |
- WebPointerProperties::PointerType::Mouse); |
+ WebMouseEvent mouseDownEvent( |
+ WebInputEvent::MouseDown, gestureEvent, |
+ WebPointerProperties::Button::Left, 1, |
+ modifiers | WebInputEvent::Modifiers::LeftButtonDown | |
+ WebInputEvent::Modifiers::IsCompatibilityEventForTouch, |
+ TimeTicks::Now().InSeconds()); |
m_mouseDown = mouseDownEvent; |
- PlatformMouseEvent mouseDragEvent( |
- gestureEvent, WebPointerProperties::Button::Left, |
- PlatformEvent::MouseMoved, 1, |
- static_cast<PlatformEvent::Modifiers>(modifiers | |
- PlatformEvent::LeftButtonDown), |
- PlatformMouseEvent::FromTouch, TimeTicks::Now(), |
- WebPointerProperties::PointerType::Mouse); |
+ WebMouseEvent mouseDragEvent( |
+ WebInputEvent::MouseMove, gestureEvent, |
+ WebPointerProperties::Button::Left, 1, |
+ modifiers | WebInputEvent::Modifiers::LeftButtonDown | |
+ WebInputEvent::Modifiers::IsCompatibilityEventForTouch, |
+ TimeTicks::Now().InSeconds()); |
HitTestRequest request(HitTestRequest::ReadOnly); |
MouseEventWithHitTestResults mev = |
EventHandlingUtil::performMouseEventHitTest(m_frame, request, |
mouseDragEvent); |
m_mouseDownMayStartDrag = true; |
dragState().m_dragSrc = nullptr; |
- m_mouseDownPos = |
- m_frame->view()->rootFrameToContents(mouseDragEvent.position()); |
+ m_mouseDownPos = m_frame->view()->rootFrameToContents( |
+ flooredIntPoint(mouseDragEvent.positionInRootFrame())); |
return handleDrag(mev, DragInitiator::Touch); |
} |
return false; |
@@ -701,8 +705,7 @@ WebInputEventResult MouseEventManager::handleMouseDraggedEvent( |
// that ends as a result of a mouse release does not send a mouse release |
// event. As a result, m_mousePressed also ends up remaining true until |
// the next mouse release event seen by the EventHandler. |
- if (event.event().pointerProperties().button != |
- WebPointerProperties::Button::Left) |
+ if (event.event().button != WebPointerProperties::Button::Left) |
m_mousePressed = false; |
if (!m_mousePressed) |
@@ -751,7 +754,7 @@ WebInputEventResult MouseEventManager::handleMouseDraggedEvent( |
bool MouseEventManager::handleDrag(const MouseEventWithHitTestResults& event, |
DragInitiator initiator) { |
- DCHECK(event.event().type() == PlatformEvent::MouseMoved); |
+ DCHECK(event.event().type() == WebInputEvent::MouseMove); |
// Callers must protect the reference to FrameView, since this function may |
// dispatch DOM events, causing page/FrameView to go away. |
DCHECK(m_frame); |
@@ -766,7 +769,9 @@ bool MouseEventManager::handleDrag(const MouseEventWithHitTestResults& event, |
Node* node = result.innerNode(); |
if (node) { |
DragController::SelectionDragPolicy selectionDragPolicy = |
- event.event().timestamp() - m_mouseDownTimestamp < kTextDragDelay |
+ TimeTicks::FromSeconds(event.event().timeStampSeconds()) - |
+ m_mouseDownTimestamp < |
+ kTextDragDelay |
? DragController::DelayedSelectionDragResolution |
: DragController::ImmediateSelectionDragResolution; |
dragState().m_dragSrc = m_frame->page()->dragController().draggableNode( |
@@ -794,7 +799,8 @@ bool MouseEventManager::handleDrag(const MouseEventWithHitTestResults& event, |
m_frame->view()->setCursor(pointerCursor()); |
if (initiator == DragInitiator::Mouse && |
- !dragThresholdExceeded(event.event().position())) { |
+ !dragThresholdExceeded( |
+ flooredIntPoint(event.event().positionInRootFrame()))) { |
dragState().m_dragSrc = nullptr; |
return true; |
} |
@@ -867,7 +873,7 @@ bool MouseEventManager::tryStartDrag( |
// eventhandler canceled. |
WebInputEventResult MouseEventManager::dispatchDragSrcEvent( |
const AtomicString& eventType, |
- const PlatformMouseEvent& event) { |
+ const WebMouseEvent& event) { |
return dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, |
dragState().m_dragDataTransfer.get()); |
} |
@@ -875,7 +881,7 @@ WebInputEventResult MouseEventManager::dispatchDragSrcEvent( |
WebInputEventResult MouseEventManager::dispatchDragEvent( |
const AtomicString& eventType, |
Node* dragTarget, |
- const PlatformMouseEvent& event, |
+ const WebMouseEvent& event, |
DataTransfer* dataTransfer) { |
FrameView* view = m_frame->view(); |
@@ -886,13 +892,16 @@ WebInputEventResult MouseEventManager::dispatchDragEvent( |
const bool cancelable = eventType != EventTypeNames::dragleave && |
eventType != EventTypeNames::dragend; |
+ IntPoint position = flooredIntPoint(event.positionInRootFrame()); |
+ IntPoint movement = flooredIntPoint(event.movementInRootFrame()); |
DragEvent* me = DragEvent::create( |
eventType, true, cancelable, m_frame->document()->domWindow(), 0, |
- event.globalPosition().x(), event.globalPosition().y(), |
- event.position().x(), event.position().y(), event.movementDelta().x(), |
- event.movementDelta().y(), event.getModifiers(), 0, |
- MouseEvent::platformModifiersToButtons(event.getModifiers()), nullptr, |
- event.timestamp(), dataTransfer, event.getSyntheticEventType()); |
+ event.globalX, event.globalY, position.x(), position.y(), movement.x(), |
+ movement.y(), static_cast<PlatformEvent::Modifiers>(event.modifiers()), 0, |
+ MouseEvent::platformModifiersToButtons(event.modifiers()), nullptr, |
+ TimeTicks::FromSeconds(event.timeStampSeconds()), dataTransfer, |
+ event.fromTouch() ? MouseEvent::FromTouch |
+ : MouseEvent::RealOrIndistinguishable); |
return EventHandlingUtil::toWebInputEventResult( |
dragTarget->dispatchEvent(me)); |
@@ -905,7 +914,7 @@ void MouseEventManager::clearDragDataTransfer() { |
} |
} |
-void MouseEventManager::dragSourceEndedAt(const PlatformMouseEvent& event, |
+void MouseEventManager::dragSourceEndedAt(const WebMouseEvent& event, |
DragOperation operation) { |
if (dragState().m_dragSrc) { |
dragState().m_dragDataTransfer->setDestinationOperation(operation); |