Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Unified Diff: Source/core/page/EventHandler.cpp

Issue 727593003: Implement MouseEvent buttons attribute. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: should be 0 in contextmenu event Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698