Chromium Code Reviews| Index: Source/core/events/MouseEvent.cpp |
| diff --git a/Source/core/events/MouseEvent.cpp b/Source/core/events/MouseEvent.cpp |
| index b875392efae6270299157517467d31203ea4265d..373baa6f3921233c95fb87a70ca686bb7aec0ed8 100644 |
| --- a/Source/core/events/MouseEvent.cpp |
| +++ b/Source/core/events/MouseEvent.cpp |
| @@ -40,6 +40,7 @@ MouseEventInit::MouseEventInit() |
| , shiftKey(false) |
| , metaKey(false) |
| , button(0) |
| + , buttons(0) |
| , relatedTarget(nullptr) |
| { |
| } |
| @@ -57,28 +58,35 @@ PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& eventT |
| bool isCancelable = !isMouseEnterOrLeave; |
| bool isBubbling = !isMouseEnterOrLeave; |
| + unsigned short buttons = 0; |
| + if (eventType != EventTypeNames::contextmenu) |
|
Rick Byers
2014/11/28 17:36:02
why do you need to special case contextmenu here?
zino
2014/12/03 15:47:15
This was for asking question to you.
Done.
|
| + buttons = platformModifiersToButtons(event.modifiers()); |
| + |
| return MouseEvent::create( |
| eventType, isBubbling, isCancelable, view, |
| detail, 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(), event.button(), |
| + event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(), buttons, |
| relatedTarget, nullptr, false, event.syntheticEventType()); |
| } |
| PassRefPtrWillBeRawPtr<MouseEvent> MouseEvent::create(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView> view, |
| int detail, int screenX, int screenY, int pageX, int pageY, |
| int movementX, int movementY, |
| - bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, |
| + bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, |
| + unsigned short button, unsigned short buttons, |
| PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, PassRefPtrWillBeRawPtr<DataTransfer> dataTransfer, bool isSimulated, PlatformMouseEvent::SyntheticEventType syntheticEventType) |
| { |
| return adoptRefWillBeNoop(new MouseEvent(type, canBubble, cancelable, view, |
| detail, screenX, screenY, pageX, pageY, |
| movementX, movementY, |
| - ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, dataTransfer, isSimulated, syntheticEventType)); |
| + ctrlKey, altKey, shiftKey, metaKey, button, buttons, |
| + relatedTarget, dataTransfer, isSimulated, syntheticEventType)); |
| } |
| MouseEvent::MouseEvent() |
| : m_button(0) |
| + , m_buttons(0) |
| , m_buttonDown(false) |
| { |
| } |
| @@ -87,13 +95,14 @@ MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance |
| int detail, int screenX, int screenY, int pageX, int pageY, |
| int movementX, int movementY, |
| bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, |
| - unsigned short button, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, |
| + unsigned short button, unsigned short buttons, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, |
| PassRefPtrWillBeRawPtr<DataTransfer> dataTransfer, bool isSimulated, PlatformMouseEvent::SyntheticEventType syntheticEventType) |
| : MouseRelatedEvent(eventType, canBubble, cancelable, view, detail, IntPoint(screenX, screenY), |
| IntPoint(pageX, pageY), |
| IntPoint(movementX, movementY), |
| ctrlKey, altKey, shiftKey, metaKey, isSimulated) |
| , m_button(button == (unsigned short)-1 ? 0 : button) |
| + , m_buttons(buttons) |
| , m_buttonDown(button != (unsigned short)-1) |
| , m_relatedTarget(relatedTarget) |
| , m_dataTransfer(dataTransfer) |
| @@ -107,6 +116,7 @@ MouseEvent::MouseEvent(const AtomicString& eventType, const MouseEventInit& init |
| IntPoint(0 /* movementX */, 0 /* movementY */), |
| initializer.ctrlKey, initializer.altKey, initializer.shiftKey, initializer.metaKey, false /* isSimulated */) |
| , m_button(initializer.button == (unsigned short)-1 ? 0 : initializer.button) |
| + , m_buttons(initializer.buttons) |
| , m_buttonDown(initializer.button != (unsigned short)-1) |
| , m_relatedTarget(initializer.relatedTarget) |
| , m_dataTransfer(nullptr) |
| @@ -118,10 +128,24 @@ MouseEvent::~MouseEvent() |
| { |
| } |
| +unsigned short MouseEvent::platformModifiersToButtons(unsigned modifiers) |
| +{ |
| + unsigned short buttons = 0; |
| + |
| + if (modifiers & PlatformEvent::LeftButtonDown) |
| + buttons |= 1; |
| + if (modifiers & PlatformEvent::RightButtonDown) |
| + buttons |= 2; |
| + if (modifiers & PlatformEvent::MiddleButtonDown) |
| + buttons |= 4; |
| + |
| + return buttons; |
| +} |
| + |
| void MouseEvent::initMouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView> view, |
| int detail, int screenX, int screenY, int clientX, int clientY, |
| bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, |
| - unsigned short button, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget) |
| + unsigned short button, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, unsigned short buttons) |
| { |
| if (dispatched()) |
| return; |
| @@ -136,6 +160,7 @@ void MouseEvent::initMouseEvent(const AtomicString& type, bool canBubble, bool c |
| m_button = button == (unsigned short)-1 ? 0 : button; |
| m_buttonDown = button != (unsigned short)-1; |
| m_relatedTarget = relatedTarget; |
| + m_buttons = buttons; |
| initCoordinates(IntPoint(clientX, clientY)); |
| @@ -205,7 +230,7 @@ SimulatedMouseEvent::~SimulatedMouseEvent() |
| } |
| SimulatedMouseEvent::SimulatedMouseEvent(const AtomicString& eventType, PassRefPtrWillBeRawPtr<AbstractView> view, PassRefPtrWillBeRawPtr<Event> underlyingEvent) |
| - : MouseEvent(eventType, true, true, view, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, 0, |
| + : MouseEvent(eventType, true, true, view, 0, 0, 0, 0, 0, 0, 0, false, false, false, false, 0, 0, |
| nullptr, nullptr, true, PlatformMouseEvent::RealOrIndistinguishable) |
| { |
| if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEvent.get())) { |
| @@ -272,9 +297,9 @@ bool MouseEventDispatchMediator::dispatchEvent(EventDispatcher* dispatcher) cons |
| // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same. |
| RefPtrWillBeRawPtr<MouseEvent> doubleClickEvent = MouseEvent::create(); |
| doubleClickEvent->initMouseEvent(EventTypeNames::dblclick, event()->bubbles(), event()->cancelable(), event()->view(), |
| - event()->detail(), event()->screenX(), event()->screenY(), event()->clientX(), event()->clientY(), |
| - event()->ctrlKey(), event()->altKey(), event()->shiftKey(), event()->metaKey(), |
| - event()->button(), relatedTarget); |
| + event()->detail(), event()->screenX(), event()->screenY(), event()->clientX(), event()->clientY(), |
| + event()->ctrlKey(), event()->altKey(), event()->shiftKey(), event()->metaKey(), |
| + event()->button(), relatedTarget, event()->buttons()); |
| if (event()->defaultHandled()) |
| doubleClickEvent->setDefaultHandled(); |
| EventDispatcher::dispatchEvent(dispatcher->node(), MouseEventDispatchMediator::create(doubleClickEvent)); |