Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index 09e700fd4b2c4fed7e46d7bc8025a2c8a5e9ba07..83bf933ab2873fdf1e9cc5513a0767b76e21e037 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -1634,12 +1634,14 @@ bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa |
if (!view) |
return false; |
+ // FIXME: The drag event have to support for |buttons| attribute because |
+ // the event is derived from mouse event. Please see crbug.com/276941. |
RefPtrWillBeRawPtr<MouseEvent> me = MouseEvent::create(eventType, |
true, true, m_frame->document()->domWindow(), |
0, event.globalPosition().x(), event.globalPosition().y(), event.position().x(), event.position().y(), |
event.movementDelta().x(), event.movementDelta().y(), |
event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), |
- 0, nullptr, dataTransfer); |
+ 0, 0, nullptr, dataTransfer); |
dragTarget->dispatchEvent(me.get(), IGNORE_EXCEPTION); |
return me->defaultPrevented(); |
@@ -2231,26 +2233,17 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); |
- unsigned modifierFlags = 0; |
- if (gestureEvent.altKey()) |
- modifierFlags |= PlatformEvent::AltKey; |
- if (gestureEvent.ctrlKey()) |
- modifierFlags |= PlatformEvent::CtrlKey; |
- if (gestureEvent.metaKey()) |
- modifierFlags |= PlatformEvent::MetaKey; |
- if (gestureEvent.shiftKey()) |
- modifierFlags |= PlatformEvent::ShiftKey; |
- PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(modifierFlags); |
- |
HitTestResult currentHitTest = targetedEvent.hitTestResult(); |
// We use the adjusted position so the application isn't surprised to see a event with |
// co-ordinates outside the target's bounds. |
IntPoint adjustedPoint = m_frame->view()->windowToContents(gestureEvent.position()); |
+ unsigned modifiers = gestureEvent.modifiers(); |
PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globalPosition(), |
NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
- modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
+ static_cast<PlatformEvent::Modifiers>(modifiers), |
+ PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove, true); |
// Do a new hit-test in case the mousemove event changed the DOM. |
@@ -2266,7 +2259,8 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globalPosition(), |
LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
- modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
+ static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
+ PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown, true); |
if (!swallowMouseDownEvent) |
swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest)); |
@@ -2281,7 +2275,8 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalPosition(), |
LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
- modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
+ static_cast<PlatformEvent::Modifiers>(modifiers), |
+ PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp, false); |
bool swallowClickEvent = false; |
@@ -2310,6 +2305,8 @@ bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& |
const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
IntPoint adjustedPoint = gestureEvent.position(); |
+ unsigned modifiers = gestureEvent.modifiers(); |
+ |
// FIXME: Ideally we should try to remove the extra mouse-specific hit-tests here (re-using the |
// supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code |
// and LongPress is such a special scenario that it's unlikely to matter much in practice. |
@@ -2317,11 +2314,13 @@ bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& |
m_longTapShouldInvokeContextMenu = false; |
if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_frame->view()) { |
PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, 1, |
- gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), PlatformMouseEvent::FromTouch, WTF::currentTime()); |
+ static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
+ PlatformMouseEvent::FromTouch, WTF::currentTime()); |
m_mouseDown = mouseDownEvent; |
PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MouseMoved, 1, |
- gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), PlatformMouseEvent::FromTouch, WTF::currentTime()); |
+ static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
+ PlatformMouseEvent::FromTouch, WTF::currentTime()); |
HitTestRequest request(HitTestRequest::ReadOnly); |
MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragEvent); |
m_mouseDownMayStartDrag = true; |
@@ -2827,12 +2826,17 @@ bool EventHandler::sendContextMenuEventForKey() |
bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestResults& targetedEvent) |
{ |
+ unsigned modifiers = targetedEvent.event().modifiers(); |
PlatformEvent::Type eventType = PlatformEvent::MousePressed; |
if (m_frame->settings()->showContextMenuOnMouseUp()) |
eventType = PlatformEvent::MouseReleased; |
+ else |
+ modifiers |= PlatformEvent::RightButtonDown; |
- PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEvent.event().globalPosition(), RightButton, eventType, 1, false, false, false, false, PlatformMouseEvent::FromTouch, WTF::currentTime()); |
+ PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEvent.event().globalPosition(), RightButton, eventType, 1, |
+ static_cast<PlatformEvent::Modifiers>(modifiers), |
+ PlatformMouseEvent::FromTouch, WTF::currentTime()); |
// To simulate right-click behavior, we send a right mouse down and then |
// context menu event. |
// FIXME: Send HitTestResults to avoid redundant hit tests. |