[Mac] Add support for MouseEvent.buttons
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Oct 2017 00:24:21 +0000 (00:24 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Oct 2017 00:24:21 +0000 (00:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=178214

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

Rebaseline test now that more checks are passing.

* web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt:

Source/WebCore:

Add support for MouseEvent.buttons on Mac as per:
- https://www.w3.org/TR/uievents/#ref-for-dom-mouseevent-buttons-1

This is supported by Firefox and Chrome already.

No new tests, rebaselined existing test.

* dom/Element.cpp:
(WebCore::Element::dispatchMouseEvent):
* dom/MouseEvent.cpp:
(WebCore::MouseEvent::create):
(WebCore::MouseEvent::MouseEvent):
* dom/MouseEvent.h:
(WebCore::MouseEvent::buttons const):
* dom/MouseEvent.idl:
* dom/MouseEventInit.h:
* dom/MouseEventInit.idl:
* dom/SimulatedClick.cpp:
* dom/WheelEvent.cpp:
* page/EventHandler.cpp:
(WebCore::EventHandler::dispatchDragEvent):
* platform/PlatformMouseEvent.h:
(WebCore::PlatformMouseEvent::buttons const):
* platform/mac/PlatformEventFactoryMac.mm:
(WebCore::currentlyPressedMouseButtons):
(WebCore::PlatformMouseEventBuilder::PlatformMouseEventBuilder):

Source/WebKit:

* Shared/WebEvent.h:
(WebKit::WebMouseEvent::buttons const):
* Shared/WebEventConversion.cpp:
(WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
* Shared/WebMouseEvent.cpp:
(WebKit::WebMouseEvent::WebMouseEvent):
(WebKit::WebMouseEvent::encode const):
(WebKit::WebMouseEvent::decode):
* Shared/mac/WebEventFactory.mm:
(WebKit::currentlyPressedMouseButtons):
(WebKit::WebEventFactory::createWebMouseEvent):
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::showContextMenuAtPoint):
* WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::createWebEvent const):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::navigateToPDFLinkWithSimulatedClick):
(WebKit::WebPage::simulateMouseDown):
(WebKit::WebPage::simulateMouseUp):
(WebKit::WebPage::simulateMouseMotion):

Source/WebKitLegacy/mac:

