Chromium Code Reviews| Index: Source/core/page/EventHandler.cpp |
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
| index b494da3325acd28ce3d7869fbb6448eaecd65c29..b842cc12f52404bec620b021f34568b2bab3636b 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(); |
| @@ -2224,6 +2226,27 @@ bool EventHandler::handleGestureScrollEvent(const PlatformGestureEvent& gestureE |
| } |
| } |
| +static PlatformEvent::Modifiers platformModifiersFrom(unsigned modifierFlags) |
|
Rick Byers
2014/11/28 17:36:02
nit: this function is simple enough you should jus
zino
2014/12/03 15:47:15
Done.
|
| +{ |
| + return static_cast<PlatformEvent::Modifiers>(modifierFlags); |
| +} |
| + |
| +static unsigned modifierFlagsFrom(const PlatformGestureEvent& event) |
|
Rick Byers
2014/11/28 17:36:02
Isn't this function pretty much equivalent to just
zino
2014/12/03 15:47:15
Yep.. you're right :)
Thanks.
Done.
|
| +{ |
| + unsigned modifierFlags = 0; |
| + |
| + if (event.altKey()) |
| + modifierFlags |= PlatformEvent::AltKey; |
| + if (event.ctrlKey()) |
| + modifierFlags |= PlatformEvent::CtrlKey; |
| + if (event.metaKey()) |
| + modifierFlags |= PlatformEvent::MetaKey; |
| + if (event.shiftKey()) |
| + modifierFlags |= PlatformEvent::ShiftKey; |
| + |
| + return modifierFlags; |
| +} |
| + |
| bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& targetedEvent) |
| { |
| RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
| @@ -2232,16 +2255,7 @@ 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); |
| + unsigned modifierFlags = modifierFlagsFrom(gestureEvent); |
| HitTestResult currentHitTest = targetedEvent.hitTestResult(); |
| @@ -2251,7 +2265,8 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
| PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globalPosition(), |
| NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| - modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| + platformModifiersFrom(modifierFlags), |
| + 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. |
| @@ -2267,7 +2282,8 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
| PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globalPosition(), |
| LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| - modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| + platformModifiersFrom(modifierFlags | PlatformEvent::LeftButtonDown), |
| + PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown, true); |
| if (!swallowMouseDownEvent) |
| swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest)); |
| @@ -2282,7 +2298,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()); |
| + platformModifiersFrom(modifierFlags), |
| + PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp, false); |
| bool swallowClickEvent = false; |
| @@ -2311,6 +2328,8 @@ bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& |
| const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
| IntPoint adjustedPoint = gestureEvent.position(); |
| + unsigned modifierFlags = modifierFlagsFrom(gestureEvent); |
| + |
| // 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. |
| @@ -2318,11 +2337,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()); |
| + platformModifiersFrom(modifierFlags | 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()); |
| + platformModifiersFrom(modifierFlags | PlatformEvent::LeftButtonDown), |
| + PlatformMouseEvent::FromTouch, WTF::currentTime()); |
| HitTestRequest request(HitTestRequest::ReadOnly); |
| MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragEvent); |
| m_mouseDownMayStartDrag = true; |
| @@ -2834,7 +2855,9 @@ bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR |
| PlatformEvent::Type eventType = PlatformEvent::MousePressed; |
|
Rick Byers
2014/11/28 17:36:02
Looks like I was wrong and this OS behavior differ
zino
2014/12/03 15:47:15
Thank you for your guide.
As you know, these works
|
| #endif |
| - 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, |
| + platformModifiersFrom(modifierFlagsFrom(targetedEvent.event())), |
| + 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. |