Changeset 182963 in webkit


Ignore:
Timestamp:
Apr 17, 2015 12:55:55 PM (9 years ago)
Author:
Beth Dakin
Message:

Force mouse events should go through normal mouse event handling code paths
https://bugs.webkit.org/show_bug.cgi?id=143749
-and corresponding-
rdar://problem/20472895

Reviewed by Dean Jackson.

Source/WebCore:

This patch moves all of the code to dispatch mouseforcedown, mouseforceup, and
mouseforcechanged into normal mouse event dispatching code. This patch leaves
behind the cancel and click events because we plan to remove those, and it also
leaves mouseforcewillbegin because that is necessarily a very different event more
tied to the NSImmediateActionGestureRecognizer than these other events which are
tied to NSResponder’s pressureChangeWithEvent.

New helper functions.

  • dom/Document.cpp:

(WebCore::Document::hasListenerTypeForEventType):

  • dom/Document.h:
  • dom/Element.cpp:

(WebCore::isForceEvent):

Move the code to ensure the force events have listeners in order to fire to
dispatchMouseEvent, and delete the old implementations.
(WebCore::Element::dispatchMouseEvent):
(WebCore::Element::dispatchMouseForceChanged): Deleted.
(WebCore::Element::dispatchMouseForceDown): Deleted.
(WebCore::Element::dispatchMouseForceUp): Deleted.

  • dom/Element.h:

Perform a hit test and pipe the events through dispatchMouseEvent().

  • page/EventHandler.cpp:

(WebCore::EventHandler::handleMouseForceEvent):

  • page/EventHandler.h:

New types for the new events.

  • platform/PlatformEvent.h:

Forward to EventHandler.

  • replay/UserInputBridge.cpp:

(WebCore::UserInputBridge::handleMouseForceEvent):

  • replay/UserInputBridge.h:

Source/WebKit2:

This patch makes pressureChangeWithEvent create NativeWebMouseEvents with the
NSEventTypePressures that is gets and sends those down to the web process.

Re-name pressureEvent to lastPressureEvent. Now that event can sometimes be an
NSEventTypePressure, the new name makes it clear how the second parameter differs
from the first.

  • Shared/NativeWebMouseEvent.h:

New event types for the new types of events.

  • Shared/WebEvent.h:
  • Shared/WebEventConversion.cpp:

(WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):

  • Shared/mac/NativeWebMouseEventMac.mm:

(WebKit::NativeWebMouseEvent::NativeWebMouseEvent):

  • Shared/mac/WebEventFactory.h:

All of the square-peg, round-hole problems of massaging the NSEventTypePressures
events into WebMouseEvents is taken care of here.

  • Shared/mac/WebEventFactory.mm:

(WebKit::mouseButtonForEvent):
(WebKit::globalPointForEvent):
(WebKit::pointForEvent):
(WebKit::WebEventFactory::createWebMouseEvent):

Instead of calling the old inputDeviceForceDidChange, create a NativeWebMouseEvent
and handle it.

  • UIProcess/API/mac/WKView.mm:

(-[WKView pressureChangeWithEvent:]):

Handle the new types.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didReceiveEvent):

Can delete inputDeviceForceDidChange since it’s no longer used.
(WebKit::WebPageProxy::inputDeviceForceDidChange): Deleted.

  • UIProcess/WebPageProxy.h:

Handle the new types of mouse events properly.

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::handleMouseEvent):

Delete inputDeviceForceDidChange() and m_lastForceStage.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/mac/WebPageMac.mm:

(WebKit::WebPage::inputDeviceForceDidChange): Deleted.

Handle new WebEvent types.

  • WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:

Tools:

Add mouseForceDown/mouseForceUp/mouseForceChanged support to WebKitTestRunner.
Since there is not a way to create an NSEventTypePressure from scratch, we
subclass NSEvent and override all of the critical methods.

  • WebKitTestRunner/EventSenderProxy.h:
  • WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
  • WebKitTestRunner/InjectedBundle/EventSendingController.cpp:

(WTR::EventSendingController::mouseForceDown):
(WTR::EventSendingController::mouseForceUp):
(WTR::EventSendingController::mouseForceChanged):

  • WebKitTestRunner/InjectedBundle/EventSendingController.h:
  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):

  • WebKitTestRunner/mac/EventSenderProxy.mm:

(-[EventSenderPressureEvent initAtLocation:globalLocation:stage:pressure:phase:time:eventNumber:]):
(-[EventSenderPressureEvent timestamp]):
(-[EventSenderPressureEvent type]):
(-[EventSenderPressureEvent locationInWindow]):
(-[EventSenderPressureEvent location]):
(-[EventSenderPressureEvent stage]):
(-[EventSenderPressureEvent pressure]):
(-[EventSenderPressureEvent phase]):
(-[EventSenderPressureEvent eventNumber]):
(WTR::EventSenderProxy::mouseForceDown):
(WTR::EventSenderProxy::mouseForceUp):
(WTR::EventSenderProxy::mouseForceChanged):

LayoutTests:

Just a few new tests. More to come.

  • fast/events/mouse-force-changed-expected.txt: Added.
  • fast/events/mouse-force-changed.html: Added.
  • fast/events/mouse-force-down-expected.txt: Added.
  • fast/events/mouse-force-down.html: Added.
  • fast/events/mouse-force-up-expected.txt: Added.
  • fast/events/mouse-force-up.html: Added.

Right now the new tests will only work on Mac 10.10.3 and beyond.

  • platform/efl/TestExpectations:
  • platform/gtk/TestExpectations:
  • platform/ios-simulator/TestExpectations:
  • platform/mac-mavericks/TestExpectations:
  • platform/win/TestExpectations:
Location:
trunk
Files:
6 added
39 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r182957 r182963  
     12015-04-17  Beth Dakin  <bdakin@apple.com>
     2
     3        Force mouse events should go through normal mouse event handling code paths
     4        https://bugs.webkit.org/show_bug.cgi?id=143749
     5        -and corresponding-
     6        rdar://problem/20472895
     7
     8        Reviewed by Dean Jackson.
     9
     10        Just a few new tests. More to come.
     11        * fast/events/mouse-force-changed-expected.txt: Added.
     12        * fast/events/mouse-force-changed.html: Added.
     13        * fast/events/mouse-force-down-expected.txt: Added.
     14        * fast/events/mouse-force-down.html: Added.
     15        * fast/events/mouse-force-up-expected.txt: Added.
     16        * fast/events/mouse-force-up.html: Added.
     17
     18        Right now the new tests will only work on Mac 10.10.3 and beyond.
     19        * platform/efl/TestExpectations:
     20        * platform/gtk/TestExpectations:
     21        * platform/ios-simulator/TestExpectations:
     22        * platform/mac-mavericks/TestExpectations:
     23        * platform/win/TestExpectations:
     24
    1252015-04-17  Daniel Bates  <dabates@apple.com>
    226
  • trunk/LayoutTests/platform/efl/TestExpectations

    r182957 r182963  
    6868animations/trigger-container-scroll-simple.html [ Skip ]
    6969animations/trigger-container-scroll-boundaries.html [ Skip ]
     70
     71# No support for force events
     72fast/events/mouse-force-changed.html [ Skip ]
     73fast/events/mouse-force-down.html [ Skip ]
     74fast/events/mouse-force-up.html [ Skip ]
    7075
    7176# ----------------------------------------
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r182957 r182963  
    638638
    639639webkit.org/b/143703 fast/forms/listbox-visible-size.html [ Failure ]
     640
     641# No support for force events
     642fast/events/mouse-force-changed.html [ Skip ]
     643fast/events/mouse-force-down.html [ Skip ]
     644fast/events/mouse-force-up.html [ Skip ]
    640645
    641646#////////////////////////////////////////////////////////////////////////////////////////
  • trunk/LayoutTests/platform/ios-simulator/TestExpectations

    r182957 r182963  
    205205http/tests/local/fileapi/send-dragged-file.html
    206206http/tests/local/fileapi/send-sliced-dragged-file.html
     207
     208# No support for force events
     209fast/events/mouse-force-changed.html [ Skip ]
     210fast/events/mouse-force-down.html [ Skip ]
     211fast/events/mouse-force-up.html [ Skip ]
    207212
    208213###
  • trunk/LayoutTests/platform/mac-mavericks/TestExpectations

    r182956 r182963  
    11# https://bugs.webkit.org/show_bug.cgi?id=143258
    22http/tests/cache/disk-cache/disk-cache-validation-back-navigation-policy.html
     3
     4# No support for force events
     5fast/events/mouse-force-changed.html [ Skip ]
     6fast/events/mouse-force-down.html [ Skip ]
     7fast/events/mouse-force-up.html [ Skip ]
  • trunk/LayoutTests/platform/mac-wk2/TestExpectations

    r182957 r182963  
    277277fast/events/mouse-force-up.html [ Skip ]
    278278
     279# These should work on 10.10.3 and later, but our bots need to get the 10.10.3 SDK first.
     280fast/events/mouse-force-changed.html [ Skip ]
     281fast/events/mouse-force-down.html [ Skip ]
     282fast/events/mouse-force-up.html [ Skip ]
     283
    279284### END OF (2) Classified failures without bug reports (yet)
    280285########################################
  • trunk/LayoutTests/platform/win/TestExpectations

    r182956 r182963  
    603603animations/trigger-container-scroll-simple.html [ Skip ]
    604604animations/trigger-container-scroll-boundaries.html [ Skip ]
     605
     606# No support for force events
     607fast/events/mouse-force-changed.html [ Skip ]
     608fast/events/mouse-force-down.html [ Skip ]
     609fast/events/mouse-force-up.html [ Skip ]
    605610
    606611################################################################################
  • trunk/Source/WebCore/ChangeLog

    r182962 r182963  
     12015-04-17  Beth Dakin  <bdakin@apple.com>
     2
     3        Force mouse events should go through normal mouse event handling code paths
     4        https://bugs.webkit.org/show_bug.cgi?id=143749
     5        -and corresponding-
     6        rdar://problem/20472895
     7
     8        Reviewed by Dean Jackson.
     9
     10        This patch moves all of the code to dispatch mouseforcedown, mouseforceup, and
     11        mouseforcechanged into normal mouse event dispatching code. This patch leaves
     12        behind the cancel and click events because we plan to remove those, and it also
     13        leaves mouseforcewillbegin because that is necessarily a very different event more
     14        tied to the NSImmediateActionGestureRecognizer than these other events which are
     15        tied to NSResponder’s pressureChangeWithEvent.
     16
     17        New helper functions.
     18        * dom/Document.cpp:
     19        (WebCore::Document::hasListenerTypeForEventType):
     20        * dom/Document.h:
     21        * dom/Element.cpp:
     22        (WebCore::isForceEvent):
     23
     24        Move the code to ensure the force events have listeners in order to fire to
     25        dispatchMouseEvent, and delete the old implementations.
     26        (WebCore::Element::dispatchMouseEvent):
     27        (WebCore::Element::dispatchMouseForceChanged): Deleted.
     28        (WebCore::Element::dispatchMouseForceDown): Deleted.
     29        (WebCore::Element::dispatchMouseForceUp): Deleted.
     30        * dom/Element.h:
     31
     32        Perform a hit test and pipe the events through dispatchMouseEvent().
     33        * page/EventHandler.cpp:
     34        (WebCore::EventHandler::handleMouseForceEvent):
     35        * page/EventHandler.h:
     36
     37        New types for the new events.
     38        * platform/PlatformEvent.h:
     39
     40        Forward to EventHandler.
     41        * replay/UserInputBridge.cpp:
     42        (WebCore::UserInputBridge::handleMouseForceEvent):
     43        * replay/UserInputBridge.h:
     44
    1452015-04-17  Zalan Bujtas  <zalan@apple.com>
    246
  • trunk/Source/WebCore/dom/Document.cpp

    r182956 r182963  
    39673967}
    39683968
     3969bool Document::hasListenerTypeForEventType(PlatformEvent::Type eventType) const
     3970{
     3971    switch (eventType) {
     3972    case PlatformEvent::MouseForceChanged:
     3973        return m_listenerTypes & Document::FORCECHANGED_LISTENER;
     3974    case PlatformEvent::MouseForceDown:
     3975        return m_listenerTypes & Document::FORCEDOWN_LISTENER;
     3976    case PlatformEvent::MouseForceUp:
     3977        return m_listenerTypes & Document::FORCEUP_LISTENER;
     3978    case PlatformEvent::MouseScroll:
     3979        return m_listenerTypes & Document::SCROLL_LISTENER;
     3980    default:
     3981        return false;
     3982    }
     3983}
     3984
    39693985void Document::addListenerTypeIfNeeded(const AtomicString& eventType)
    39703986{
  • trunk/Source/WebCore/dom/Document.h

    r182956 r182963  
    3939#include "MutationObserver.h"
    4040#include "PageVisibilityState.h"
     41#include "PlatformEvent.h"
    4142#include "PlatformScreen.h"
    4243#include "ReferrerPolicy.h"
     
    781782
    782783    bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); }
     784    bool hasListenerTypeForEventType(PlatformEvent::Type) const;
    783785    void addListenerTypeIfNeeded(const AtomicString& eventType);
    784786
  • trunk/Source/WebCore/dom/Element.cpp

    r182956 r182963  
    245245}
    246246
     247static bool isForceEvent(const PlatformMouseEvent& platformEvent)
     248{
     249    return platformEvent.type() == PlatformEvent::MouseForceChanged || platformEvent.type() == PlatformEvent::MouseForceDown || platformEvent.type() == PlatformEvent::MouseForceUp;
     250}
     251
    247252bool Element::dispatchMouseEvent(const PlatformMouseEvent& platformEvent, const AtomicString& eventType, int detail, Element* relatedTarget)
    248253{
    249254    if (isDisabledFormControl())
     255        return false;
     256
     257    if (isForceEvent(platformEvent) && !document().hasListenerTypeForEventType(platformEvent.type()))
    250258        return false;
    251259
     
    22542262}
    22552263
    2256 void Element::dispatchMouseForceChanged(float force)
    2257 {
    2258     if (!document().hasListenerType(Document::FORCECHANGED_LISTENER))
     2264void Element::dispatchMouseForceClick()
     2265{
     2266    if (!document().hasListenerType(Document::FORCECLICK_LISTENER))
    22592267        return;
    22602268
     
    22632271        return;
    22642272
    2265     PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), force);
    2266     RefPtr<MouseEvent> mouseForceChangedEvent =  MouseEvent::create(eventNames().webkitmouseforcechangedEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
    2267 
    2268     mouseForceChangedEvent->setTarget(this);
    2269     dispatchEvent(mouseForceChangedEvent);
    2270 }
    2271 
    2272 void Element::dispatchMouseForceDown()
    2273 {
    2274     if (!document().hasListenerType(Document::FORCEDOWN_LISTENER))
     2273    PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
     2274    RefPtr<MouseEvent> mouseForceClickEvent =  MouseEvent::create(eventNames().webkitmouseforceclickEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
     2275
     2276    mouseForceClickEvent->setTarget(this);
     2277    dispatchEvent(mouseForceClickEvent);
     2278}
     2279
     2280void Element::dispatchMouseForceCancelled()
     2281{
     2282    if (!document().hasListenerType(Document::FORCECANCELLED_LISTENER))
    22752283        return;
    22762284
     
    22792287        return;
    22802288
    2281     PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
    2282     RefPtr<MouseEvent> mouseForceDownEvent =  MouseEvent::create(eventNames().webkitmouseforcedownEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
    2283 
    2284     mouseForceDownEvent->setTarget(this);
    2285     dispatchEvent(mouseForceDownEvent);
    2286 }
    2287 
    2288 void Element::dispatchMouseForceUp()
    2289 {
    2290     if (!document().hasListenerType(Document::FORCEUP_LISTENER))
    2291         return;
    2292 
    2293     Frame* frame = document().frame();
    2294     if (!frame)
    2295         return;
    2296 
    2297     PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
    2298     RefPtr<MouseEvent> mouseForceUpEvent =  MouseEvent::create(eventNames().webkitmouseforceupEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
    2299 
    2300     mouseForceUpEvent->setTarget(this);
    2301     dispatchEvent(mouseForceUpEvent);
    2302 }
    2303 
    2304 void Element::dispatchMouseForceClick()
    2305 {
    2306     if (!document().hasListenerType(Document::FORCECLICK_LISTENER))
    2307         return;
    2308 
    2309     Frame* frame = document().frame();
    2310     if (!frame)
    2311         return;
    2312 
    2313     PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
    2314     RefPtr<MouseEvent> mouseForceClickEvent =  MouseEvent::create(eventNames().webkitmouseforceclickEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
    2315 
    2316     mouseForceClickEvent->setTarget(this);
    2317     dispatchEvent(mouseForceClickEvent);
    2318 }
    2319 
    2320 void Element::dispatchMouseForceCancelled()
    2321 {
    2322     if (!document().hasListenerType(Document::FORCECANCELLED_LISTENER))
    2323         return;
    2324 
    2325     Frame* frame = document().frame();
    2326     if (!frame)
    2327         return;
    2328 
    23292289    PlatformMouseEvent platformMouseEvent(frame->eventHandler().lastKnownMousePosition(), frame->eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), 0);
    23302290    RefPtr<MouseEvent> mouseForceCancelledEvent =  MouseEvent::create(eventNames().webkitmouseforcecancelledEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
     
    23392299{
    23402300    return false;
    2341 }
    2342 
    2343 void Element::dispatchMouseForceChanged(float)
    2344 {
    2345 }
    2346 
    2347 void Element::dispatchMouseForceDown()
    2348 {
    2349 }
    2350 
    2351 void Element::dispatchMouseForceUp()
    2352 {
    23532301}
    23542302
  • trunk/Source/WebCore/dom/Element.h

    r182956 r182963  
    470470
    471471    WEBCORE_EXPORT bool dispatchMouseForceWillBegin();
    472     WEBCORE_EXPORT void dispatchMouseForceChanged(float force);
    473     WEBCORE_EXPORT void dispatchMouseForceDown();
    474     WEBCORE_EXPORT void dispatchMouseForceUp();
    475472    WEBCORE_EXPORT void dispatchMouseForceClick();
    476473    WEBCORE_EXPORT void dispatchMouseForceCancelled();
  • trunk/Source/WebCore/page/EventHandler.cpp

    r182957 r182963  
    21052105}
    21062106
     2107#if ENABLE(MOUSE_FORCE_EVENTS)
     2108bool EventHandler::handleMouseForceEvent(const PlatformMouseEvent& event)
     2109{
     2110    RefPtr<FrameView> protector(m_frame.view());
     2111
     2112    setLastKnownMousePosition(event);
     2113
     2114    HitTestRequest::HitTestRequestType hitType = HitTestRequest::DisallowShadowContent | HitTestRequest::Active;
     2115
     2116    HitTestRequest request(hitType);
     2117    MouseEventWithHitTestResults mouseEvent = prepareMouseEvent(request, event);
     2118
     2119    bool swallowedEvent = !dispatchMouseEvent(eventNames().webkitmouseforcechangedEvent, mouseEvent.targetNode(), false, 0, event, false);
     2120    if (event.type() == PlatformEvent::MouseForceDown)
     2121        swallowedEvent |= !dispatchMouseEvent(eventNames().webkitmouseforcedownEvent, mouseEvent.targetNode(), false, 0, event, false);
     2122    if (event.type() == PlatformEvent::MouseForceUp)
     2123        swallowedEvent |= !dispatchMouseEvent(eventNames().webkitmouseforceupEvent, mouseEvent.targetNode(), false, 0, event, false);
     2124
     2125    return swallowedEvent;
     2126}
     2127#else
     2128bool EventHandler::handleMouseForceEvent(const PlatformMouseEvent& )
     2129{
     2130    return false;
     2131}
     2132#endif // #if ENABLE(MOUSE_FORCE_EVENTS)
     2133
    21072134bool EventHandler::handlePasteGlobalSelection(const PlatformMouseEvent& platformMouseEvent)
    21082135{
  • trunk/Source/WebCore/page/EventHandler.h

    r182956 r182963  
    203203    bool handleMouseMoveEvent(const PlatformMouseEvent&, HitTestResult* hoveredNode = 0, bool onlyUpdateScrollbars = false);
    204204    WEBCORE_EXPORT bool handleMouseReleaseEvent(const PlatformMouseEvent&);
     205    bool handleMouseForceEvent(const PlatformMouseEvent&);
    205206    WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&);
    206207    void defaultWheelEventHandler(Node*, WheelEvent*);
  • trunk/Source/WebCore/platform/PlatformEvent.h

    r182956 r182963  
    4444        MousePressed,
    4545        MouseReleased,
     46        MouseForceChanged,
     47        MouseForceDown,
     48        MouseForceUp,
    4649        MouseScroll,
    4750
  • trunk/Source/WebCore/replay/UserInputBridge.cpp

    r182956 r182963  
    148148}
    149149
     150bool UserInputBridge::handleMouseForceEvent(const PlatformMouseEvent& mouseEvent, InputSource)
     151{
     152    return m_page.mainFrame().eventHandler().handleMouseForceEvent(mouseEvent);
     153}
     154
    150155bool UserInputBridge::handleKeyEvent(const PlatformKeyboardEvent& keyEvent, InputSource inputSource)
    151156{
  • trunk/Source/WebCore/replay/UserInputBridge.h

    r182956 r182963  
    7979    WEBCORE_EXPORT bool handleMouseMoveEvent(const PlatformMouseEvent&, InputSource source = InputSource::User);
    8080    WEBCORE_EXPORT bool handleMouseMoveOnScrollbarEvent(const PlatformMouseEvent&, InputSource source = InputSource::User);
     81    WEBCORE_EXPORT bool handleMouseForceEvent(const PlatformMouseEvent&, InputSource = InputSource::User);
    8182    WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&, InputSource source = InputSource::User);
    8283    WEBCORE_EXPORT bool handleKeyEvent(const PlatformKeyboardEvent&, InputSource source = InputSource::User);
  • trunk/Source/WebKit2/ChangeLog

    r182956 r182963  
     12015-04-17  Beth Dakin  <bdakin@apple.com>
     2
     3        Force mouse events should go through normal mouse event handling code paths
     4        https://bugs.webkit.org/show_bug.cgi?id=143749
     5        -and corresponding-
     6        rdar://problem/20472895
     7
     8        Reviewed by Dean Jackson.
     9
     10        This patch makes pressureChangeWithEvent create NativeWebMouseEvents with the
     11        NSEventTypePressures that is gets and sends those down to the web process.
     12
     13        Re-name pressureEvent to lastPressureEvent. Now that event can sometimes be an
     14        NSEventTypePressure, the new name makes it clear how the second parameter differs
     15        from the first.
     16        * Shared/NativeWebMouseEvent.h:
     17
     18        New event types for the new types of events.
     19        * Shared/WebEvent.h:
     20        * Shared/WebEventConversion.cpp:
     21        (WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
     22        * Shared/mac/NativeWebMouseEventMac.mm:
     23        (WebKit::NativeWebMouseEvent::NativeWebMouseEvent):
     24        * Shared/mac/WebEventFactory.h:
     25
     26        All of the square-peg, round-hole problems of massaging the NSEventTypePressures
     27        events into WebMouseEvents is taken care of here.
     28        * Shared/mac/WebEventFactory.mm:
     29        (WebKit::mouseButtonForEvent):
     30        (WebKit::globalPointForEvent):
     31        (WebKit::pointForEvent):
     32        (WebKit::WebEventFactory::createWebMouseEvent):
     33
     34        Instead of calling the old inputDeviceForceDidChange, create a NativeWebMouseEvent
     35        and handle it.
     36        * UIProcess/API/mac/WKView.mm:
     37        (-[WKView pressureChangeWithEvent:]):
     38
     39        Handle the new types.
     40        * UIProcess/WebPageProxy.cpp:
     41        (WebKit::WebPageProxy::didReceiveEvent):
     42
     43        Can delete inputDeviceForceDidChange since it’s no longer used.
     44        (WebKit::WebPageProxy::inputDeviceForceDidChange): Deleted.
     45        * UIProcess/WebPageProxy.h:
     46
     47        Handle the new types of mouse events properly.
     48        * WebProcess/WebPage/WebPage.cpp:
     49        (WebKit::handleMouseEvent):
     50
     51        Delete inputDeviceForceDidChange() and m_lastForceStage.
     52        * WebProcess/WebPage/WebPage.h:
     53        * WebProcess/WebPage/WebPage.messages.in:
     54        * WebProcess/WebPage/mac/WebPageMac.mm:
     55        (WebKit::WebPage::inputDeviceForceDidChange): Deleted.
     56
     57        Handle new WebEvent types.
     58        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
     59
    1602015-04-17  Commit Queue  <commit-queue@webkit.org>
    261
  • trunk/Source/WebKit2/Shared/NativeWebMouseEvent.h

    r182956 r182963  
    5050public:
    5151#if USE(APPKIT)
    52     NativeWebMouseEvent(NSEvent *, NSEvent *pressureEvent, NSView *);
     52    NativeWebMouseEvent(NSEvent *, NSEvent *lastPressureEvent, NSView *);
    5353#elif PLATFORM(GTK)
    5454    NativeWebMouseEvent(const NativeWebMouseEvent&);
  • trunk/Source/WebKit2/Shared/WebEvent.h

    r182956 r182963  
    5959        MouseUp,
    6060        MouseMove,
     61        MouseForceChanged,
     62        MouseForceDown,
     63        MouseForceUp,
    6164
    6265        // WebWheelEvent
  • trunk/Source/WebKit2/Shared/WebEventConversion.cpp

    r182956 r182963  
    4949            m_force = webEvent.force();
    5050            break;
     51        case WebEvent::MouseForceChanged:
     52            m_type = WebCore::PlatformEvent::MouseForceChanged;
     53            m_force = webEvent.force();
     54            break;
     55        case WebEvent::MouseForceDown:
     56            m_type = WebCore::PlatformEvent::MouseForceDown;
     57            m_force = WebCore::ForceAtForceClick;
     58            break;
     59        case WebEvent::MouseForceUp:
     60            m_type = WebCore::PlatformEvent::MouseForceUp;
     61            m_force = WebCore::ForceAtForceClick;
     62            break;
    5163        default:
    5264            ASSERT_NOT_REACHED();
  • trunk/Source/WebKit2/Shared/mac/NativeWebMouseEventMac.mm

    r182956 r182963  
    3333namespace WebKit {
    3434
    35 NativeWebMouseEvent::NativeWebMouseEvent(NSEvent *event, NSEvent *pressureEvent, NSView *view)
    36     : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, pressureEvent, view))
     35NativeWebMouseEvent::NativeWebMouseEvent(NSEvent *event, NSEvent *lastPressureEvent, NSView *view)
     36    : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, lastPressureEvent, view))
    3737    , m_nativeEvent(event)
    3838{
  • trunk/Source/WebKit2/Shared/mac/WebEventFactory.h

    r182956 r182963  
    4343public:
    4444#if USE(APPKIT)
    45     static WebMouseEvent createWebMouseEvent(NSEvent *, NSEvent *pressureEvent, NSView *windowView);
     45    static WebMouseEvent createWebMouseEvent(NSEvent *, NSEvent *lastPressureEvent, NSView *windowView);
    4646    static WebWheelEvent createWebWheelEvent(NSEvent *, NSView *windowView);
    4747    static WebKeyboardEvent createWebKeyboardEvent(NSEvent *, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>&);
  • trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm

    r182956 r182963  
    7777        case NSOtherMouseDragged:
    7878            return WebMouseEvent::MiddleButton;
     79#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     80        case NSEventTypePressure:
     81#endif
    7982        case NSMouseEntered:
    8083        case NSMouseExited:
     
    157160{
    158161    switch ([event type]) {
    159         case NSLeftMouseDown:
    160         case NSLeftMouseDragged:
    161         case NSLeftMouseUp:
    162         case NSMouseEntered:
    163         case NSMouseExited:
    164         case NSMouseMoved:
    165         case NSOtherMouseDown:
    166         case NSOtherMouseDragged:
    167         case NSOtherMouseUp:
    168         case NSRightMouseDown:
    169         case NSRightMouseDragged:
    170         case NSRightMouseUp:
    171         case NSScrollWheel:
    172             return globalPoint([event locationInWindow], [event window]);
    173         default:
    174             return NSZeroPoint;
     162#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     163    case NSEventTypePressure:
     164#endif
     165    case NSLeftMouseDown:
     166    case NSLeftMouseDragged:
     167    case NSLeftMouseUp:
     168    case NSMouseEntered:
     169    case NSMouseExited:
     170    case NSMouseMoved:
     171    case NSOtherMouseDown:
     172    case NSOtherMouseDragged:
     173    case NSOtherMouseUp:
     174    case NSRightMouseDown:
     175    case NSRightMouseDragged:
     176    case NSRightMouseUp:
     177    case NSScrollWheel:
     178        return globalPoint([event locationInWindow], [event window]);
     179    default:
     180        return NSZeroPoint;
    175181    }
    176182}
     
    179185{
    180186    switch ([event type]) {
    181         case NSLeftMouseDown:
    182         case NSLeftMouseDragged:
    183         case NSLeftMouseUp:
    184         case NSMouseEntered:
    185         case NSMouseExited:
    186         case NSMouseMoved:
    187         case NSOtherMouseDown:
    188         case NSOtherMouseDragged:
    189         case NSOtherMouseUp:
    190         case NSRightMouseDown:
    191         case NSRightMouseDragged:
    192         case NSRightMouseUp:
    193         case NSScrollWheel: {
    194             // Note: This will have its origin at the bottom left of the window unless windowView is flipped.
    195             // In those cases, the Y coordinate gets flipped by Widget::convertFromContainingWindow.
    196             NSPoint location = [event locationInWindow];
    197             if (windowView)
    198                 location = [windowView convertPoint:location fromView:nil];
    199             return location;
    200         }
    201         default:
    202             return NSZeroPoint;
     187#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     188    case NSEventTypePressure:
     189#endif
     190    case NSLeftMouseDown:
     191    case NSLeftMouseDragged:
     192    case NSLeftMouseUp:
     193    case NSMouseEntered:
     194    case NSMouseExited:
     195    case NSMouseMoved:
     196    case NSOtherMouseDown:
     197    case NSOtherMouseDragged:
     198    case NSOtherMouseUp:
     199    case NSRightMouseDown:
     200    case NSRightMouseDragged:
     201    case NSRightMouseUp:
     202    case NSScrollWheel: {
     203        // Note: This will have its origin at the bottom left of the window unless windowView is flipped.
     204        // In those cases, the Y coordinate gets flipped by Widget::convertFromContainingWindow.
     205        NSPoint location = [event locationInWindow];
     206        if (windowView)
     207            location = [windowView convertPoint:location fromView:nil];
     208        return location;
     209    }
     210    default:
     211        return NSZeroPoint;
    203212    }
    204213}
     
    359368}
    360369
    361 WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *pressureEvent, NSView *windowView)
     370WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *lastPressureEvent, NSView *windowView)
    362371{
    363372    NSPoint position = pointForEvent(event, windowView);
    364373    NSPoint globalPosition = globalPointForEvent(event);
    365374
    366     WebEvent::Type type                     = mouseEventTypeForEvent(event);
    367     WebMouseEvent::Button button            = mouseButtonForEvent(event);
    368     float deltaX                            = [event deltaX];
    369     float deltaY                            = [event deltaY];
    370     float deltaZ                            = [event deltaZ];
    371     int clickCount                          = clickCountForEvent(event);
    372     WebEvent::Modifiers modifiers           = modifiersForEvent(event);
    373     double timestamp                        = eventTimeStampSince1970(event);
    374     int eventNumber                         = [event eventNumber];
    375     int menuTypeForEvent                    = typeForEvent(event);
     375    WebEvent::Type type = mouseEventTypeForEvent(event);
     376#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     377    if ([event type] == NSEventTypePressure) {
     378        // Since AppKit doesn't send mouse events for force down or force up, we have to use the current pressure
     379        // event and lastPressureEvent to detect if this is MouseForceDown, MouseForceUp, or just MouseForceChanged.
     380        if (lastPressureEvent.stage == 1 && event.stage == 2)
     381            type = WebEvent::MouseForceDown;
     382        else if (lastPressureEvent.stage == 2 && event.stage == 1)
     383            type = WebEvent::MouseForceUp;
     384        else
     385            type = WebEvent::MouseForceChanged;
     386    }
     387#endif
     388
     389    WebMouseEvent::Button button = mouseButtonForEvent(event);
     390    float deltaX = [event deltaX];
     391    float deltaY = [event deltaY];
     392    float deltaZ = [event deltaZ];
     393    int clickCount = clickCountForEvent(event);
     394    WebEvent::Modifiers modifiers = modifiersForEvent(event);
     395    double timestamp = eventTimeStampSince1970(event);
     396    int eventNumber = [event eventNumber];
     397    int menuTypeForEvent = typeForEvent(event);
    376398
    377399    double force = 0;
    378 #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
    379     force = pressureEvent.stage < 1 ? pressureEvent.pressure : pressureEvent.pressure + pressureEvent.stage - 1;
     400#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     401    int stage = [event type] == NSEventTypePressure ? event.stage : lastPressureEvent.stage;
     402    double pressure = [event type] == NSEventTypePressure ? event.pressure : lastPressureEvent.pressure;
     403    force = stage < 1 ? pressure : pressure + stage - 1;
    380404#endif
    381405
  • trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm

    r182956 r182963  
    14281428- (void)pressureChangeWithEvent:(NSEvent *)event
    14291429{
    1430 #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     1430#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
    14311431    if (event == _data->_pressureEvent)
    14321432        return;
    14331433
     1434    if (_data->_ignoresNonWheelEvents)
     1435        return;
     1436
    14341437    if (event.phase != NSEventPhaseChanged && event.phase != NSEventPhaseBegan && event.phase != NSEventPhaseEnded)
    14351438        return;
     1439
     1440    NativeWebMouseEvent webEvent(event, _data->_pressureEvent, self);
     1441    _data->_page->handleMouseEvent(webEvent);
    14361442
    14371443    [_data->_pressureEvent release];
    14381444    _data->_pressureEvent = [event retain];
    1439 
    1440     _data->_page->inputDeviceForceDidChange(event.pressure, event.stage);
    14411445#endif
    14421446}
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r182956 r182963  
    43984398    case WebEvent::MouseDown:
    43994399    case WebEvent::MouseUp:
     4400    case WebEvent::MouseForceChanged:
     4401    case WebEvent::MouseForceDown:
     4402    case WebEvent::MouseForceUp:
    44004403    case WebEvent::Wheel:
    44014404    case WebEvent::KeyDown:
     
    44274430    case WebEvent::MouseUp:
    44284431        m_currentlyProcessedMouseDownEvent = nullptr;
     4432        break;
     4433    case WebEvent::MouseForceChanged:
     4434    case WebEvent::MouseForceDown:
     4435    case WebEvent::MouseForceUp:
    44294436        break;
    44304437
     
    56755682}
    56765683
    5677 void WebPageProxy::inputDeviceForceDidChange(float force, int stage)
    5678 {
    5679     m_process->send(Messages::WebPage::InputDeviceForceDidChange(force, stage), m_pageID);
    5680 }
    5681 
    56825684void WebPageProxy::immediateActionDidUpdate()
    56835685{
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r182956 r182963  
    995995    void focusAndSelectLastActionMenuHitTestResult();
    996996
    997     void inputDeviceForceDidChange(float force, int stage);
    998997    void immediateActionDidUpdate();
    999998    void immediateActionDidCancel();
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp

    r182956 r182963  
    475475        setXMotionEventFields(xEvent, event, convertToRootView(IntPoint()));
    476476        break;
     477    case WebEvent::MouseForceChanged:
     478    case WebEvent::MouseForceDown:
     479    case WebEvent::MouseForceUp:
    477480    case WebEvent::NoType:
    478481    case WebEvent::Wheel:
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r182956 r182963  
    19041904                return page->corePage()->userInputBridge().handleMouseMoveOnScrollbarEvent(platformMouseEvent);
    19051905            return page->corePage()->userInputBridge().handleMouseMoveEvent(platformMouseEvent);
     1906
     1907        case PlatformEvent::MouseForceChanged:
     1908        case PlatformEvent::MouseForceDown:
     1909        case PlatformEvent::MouseForceUp:
     1910            return page->corePage()->userInputBridge().handleMouseForceEvent(platformMouseEvent);
     1911
    19061912        default:
    19071913            ASSERT_NOT_REACHED();
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r182956 r182963  
    10951095    void selectLastActionMenuRange();
    10961096    void focusAndSelectLastActionMenuHitTestResult();
    1097     void inputDeviceForceDidChange(float force, int stage);
    10981097    void immediateActionDidUpdate();
    10991098    void immediateActionDidCancel();
     
    13561355    WebCore::HitTestResult m_lastActionMenuHitTestResult;
    13571356    RefPtr<WebPageOverlay> m_lastActionMenuHitPageOverlay;
    1358     int m_lastForceStage { 0 };
    13591357#endif
    13601358
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r182956 r182963  
    408408    SelectLastActionMenuRange()
    409409    FocusAndSelectLastActionMenuHitTestResult()
    410     InputDeviceForceDidChange(float force, int stage)
    411410    ImmediateActionDidUpdate()
    412411    ImmediateActionDidCancel()
  • trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm

    r182956 r182963  
    11421142}
    11431143
    1144 void WebPage::inputDeviceForceDidChange(float force, int stage)
    1145 {
    1146     Element* element = m_lastActionMenuHitTestResult.innerElement();
    1147     if (!element)
    1148         return;
    1149 
    1150     float overallForce = stage < 1 ? force : force + stage - 1;
    1151     element->dispatchMouseForceChanged(overallForce);
    1152 
    1153     if (m_lastForceStage == 1 && stage == 2)
    1154         element->dispatchMouseForceDown();
    1155     else if (m_lastForceStage == 2 && stage == 1) {
    1156         element->dispatchMouseForceUp();
    1157         element->dispatchMouseForceClick();
    1158     }
    1159 
    1160     m_lastForceStage = stage;
    1161 }
    1162 
    11631144void WebPage::immediateActionDidUpdate()
    11641145{
  • trunk/Tools/ChangeLog

    r182960 r182963  
     12015-04-17  Beth Dakin  <bdakin@apple.com>
     2
     3        Force mouse events should go through normal mouse event handling code paths
     4        https://bugs.webkit.org/show_bug.cgi?id=143749
     5        -and corresponding-
     6        rdar://problem/20472895
     7
     8        Reviewed by Dean Jackson.
     9
     10        Add mouseForceDown/mouseForceUp/mouseForceChanged support to WebKitTestRunner.
     11        Since there is not a way to create an NSEventTypePressure from scratch, we
     12        subclass NSEvent and override all of the critical methods.
     13
     14        * WebKitTestRunner/EventSenderProxy.h:
     15        * WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
     16        * WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
     17        (WTR::EventSendingController::mouseForceDown):
     18        (WTR::EventSendingController::mouseForceUp):
     19        (WTR::EventSendingController::mouseForceChanged):
     20        * WebKitTestRunner/InjectedBundle/EventSendingController.h:
     21        * WebKitTestRunner/TestController.cpp:
     22        (WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
     23        * WebKitTestRunner/mac/EventSenderProxy.mm:
     24        (-[EventSenderPressureEvent initAtLocation:globalLocation:stage:pressure:phase:time:eventNumber:]):
     25        (-[EventSenderPressureEvent timestamp]):
     26        (-[EventSenderPressureEvent type]):
     27        (-[EventSenderPressureEvent locationInWindow]):
     28        (-[EventSenderPressureEvent location]):
     29        (-[EventSenderPressureEvent stage]):
     30        (-[EventSenderPressureEvent pressure]):
     31        (-[EventSenderPressureEvent phase]):
     32        (-[EventSenderPressureEvent eventNumber]):
     33        (WTR::EventSenderProxy::mouseForceDown):
     34        (WTR::EventSenderProxy::mouseForceUp):
     35        (WTR::EventSenderProxy::mouseForceChanged):
     36
    1372015-04-17  Alexey Proskuryakov  <ap@apple.com>
    238
  • trunk/Tools/WebKitTestRunner/EventSenderProxy.h

    r182956 r182963  
    5959    void mouseDown(unsigned button, WKEventModifiers);
    6060    void mouseUp(unsigned button, WKEventModifiers);
     61    void mouseForceDown();
     62    void mouseForceUp();
     63    void mouseForceChanged(float);
    6164    void mouseMoveTo(double x, double y);
    6265    void mouseScrollBy(int x, int y);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl

    r182956 r182963  
    2828    void mouseUp(long buttonNumber, object modifierArray);
    2929    void mouseMoveTo(long x, long y);
     30    void mouseForceDown();
     31    void mouseForceUp();
     32    void mouseForceChanged(double force);
    3033    void mouseScrollBy(long x, long y);
    3134    void mouseScrollByWithWheelAndMomentumPhases(long x, long y, DOMString phase, DOMString momentum, optional boolean asyncScrolling);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp

    r182956 r182963  
    254254}
    255255
     256void EventSendingController::mouseForceDown()
     257{
     258    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
     259    WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate());
     260
     261    WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage"));
     262    WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceDown"));
     263    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
     264
     265    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
     266}
     267
     268void EventSendingController::mouseForceUp()
     269{
     270    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
     271    WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate());
     272
     273    WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage"));
     274    WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceUp"));
     275    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
     276
     277    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
     278}
     279
     280void EventSendingController::mouseForceChanged(double force)
     281{
     282    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
     283    WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate());
     284
     285    WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage"));
     286    WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseForceChanged"));
     287    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
     288
     289    WKRetainPtr<WKStringRef> forceKey(AdoptWK, WKStringCreateWithUTF8CString("Force"));
     290    WKRetainPtr<WKDoubleRef> forceRef(AdoptWK, WKDoubleCreate(force));
     291    WKDictionarySetItem(EventSenderMessageBody.get(), forceKey.get(), forceRef.get());
     292
     293    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()->page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
     294}
     295
    256296void EventSendingController::leapForward(int milliseconds)
    257297{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h

    r182956 r182963  
    4747    void mouseUp(int button, JSValueRef modifierArray);
    4848    void mouseMoveTo(int x, int y);
     49    void mouseForceDown();
     50    void mouseForceUp();
     51    void mouseForceChanged(double force);
    4952    void mouseScrollBy(int x, int y);
    5053    void mouseScrollByWithWheelAndMomentumPhases(int x, int y, JSStringRef phase, JSStringRef momentum, bool asyncScrolling);
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r182956 r182963  
    11031103        }
    11041104
     1105#if PLATFORM(MAC)
     1106        if (WKStringIsEqualToUTF8CString(subMessageName, "MouseForceDown")) {
     1107            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), true);
     1108            m_eventSenderProxy->mouseForceDown();
     1109            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), false);
     1110            return 0;
     1111        }
     1112
     1113        if (WKStringIsEqualToUTF8CString(subMessageName, "MouseForceUp")) {
     1114            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), true);
     1115            m_eventSenderProxy->mouseForceUp();
     1116            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), false);
     1117            return 0;
     1118        }
     1119
     1120        if (WKStringIsEqualToUTF8CString(subMessageName, "MouseForceChanged")) {
     1121            WKRetainPtr<WKStringRef> forceKey = adoptWK(WKStringCreateWithUTF8CString("Force"));
     1122            double force = WKDoubleGetValue(static_cast<WKDoubleRef>(WKDictionaryGetItemForKey(messageBodyDictionary, forceKey.get())));
     1123
     1124            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), true);
     1125            m_eventSenderProxy->mouseForceChanged(force);
     1126            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), false);
     1127            return 0;
     1128        }
     1129#endif // PLATFORM(MAC)
     1130
    11051131        if (WKStringIsEqualToUTF8CString(subMessageName, "MouseScrollBy")) {
    11061132            WKRetainPtr<WKStringRef> xKey = adoptWK(WKStringCreateWithUTF8CString("X"));
  • trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm

    r182956 r182963  
    3939- (void)_setCurrentEvent:(NSEvent *)event;
    4040@end
     41
     42#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     43@interface EventSenderPressureEvent : NSEvent {
     44@public
     45    NSPoint _eventSender_locationInWindow;
     46    NSPoint _eventSender_location;
     47    NSInteger _eventSender_stage;
     48    float _eventSender_pressure;
     49    NSEventPhase _eventSender_phase;
     50    NSTimeInterval _eventSender_timestamp;
     51    NSInteger _eventSender_eventNumber;
     52}
     53
     54- (id)initAtLocation:(NSPoint)location globalLocation:(NSPoint)globalLocation stage:(NSInteger)stage pressure:(float)pressure phase:(NSEventPhase)phase time:(NSTimeInterval)time eventNumber:(NSInteger)eventNumber;
     55- (NSTimeInterval)timestamp;
     56@end
     57
     58@implementation EventSenderPressureEvent
     59
     60- (id)initAtLocation:(NSPoint)location globalLocation:(NSPoint)globalLocation stage:(NSInteger)stage pressure:(float)pressure phase:(NSEventPhase)phase time:(NSTimeInterval)time eventNumber:(NSInteger)eventNumber
     61{
     62    self = [super init];
     63
     64    if (!self)
     65        return nil;
     66
     67    _eventSender_location = location;
     68    _eventSender_locationInWindow = globalLocation;
     69    _eventSender_stage = stage;
     70    _eventSender_pressure = pressure;
     71    _eventSender_phase = phase;
     72    _eventSender_timestamp = time;
     73    _eventSender_eventNumber = eventNumber;
     74
     75    return self;
     76}
     77
     78- (NSTimeInterval)timestamp
     79{
     80    return _eventSender_timestamp;
     81}
     82
     83- (NSEventType)type
     84{
     85    return NSEventTypePressure;
     86}
     87
     88- (NSPoint)locationInWindow
     89{
     90    return self->_eventSender_location;
     91}
     92
     93- (NSPoint)location
     94{
     95    return self->_eventSender_locationInWindow;
     96}
     97
     98- (NSInteger)stage
     99{
     100    return _eventSender_stage;
     101}
     102
     103- (float)pressure
     104{
     105    return _eventSender_pressure;
     106}
     107
     108- (NSEventPhase)phase
     109{
     110    return _eventSender_phase;
     111}
     112
     113- (NSInteger)eventNumber
     114{
     115    return _eventSender_eventNumber;
     116}
     117
     118@end
     119#endif // defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
    41120
    42121namespace WTR {
     
    200279    m_clickPosition = m_position;
    201280}
     281
     282#if defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
     283void EventSenderProxy::mouseForceDown()
     284{
     285    EventSenderPressureEvent *firstEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
     286        globalLocation:([m_testController->mainWebView()->platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
     287        stage:1
     288        pressure:0.9
     289        phase:NSEventPhaseChanged
     290        time:absoluteTimeForEventTime(currentEventTime())
     291        eventNumber:++eventNumber];
     292    EventSenderPressureEvent *secondEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
     293        globalLocation:([m_testController->mainWebView()->platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
     294        stage:2
     295        pressure:0.1
     296        phase:NSEventPhaseChanged
     297        time:absoluteTimeForEventTime(currentEventTime())
     298        eventNumber:++eventNumber];
     299
     300    NSView *targetView = [m_testController->mainWebView()->platformView() hitTest:[firstEvent locationInWindow]];
     301    targetView = targetView ? targetView : m_testController->mainWebView()->platformView();
     302    ASSERT(targetView);
     303
     304    // Since AppKit does not implement forceup/down as mouse events, we need to send two pressure events to detect
     305    // the change in stage that marks those moments.
     306    [NSApp _setCurrentEvent:firstEvent];
     307    [targetView pressureChangeWithEvent:firstEvent];
     308    [NSApp _setCurrentEvent:secondEvent];
     309    [targetView pressureChangeWithEvent:secondEvent];
     310
     311    [NSApp _setCurrentEvent:nil];
     312    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
     313    [targetView pressureChangeWithEvent:nil];
     314
     315    [firstEvent release];
     316    [secondEvent release];
     317}
     318
     319void EventSenderProxy::mouseForceUp()
     320{
     321    EventSenderPressureEvent *firstEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
     322        globalLocation:([m_testController->mainWebView()->platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
     323        stage:2
     324        pressure:0.1
     325        phase:NSEventPhaseChanged
     326        time:absoluteTimeForEventTime(currentEventTime())
     327        eventNumber:++eventNumber];
     328    EventSenderPressureEvent *secondEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
     329        globalLocation:([m_testController->mainWebView()->platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
     330        stage:1
     331        pressure:0.9
     332        phase:NSEventPhaseChanged
     333        time:absoluteTimeForEventTime(currentEventTime())
     334        eventNumber:++eventNumber];
     335
     336    NSView *targetView = [m_testController->mainWebView()->platformView() hitTest:[firstEvent locationInWindow]];
     337    targetView = targetView ? targetView : m_testController->mainWebView()->platformView();
     338    ASSERT(targetView);
     339
     340    // Since AppKit does not implement forceup/down as mouse events, we need to send two pressure events to detect
     341    // the change in stage that marks those moments.
     342    [NSApp _setCurrentEvent:firstEvent];
     343    [targetView pressureChangeWithEvent:firstEvent];
     344    [NSApp _setCurrentEvent:secondEvent];
     345    [targetView pressureChangeWithEvent:secondEvent];
     346
     347    [NSApp _setCurrentEvent:nil];
     348    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
     349    [targetView pressureChangeWithEvent:nil];
     350
     351    [firstEvent release];
     352    [secondEvent release];
     353}
     354
     355void EventSenderProxy::mouseForceChanged(float force)
     356{
     357    EventSenderPressureEvent *event = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
     358        globalLocation:([m_testController->mainWebView()->platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
     359        stage:force < 1 ? 1 : 2
     360        pressure:force
     361        phase:NSEventPhaseChanged
     362        time:absoluteTimeForEventTime(currentEventTime())
     363        eventNumber:++eventNumber];
     364
     365    NSView *targetView = [m_testController->mainWebView()->platformView() hitTest:[event locationInWindow]];
     366    targetView = targetView ? targetView : m_testController->mainWebView()->platformView();
     367    ASSERT(targetView);
     368    [NSApp _setCurrentEvent:event];
     369    [targetView pressureChangeWithEvent:event];
     370    [NSApp _setCurrentEvent:nil];
     371
     372    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
     373    [targetView pressureChangeWithEvent:nil];
     374
     375    [event release];
     376}
     377#else
     378void EventSenderProxy::mouseForceDown()
     379{
     380}
     381
     382void EventSenderProxy::mouseForceUp()
     383{
     384}
     385
     386void EventSenderProxy::mouseForceChanged(float)
     387{
     388}
     389#endif // defined(__LP64__) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101003
    202390
    203391void EventSenderProxy::mouseMoveTo(double x, double y)
Note: See TracChangeset for help on using the changeset viewer.