* WebView/WebPDFView.mm:
(-[WebPDFView PDFViewWillClickOnLink:withURL:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@223264 268f45cc-cd09-0410-ab3c-d52691b4dbfc

28 files changed:
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt
LayoutTests/platform/ios/imported/w3c/web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/MouseEvent.cpp
Source/WebCore/dom/MouseEvent.h
Source/WebCore/dom/MouseEvent.idl
Source/WebCore/dom/MouseEventInit.h
Source/WebCore/dom/MouseEventInit.idl
Source/WebCore/dom/SimulatedClick.cpp
Source/WebCore/dom/WheelEvent.cpp
Source/WebCore/page/EventHandler.cpp
Source/WebCore/platform/PlatformMouseEvent.h
Source/WebCore/platform/mac/PlatformEventFactoryMac.mm
Source/WebKit/ChangeLog
Source/WebKit/Shared/WebEvent.h
Source/WebKit/Shared/WebEventConversion.cpp
Source/WebKit/Shared/WebMouseEvent.cpp
Source/WebKit/Shared/gtk/WebEventFactory.cpp
Source/WebKit/Shared/mac/WebEventFactory.mm
Source/WebKit/Shared/wpe/WebEventFactory.cpp
Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm
Source/WebKit/WebProcess/Plugins/PluginView.cpp
Source/WebKit/WebProcess/WebPage/WebPage.cpp
Source/WebKitLegacy/ios/WebView/WebPDFViewPlaceholder.mm
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebView/WebPDFView.mm

index 318ca9b155ec9aa0ff16128bc1dd5c84d50f55d6..d6458ffe5938ec9ff569fb335df153dd4e704bc0 100644 (file)
@@ -1,3 +1,14 @@
+2017-10-12  Chris Dumez  <cdumez@apple.com>
+
+        [Mac] Add support for MouseEvent.buttons
+        https://bugs.webkit.org/show_bug.cgi?id=178214
+
+        Reviewed by Ryosuke Niwa.
+
+        Rebaseline test now that more checks are passing.
+
+        * web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt:
+
 2017-10-11  Chris Dumez  <cdumez@apple.com>
 
         XMLHttpRequest: do not sniff text/html, and do not sniff XML when responseType is set to "text"
index d5814acf3358e024acd244da77f8b385986ee767..4370b54035281ed8e02595d83ef9fee2621cc3f9 100644 (file)
@@ -17,18 +17,18 @@ PASS FocusEvent constructor (null argument)
 PASS FocusEvent constructor (empty argument) 
 PASS FocusEvent constructor (argument with default values) 
 PASS FocusEvent constructor (argument with non-default values) 
-FAIL MouseEvent constructor (no argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (undefined argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (null argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (empty argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (argument with default values) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (argument with non-default values) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (no argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (undefined argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (null argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (empty argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (argument with default values) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (argument with non-default values) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
+PASS MouseEvent constructor (no argument) 
+PASS MouseEvent constructor (undefined argument) 
+PASS MouseEvent constructor (null argument) 
+PASS MouseEvent constructor (empty argument) 
+PASS MouseEvent constructor (argument with default values) 
+PASS MouseEvent constructor (argument with non-default values) 
+PASS WheelEvent constructor (no argument) 
+PASS WheelEvent constructor (undefined argument) 
+PASS WheelEvent constructor (null argument) 
+PASS WheelEvent constructor (empty argument) 
+PASS WheelEvent constructor (argument with default values) 
+PASS WheelEvent constructor (argument with non-default values) 
 PASS KeyboardEvent constructor (no argument) 
 PASS KeyboardEvent constructor (undefined argument) 
 PASS KeyboardEvent constructor (null argument) 
index d5814acf3358e024acd244da77f8b385986ee767..4370b54035281ed8e02595d83ef9fee2621cc3f9 100644 (file)
@@ -17,18 +17,18 @@ PASS FocusEvent constructor (null argument)
 PASS FocusEvent constructor (empty argument) 
 PASS FocusEvent constructor (argument with default values) 
 PASS FocusEvent constructor (argument with non-default values) 
-FAIL MouseEvent constructor (no argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (undefined argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (null argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (empty argument) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (argument with default values) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL MouseEvent constructor (argument with non-default values) assert_true: Event object "[object MouseEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (no argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (undefined argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (null argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (empty argument) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (argument with default values) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
-FAIL WheelEvent constructor (argument with non-default values) assert_true: Event object "[object WheelEvent]" should have a buttons property expected true got false
+PASS MouseEvent constructor (no argument) 
+PASS MouseEvent constructor (undefined argument) 
+PASS MouseEvent constructor (null argument) 
+PASS MouseEvent constructor (empty argument) 
+PASS MouseEvent constructor (argument with default values) 
+PASS MouseEvent constructor (argument with non-default values) 
+PASS WheelEvent constructor (no argument) 
+PASS WheelEvent constructor (undefined argument) 
+PASS WheelEvent constructor (null argument) 
+PASS WheelEvent constructor (empty argument) 
+PASS WheelEvent constructor (argument with default values) 
+PASS WheelEvent constructor (argument with non-default values) 
 PASS KeyboardEvent constructor (no argument) 
 PASS KeyboardEvent constructor (undefined argument) 
 PASS KeyboardEvent constructor (null argument) 
index cf8546f800d7cb454f44ad3fc2ecad4d2184d3e1..a52e6e6469df32d4ac4007c9d985dcfc41fca6b3 100644 (file)
@@ -1,3 +1,37 @@
+2017-10-12  Chris Dumez  <cdumez@apple.com>
+
+        [Mac] Add support for MouseEvent.buttons
+        https://bugs.webkit.org/show_bug.cgi?id=178214
+
+        Reviewed by Ryosuke Niwa.
+
+        Add support for MouseEvent.buttons on Mac as per:
+        - https://www.w3.org/TR/uievents/#ref-for-dom-mouseevent-buttons-1
+
+        This is supported by Firefox and Chrome already.
+
+        No new tests, rebaselined existing test.
+
+        * dom/Element.cpp:
+        (WebCore::Element::dispatchMouseEvent):
+        * dom/MouseEvent.cpp:
+        (WebCore::MouseEvent::create):
+        (WebCore::MouseEvent::MouseEvent):
+        * dom/MouseEvent.h:
+        (WebCore::MouseEvent::buttons const):
+        * dom/MouseEvent.idl:
+        * dom/MouseEventInit.h:
+        * dom/MouseEventInit.idl:
+        * dom/SimulatedClick.cpp:
+        * dom/WheelEvent.cpp:
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::dispatchDragEvent):
+        * platform/PlatformMouseEvent.h:
+        (WebCore::PlatformMouseEvent::buttons const):
+        * platform/mac/PlatformEventFactoryMac.mm:
+        (WebCore::currentlyPressedMouseButtons):
+        (WebCore::PlatformMouseEventBuilder::PlatformMouseEventBuilder):
+
 2017-10-12  David Kilzer  <ddkilzer@apple.com>
 
         [iOS] Fix -Wunused-lambda-capture warnings in WebCore/WebKit with new clang compiler
index 22998cb0c75e5b050e51552d4a8ecd53e92bbc16..58e8f1f911d8c454828cc29717c7bc383ca3762e 100644 (file)
@@ -285,7 +285,7 @@ bool Element::dispatchMouseEvent(const PlatformMouseEvent& platformEvent, const
             mouseEvent->bubbles(), mouseEvent->cancelable(), mouseEvent->view(), mouseEvent->detail(),
             mouseEvent->screenX(), mouseEvent->screenY(), mouseEvent->clientX(), mouseEvent->clientY(),
             mouseEvent->ctrlKey(), mouseEvent->altKey(), mouseEvent->shiftKey(), mouseEvent->metaKey(),
-            mouseEvent->button(), mouseEvent->syntheticClickType(), relatedTarget);
+            mouseEvent->button(), mouseEvent->buttons(), mouseEvent->syntheticClickType(), relatedTarget);
 
         if (mouseEvent->defaultHandled())
             doubleClickEvent->setDefaultHandled();
index 3c785a7a4466a502382cee712db8ec2dfcd6ca1d..3164a58ffb836c7ba611066c4467e8a9a897af60 100644 (file)
@@ -55,7 +55,7 @@ Ref<MouseEvent> MouseEvent::create(const AtomicString& eventType, DOMWindow* vie
 #if ENABLE(POINTER_LOCK)
         event.movementDelta().x(), event.movementDelta().y(),
 #endif
-        event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(),
+        event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(), event.buttons(),
         relatedTarget, event.force(), event.syntheticClickType());
 }
 
@@ -63,19 +63,19 @@ Ref<MouseEvent> MouseEvent::create(const AtomicString& type, bool canBubble, boo
 #if ENABLE(POINTER_LOCK)
     int movementX, int movementY,
 #endif
-    bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* dataTransfer, bool isSimulated)
+    bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* dataTransfer, bool isSimulated)
 {
     return adoptRef(*new MouseEvent(type, canBubble, cancelable, timestamp, view,
         detail, { screenX, screenY }, { pageX, pageY },
 #if ENABLE(POINTER_LOCK)
         { movementX, movementY },
 #endif
-        ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, force, syntheticClickType, dataTransfer, isSimulated));
+        ctrlKey, altKey, shiftKey, metaKey, button, buttons, relatedTarget, force, syntheticClickType, dataTransfer, isSimulated));
 }
 
-Ref<MouseEvent> MouseEvent::create(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow* view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short syntheticClickType, EventTarget* relatedTarget)
+Ref<MouseEvent> MouseEvent::create(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow* view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, unsigned short syntheticClickType, EventTarget* relatedTarget)
 {
-    return adoptRef(*new MouseEvent(eventType, canBubble, cancelable, view, detail, { screenX, screenY }, { clientX, clientY }, ctrlKey, altKey, shiftKey, metaKey, button, syntheticClickType, relatedTarget));
+    return adoptRef(*new MouseEvent(eventType, canBubble, cancelable, view, detail, { screenX, screenY }, { clientX, clientY }, ctrlKey, altKey, shiftKey, metaKey, button, buttons, syntheticClickType, relatedTarget));
 }
 
 MouseEvent::MouseEvent()
@@ -86,13 +86,14 @@ MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance
 #if ENABLE(POINTER_LOCK)
         const IntPoint& movementDelta,
 #endif
-        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* dataTransfer, bool isSimulated)
+        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* dataTransfer, bool isSimulated)
     : MouseRelatedEvent(eventType, canBubble, cancelable, timestamp, view, detail, screenLocation, windowLocation,
 #if ENABLE(POINTER_LOCK)
         movementDelta,
 #endif
         ctrlKey, altKey, shiftKey, metaKey, isSimulated)
     , m_button(button == (unsigned short)-1 ? 0 : button)
+    , m_buttons(buttons)
     , m_syntheticClickType(button == (unsigned short)-1 ? 0 : syntheticClickType)
     , m_buttonDown(button != (unsigned short)-1)
     , m_relatedTarget(relatedTarget)
@@ -101,13 +102,14 @@ MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance
 {
 }
 
-MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow* view, int detail, const IntPoint& screenLocation, const IntPoint& clientLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short syntheticClickType, EventTarget* relatedTarget)
+MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow* view, int detail, const IntPoint& screenLocation, const IntPoint& clientLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, unsigned short syntheticClickType, EventTarget* relatedTarget)
     : MouseRelatedEvent(eventType, canBubble, cancelable, MonotonicTime::now(), view, detail, screenLocation, { },
 #if ENABLE(POINTER_LOCK)
         { },
 #endif
         ctrlKey, altKey, shiftKey, metaKey, false)
     , m_button(button == (unsigned short)-1 ? 0 : button)
+    , m_buttons(buttons)
     , m_syntheticClickType(button == (unsigned short)-1 ? 0 : syntheticClickType)
     , m_buttonDown(button != (unsigned short)-1)
     , m_relatedTarget(relatedTarget)
@@ -118,6 +120,7 @@ MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cance
 MouseEvent::MouseEvent(const AtomicString& eventType, const MouseEventInit& initializer, IsTrusted isTrusted)
     : MouseRelatedEvent(eventType, initializer, isTrusted)
     , 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)
 {
index 784f006f2f4be2015e52dd92ac2073fe36702318..5e464495822203f510e4a2701578f015fc335c1b 100644 (file)
@@ -37,11 +37,11 @@ public:
 #if ENABLE(POINTER_LOCK)
         int movementX, int movementY,
 #endif
-        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* = nullptr, bool isSimulated = false);
+        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer* = nullptr, bool isSimulated = false);
 
     WEBCORE_EXPORT static Ref<MouseEvent> create(const AtomicString& eventType, DOMWindow*, const PlatformMouseEvent&, int detail, Node* relatedTarget);
 
-    static Ref<MouseEvent> create(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow*, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short syntheticClickType, EventTarget* relatedTarget);
+    static Ref<MouseEvent> create(const AtomicString& eventType, bool canBubble, bool cancelable, DOMWindow*, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, unsigned short buttons, unsigned short syntheticClickType, EventTarget* relatedTarget);
 
     static Ref<MouseEvent> createForBindings() { return adoptRef(*new MouseEvent); }
 
@@ -54,6 +54,7 @@ public:
     // WinIE uses 1,4,2 for left/middle/right but not for click (just for mousedown/up, maybe others),
     // but we will match the standard DOM.
     unsigned short button() const { return m_button; }
+    unsigned short buttons() const { return m_buttons; }
     unsigned short syntheticClickType() const { return m_syntheticClickType; }
     bool buttonDown() const { return m_buttonDown; }
     EventTarget* relatedTarget() const final { return m_relatedTarget.get(); }
@@ -75,13 +76,13 @@ protected:
 #if ENABLE(POINTER_LOCK)
         const IntPoint& movementDelta,
 #endif
-        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,
         EventTarget* relatedTarget, double force, unsigned short syntheticClickType, DataTransfer*, bool isSimulated);
 
     MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, DOMWindow*,
         int detail, const IntPoint& screenLocation, const IntPoint& clientLocation,
         bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
-        unsigned short button, unsigned short syntheticClickType, EventTarget* relatedTarget);
+        unsigned short button, unsigned short buttons, unsigned short syntheticClickType, EventTarget* relatedTarget);
 
     MouseEvent(const AtomicString& type, const MouseEventInit&, IsTrusted);
 
@@ -96,6 +97,7 @@ private:
     void setRelatedTarget(EventTarget& relatedTarget) final { m_relatedTarget = &relatedTarget; }
 
     unsigned short m_button { 0 };
+    unsigned short m_buttons { 0 };
     unsigned short m_syntheticClickType { 0 };
     bool m_buttonDown { false };
     RefPtr<EventTarget> m_relatedTarget;
index cbd6ad759e3afb66a12d1e261f4270f8becb7baf..218f2c5a1a9ce274291e468eb13486b34d2c1033 100644 (file)
@@ -33,6 +33,7 @@
     readonly attribute boolean altKey;
     readonly attribute boolean metaKey;
     readonly attribute unsigned short button;
+    readonly attribute unsigned short buttons;
     readonly attribute EventTarget? relatedTarget;
     [Conditional=POINTER_LOCK] readonly attribute long movementX;
     [Conditional=POINTER_LOCK] readonly attribute long movementY;
index 7391e29c3b5d70bf1f4af67d5bf84721e4360034..19a5ead472dedca3b7e64f6673f2684b09895a2d 100644 (file)
@@ -33,6 +33,7 @@ struct MouseEventInit : MouseRelatedEventInit {
     int clientX { 0 };
     int clientY { 0 };
     unsigned short button { 0 };
+    unsigned short buttons { 0 };
     RefPtr<EventTarget> relatedTarget;
 };
 
index aa1abd11fb77a2ca61f7c4b4c47eee07f6d8389a..6142760ace06e1679fb2e9889034edc83b6acb3d 100644 (file)
@@ -29,6 +29,7 @@ dictionary MouseEventInit : EventModifierInit {
     long clientX = 0;
     long clientY = 0;
     unsigned short button = 0;
+    unsigned short buttons = 0;
 
     // FIXME: We need to support the following member.
     // unsigned short buttons = 0;
index 4549368be927872b99be017d1b8e068318b780cf..f63363a328744d4d9e996272202490ee89f5e658 100644 (file)
@@ -50,7 +50,7 @@ private:
 #if ENABLE(POINTER_LOCK)
             { },
 #endif
-            false, false, false, false, 0, 0, 0, 0, 0, true)
+            false, false, false, false, 0, 0, nullptr, 0, 0, nullptr, true)
     {
         if (source == SimulatedClickSource::Bindings)
             setUntrusted();
index 80db05a155288b95e3820a287f919baadbd2509a..b849d8cf7c17a2ffe4bf8724be81d812bb9d3a63 100644 (file)
@@ -54,7 +54,7 @@ WheelEvent::WheelEvent(const PlatformWheelEvent& event, DOMWindow* view)
 #if ENABLE(POINTER_LOCK)
         , { }
 #endif
-        , event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), 0, 0, 0, 0, 0, false)
+        , event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), 0, 0, nullptr, 0, 0, nullptr, false)
     , m_wheelDelta(event.wheelTicksX() * TickMultiplier, event.wheelTicksY() * TickMultiplier)
     , m_deltaX(-event.deltaX())
     , m_deltaY(-event.deltaY())
index 24abc2fe2d01eff8e77ef4e8e90b64558326e945..202f60b87124f59d5a770d8e76628dbf6579d4bc 100644 (file)
@@ -2197,7 +2197,7 @@ bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Element& dra
         event.movementDelta().x(), event.movementDelta().y(),
 #endif
         event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(),
-        0, 0, event.force(), NoTap, &dataTransfer);
+        0, 0, nullptr, event.force(), NoTap, &dataTransfer);
 
     dragTarget.dispatchEvent(me);
     return me->defaultPrevented();
index a4e7d58924c0d2c2c42413f4f2ec2ec6fccb2bf9..01cba04b6efdf9aed844fcd1a4ab83c86932bd44 100644 (file)
@@ -86,6 +86,7 @@ const double ForceAtForceClick = 2;
 #endif
 
         MouseButton button() const { return m_button; }
+        unsigned short buttons() const { return m_buttons; }
         int clickCount() const { return m_clickCount; }
         unsigned modifierFlags() const { return m_modifierFlags; }
         double force() const { return m_force; }
@@ -115,6 +116,7 @@ const double ForceAtForceClick = 2;
         IntPoint m_movementDelta;
 #endif
         MouseButton m_button;
+        unsigned short m_buttons { 0 };
         int m_clickCount;
         unsigned m_modifierFlags;
         double m_force { 0 };
index dea7a2af700c889843334db478215d785139bb04..36b49e09256bbeecb77efbc6d92caadf43baa578 100644 (file)
@@ -129,6 +129,11 @@ static MouseButton mouseButtonForEvent(NSEvent *event)
     }
 }
 
+static unsigned short currentlyPressedMouseButtons()
+{
+    return static_cast<unsigned short>([NSEvent pressedMouseButtons]);
+}
+
 static PlatformEvent::Type mouseEventTypeForEvent(NSEvent* event)
 {
     switch ([event type]) {
@@ -740,6 +745,7 @@ public:
         m_position = pointForEvent(event, windowView);
         m_globalPosition = IntPoint(globalPointForEvent(event));
         m_button = mouseButtonForEvent(event);
+        m_buttons = currentlyPressedMouseButtons();
         m_clickCount = clickCountForEvent(event);
 #if ENABLE(POINTER_LOCK)
         m_movementDelta = IntPoint(event.deltaX, event.deltaY);
index d26ec1ba092bc4ae204f7b3874b2d72d1fa4864b..0e3321cb234b9042f9a0ed776009f70b116de560 100644 (file)
@@ -1,3 +1,31 @@
+2017-10-12  Chris Dumez  <cdumez@apple.com>
+
+        [Mac] Add support for MouseEvent.buttons
+        https://bugs.webkit.org/show_bug.cgi?id=178214
+
+        Reviewed by Ryosuke Niwa.
+
+        * Shared/WebEvent.h:
+        (WebKit::WebMouseEvent::buttons const):
+        * Shared/WebEventConversion.cpp:
+        (WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
+        * Shared/WebMouseEvent.cpp:
+        (WebKit::WebMouseEvent::WebMouseEvent):
+        (WebKit::WebMouseEvent::encode const):
+        (WebKit::WebMouseEvent::decode):
+        * Shared/mac/WebEventFactory.mm:
+        (WebKit::currentlyPressedMouseButtons):
+        (WebKit::WebEventFactory::createWebMouseEvent):
+        * WebProcess/Plugins/PDF/PDFPlugin.mm:
+        (WebKit::PDFPlugin::showContextMenuAtPoint):
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::createWebEvent const):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::navigateToPDFLinkWithSimulatedClick):
+        (WebKit::WebPage::simulateMouseDown):
+        (WebKit::WebPage::simulateMouseUp):
+        (WebKit::WebPage::simulateMouseMotion):
+
 2017-10-12  Youenn Fablet  <youenn@apple.com>
 
         Add API to clean CacheStorage data
index 2d459f6a106f681af88a375e3ee65f5b2be3978a..d625d2b89a384f4fa7d1259a5b7455f36604a4f8 100644 (file)
@@ -136,12 +136,13 @@ public:
     WebMouseEvent();
 
 #if PLATFORM(MAC)
-    WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force, SyntheticClickType = NoTap, int eventNumber = -1, int menuType = 0);
+    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force, SyntheticClickType = NoTap, int eventNumber = -1, int menuType = 0);
 #else
-    WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force = 0, SyntheticClickType = NoTap);
+    WebMouseEvent(Type, Button, unsigned short buttons, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, WallTime timestamp, double force = 0, SyntheticClickType = NoTap);
 #endif
 
     Button button() const { return static_cast<Button>(m_button); }
+    unsigned short buttons() const { return m_buttons; }
     const WebCore::IntPoint& position() const { return m_position; }
     const WebCore::IntPoint& globalPosition() const { return m_globalPosition; }
     float deltaX() const { return m_deltaX; }
@@ -162,6 +163,7 @@ private:
     static bool isMouseEventType(Type);
 
     uint32_t m_button;
+    unsigned short m_buttons { 0 };
     WebCore::IntPoint m_position;
     WebCore::IntPoint m_globalPosition;
     float m_deltaX;
index 70b92807100ab17c4eedcd2ce3c241afbb2cf31a..47c0a8792a4bdf96a3783498708fc017f1a41cf3 100644 (file)
@@ -99,6 +99,8 @@ public:
             ASSERT_NOT_REACHED();
         }
 
+        m_buttons = webEvent.buttons();
+
         m_position = webEvent.position();
 #if ENABLE(POINTER_LOCK)
         m_movementDelta = WebCore::IntPoint(webEvent.deltaX(), webEvent.deltaY());
index 0f77fae3d0df78b753dec589f085c76eafbfb821..17ba5c4c002c41adb5227f5e18942aa5521c0698 100644 (file)
@@ -47,12 +47,13 @@ WebMouseEvent::WebMouseEvent()
 }
 
 #if PLATFORM(MAC)
-WebMouseEvent::WebMouseEvent(Type type, Button button, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType, int eventNumber, int menuType)
+WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType, int eventNumber, int menuType)
 #else
-WebMouseEvent::WebMouseEvent(Type type, Button button, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType)
+WebMouseEvent::WebMouseEvent(Type type, Button button, unsigned short buttons, const IntPoint& position, const IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, WallTime timestamp, double force, SyntheticClickType syntheticClickType)
 #endif
     : WebEvent(type, modifiers, timestamp)
     , m_button(button)
+    , m_buttons(buttons)
     , m_position(position)
     , m_globalPosition(globalPosition)
     , m_deltaX(deltaX)
@@ -74,6 +75,7 @@ void WebMouseEvent::encode(IPC::Encoder& encoder) const
     WebEvent::encode(encoder);
 
     encoder << m_button;
+    encoder << m_buttons;
     encoder << m_position;
     encoder << m_globalPosition;
     encoder << m_deltaX;
@@ -95,6 +97,8 @@ bool WebMouseEvent::decode(IPC::Decoder& decoder, WebMouseEvent& result)
 
     if (!decoder.decode(result.m_button))
         return false;
+    if (!decoder.decode(result.m_buttons))
+        return false;
     if (!decoder.decode(result.m_position))
         return false;
     if (!decoder.decode(result.m_globalPosition))
index c19b192c13d9258ae66c4a6e71617522e48ab32f..7c366341d8b23ad4952902a73ea86a4e8ec9bf0a 100644 (file)
@@ -134,6 +134,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(const GdkEvent* event, int cu
 
     return WebMouseEvent(type,
         buttonForEvent(event),
+        0,
         IntPoint(x, y),
         IntPoint(xRoot, yRoot),
         0 /* deltaX */,
index d6d12426ea4ea9c2cc2d8b7cc2b63248cb4d93d7..a275651570734bdfd27c35275d4ddc7c572e2575 100644 (file)
@@ -85,6 +85,11 @@ static WebMouseEvent::Button mouseButtonForEvent(NSEvent *event)
     }
 }
 
+static unsigned short currentlyPressedMouseButtons()
+{
+    return static_cast<unsigned short>([NSEvent pressedMouseButtons]);
+}
+
 static WebEvent::Type mouseEventTypeForEvent(NSEvent* event)
 {
     switch ([event type]) {
@@ -354,6 +359,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *last
 #endif
 
     WebMouseEvent::Button button = mouseButtonForEvent(event);
+    unsigned short buttons = currentlyPressedMouseButtons();
     float deltaX = [event deltaX];
     float deltaY = [event deltaY];
     float deltaZ = [event deltaZ];
@@ -370,7 +376,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *last
     force = pressure + stage;
 #endif
 
-    return WebMouseEvent(type, button, IntPoint(position), IntPoint(globalPosition), deltaX, deltaY, deltaZ, clickCount, modifiers, timestamp, force, WebMouseEvent::SyntheticClickType::NoTap, eventNumber, menuTypeForEvent);
+    return WebMouseEvent(type, button, buttons, IntPoint(position), IntPoint(globalPosition), deltaX, deltaY, deltaZ, clickCount, modifiers, timestamp, force, WebMouseEvent::SyntheticClickType::NoTap, eventNumber, menuTypeForEvent);
 }
 
 WebWheelEvent WebEventFactory::createWebWheelEvent(NSEvent *event, NSView *windowView)
index 4e995048ab1ac7a0cd781a5d0d90918210d4ff7f..a403397c328d93ec67fca5cdc5aad2539271202e 100644 (file)
@@ -128,7 +128,7 @@ WebMouseEvent WebEventFactory::createWebMouseEvent(struct wpe_input_pointer_even
     // FIXME: Proper button support. Modifiers. deltaX/Y/Z. Click count.
     WebCore::IntPoint position(event->x, event->y);
     position.scale(1 / deviceScaleFactor);
-    return WebMouseEvent(type, button, position, position,
+    return WebMouseEvent(type, button, 0, position, position,
         0, 0, 0, clickCount, static_cast<WebEvent::Modifiers>(0), wallTimeForEventTime(event->time));
 }
 
index b29b1ecccfc47717eb97900c3fd299a5db8b0d25..392f594d1631764079bd7cb912d3dc4a7b897e82 100644 (file)
@@ -1582,7 +1582,7 @@ bool PDFPlugin::showContextMenuAtPoint(const IntPoint& point)
 {
     FrameView* frameView = webFrame()->coreFrame()->view();
     IntPoint contentsPoint = frameView->contentsToRootView(point);
-    WebMouseEvent event(WebEvent::MouseDown, WebMouseEvent::RightButton, contentsPoint, contentsPoint, 0, 0, 0, 1, static_cast<WebEvent::Modifiers>(0), WallTime::now(), WebCore::ForceAtClick);
+    WebMouseEvent event(WebEvent::MouseDown, WebMouseEvent::RightButton, 0, contentsPoint, contentsPoint, 0, 0, 0, 1, static_cast<WebEvent::Modifiers>(0), WallTime::now(), WebCore::ForceAtClick);
     return handleContextMenuEvent(event);
 }
 
index dc6ca72216efddfd4753783753da78ecc9a6c02e..f88bbcfd6a55120b917288d68630aaa5175146de 100644 (file)
@@ -897,7 +897,7 @@ std::unique_ptr<WebEvent> PluginView::createWebEvent(MouseEvent& event) const
     if (event.metaKey())
         modifiers |= WebEvent::MetaKey;
 
-    return std::make_unique<WebMouseEvent>(type, button, m_plugin->convertToRootView(IntPoint(event.offsetX(), event.offsetY())), event.screenLocation(), 0, 0, 0, clickCount, static_cast<WebEvent::Modifiers>(modifiers), WallTime { }, 0);
+    return std::make_unique<WebMouseEvent>(type, button, event.buttons(), m_plugin->convertToRootView(IntPoint(event.offsetX(), event.offsetY())), event.screenLocation(), 0, 0, 0, clickCount, static_cast<WebEvent::Modifiers>(modifiers), WallTime { }, 0);
 }
 
 void PluginView::handleEvent(Event& event)
index 22a7263d847e18a61e7e296112d4ad9ccbd5be3f..0ec9d9692adebf3c2b6adb22e4f948a7dd20ae35 100644 (file)
@@ -1285,7 +1285,7 @@ void WebPage::navigateToPDFLinkWithSimulatedClick(const String& url, IntPoint do
 #if ENABLE(POINTER_LOCK)
         0, 0,
 #endif
-        false, false, false, false, 0, nullptr, 0, WebCore::NoTap, nullptr);
+        false, false, false, false, 0, 0, nullptr, 0, WebCore::NoTap, nullptr);
 
     mainFrame->loader().urlSelected(mainFrameDocument->completeURL(url), emptyString(), mouseEvent.get(), LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow);
 }
@@ -4683,17 +4683,17 @@ void WebPage::handleAlternativeTextUIResult(const String& result)
 
 void WebPage::simulateMouseDown(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseDown, static_cast<WebMouseEvent::Button>(button), position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseDown, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
 }
 
 void WebPage::simulateMouseUp(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseUp, static_cast<WebMouseEvent::Button>(button), position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseUp, static_cast<WebMouseEvent::Button>(button), 0, position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time, WebCore::ForceAtClick, WebMouseEvent::NoTap));
 }
 
 void WebPage::simulateMouseMotion(WebCore::IntPoint position, WallTime time)
 {
-    mouseEvent(WebMouseEvent(WebMouseEvent::MouseMove, WebMouseEvent::NoButton, position, position, 0, 0, 0, 0, WebMouseEvent::Modifiers(), time, 0, WebMouseEvent::NoTap));
+    mouseEvent(WebMouseEvent(WebMouseEvent::MouseMove, WebMouseEvent::NoButton, 0, position, position, 0, 0, 0, 0, WebMouseEvent::Modifiers(), time, 0, WebMouseEvent::NoTap));
 }
 
 void WebPage::setCompositionForTesting(const String& compositionString, uint64_t from, uint64_t length)
index c915fe4d867e22713cfd451e32d8379f983c1cd1..29d1e468f4469dec0860d199ba938c99ee7e2db2 100644 (file)
@@ -483,7 +483,7 @@ static const float PAGE_HEIGHT_INSET = 4.0f * 2.0f;
 #if ENABLE(POINTER_LOCK)
         0, 0,
 #endif
-        false, false, false, false, 0, 0, 0, 0, 0, true);
+        false, false, false, false, 0, 0, nullptr, 0, 0, nullptr, true);
 
     // Call to the frame loader because this is where our security checks are made.
     Frame* frame = core([_dataSource webFrame]);
index dca69ef8c53ba6626f6fa3287d3f5e2e529b3667..0b2e6fb2a1384647e5692dd6f94f36dcba92e6a2 100644 (file)
@@ -1,3 +1,13 @@
+2017-10-12  Chris Dumez  <cdumez@apple.com>
+
+        [Mac] Add support for MouseEvent.buttons
+        https://bugs.webkit.org/show_bug.cgi?id=178214
+
+        Reviewed by Ryosuke Niwa.
+
+        * WebView/WebPDFView.mm:
+        (-[WebPDFView PDFViewWillClickOnLink:withURL:]):
+
 2017-10-11  Sam Weinig  <sam@webkit.org>
 
         Remove out-parameter variants of copyToVector
index 18e35a5bd04f9a040571711e777845f26c6c999e..1f1e86ff2e24725f67835fa011eafdfdaf77172e 100644 (file)
@@ -1033,7 +1033,7 @@ static BOOL isFrameInRange(WebFrame *frame, DOMRange *range)
             [nsEvent modifierFlags] & NSEventModifierFlagOption,
             [nsEvent modifierFlags] & NSEventModifierFlagShift,
             [nsEvent modifierFlags] & NSEventModifierFlagCommand,
-            button, 0, WebCore::ForceAtClick, 0, 0, true);
+            button, [NSEvent pressedMouseButtons], nullptr, WebCore::ForceAtClick, 0, nullptr, true);
     }
 
     // Call to the frame loader because this is where our security checks are made.