Changeset 242798 in webkit


Ignore:
Timestamp:
Mar 12, 2019 10:15:52 AM (5 years ago)
Author:
Alan Bujtas
Message:

[Synthetic Click] Dispatch mouseout soon after mouseup
https://bugs.webkit.org/show_bug.cgi?id=195575
<rdar://problem/47093049>

Reviewed by Simon Fraser.

Source/WebCore:

Let's fire a mouseout event when a click is submitted as the result of a tap. It helps to dismiss content which would otherwise require you to move the mouse (cases like control bar on youtube.com).

Test: fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html

  • page/EventHandler.h:
  • page/ios/EventHandlerIOS.mm:

(WebCore::EventHandler::dispatchFakeMouseOut):

Source/WebKit:

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::completeSyntheticClick):

LayoutTests:

  • fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click-expected.txt: Added.
  • fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html: Added.
Location:
trunk
Files:
1 added
8 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r242794 r242798  
     12019-03-12  Zalan Bujtas  <zalan@apple.com>
     2
     3        [Synthetic Click] Dispatch mouseout soon after mouseup
     4        https://bugs.webkit.org/show_bug.cgi?id=195575
     5        <rdar://problem/47093049>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click-expected.txt: Added.
     10        * fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html: Added.
     11
    1122019-03-12  Antti Koivisto  <antti@apple.com>
    213
  • trunk/LayoutTests/fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html

    r242797 r242798  
    11<html>
    22<head>
    3 <title>This tests the case when visible content change happens on touchstart</title>
     3<title>This tests that we fire mouseout on synthetic click</title>
    44<script src="../../../../../resources/basic-gestures.js"></script>
    55<style>
     
    1111
    1212#becomesVisible {
    13     display: none;
    1413    width: 100px;
    1514    height: 100px;
     
    3635</head>
    3736<body onload="test()">
    38 <div id=tapthis>PASS if 'clicked' text is not shown below.</div>
     37<div id=tapthis>PASS if 'mouseout' text is shown below.</div>
    3938<div id=becomesVisible></div>
    4039<pre id=result></pre>
    4140<script>
    42 tapthis.addEventListener("mouseover", function( event ) {
    43     becomesVisible.style.display = "block";
    44     if (window.testRunner)
    45         testRunner.notifyDone();
    46 }, false);
    4741
    4842becomesVisible.addEventListener("click", function( event ) {   
     
    5044}, false);
    5145
     46tapthis.addEventListener("mouseout", function( event ) {   
     47    result.innerHTML = result.innerHTML + " mouseout triggered ";
     48    if (window.testRunner)
     49        testRunner.notifyDone();
     50}, false);
     51
    5252tapthis.addEventListener("click", function( event ) {   
    53     result.innerHTML = "clicked";
     53    result.innerHTML = result.innerHTML + " clicked ";
    5454}, false);
    5555</script>
  • trunk/LayoutTests/fast/events/touch/ios/content-observation/visibility-change-happens-while-in-mousemoved.html

    r242777 r242798  
    4646}, false);
    4747
    48 becomesVisible.addEventListener("click", function( event ) {   
     48tapthis.addEventListener("mouseout", function( event ) {
     49    result.innerHTML = result.innerHTML + " mouseout should NOT be triggered ";
     50}, false);
     51
     52becomesVisible.addEventListener("click", function( event ) {
    4953    result.innerHTML = "clicked hidden";
    5054}, false);
  • trunk/Source/WebCore/ChangeLog

    r242797 r242798  
     12019-03-12  Zalan Bujtas  <zalan@apple.com>
     2
     3        [Synthetic Click] Dispatch mouseout soon after mouseup
     4        https://bugs.webkit.org/show_bug.cgi?id=195575
     5        <rdar://problem/47093049>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Let's fire a mouseout event when a click is submitted as the result of a tap. It helps to dismiss content which would otherwise require you to move the mouse (cases like control bar on youtube.com).
     10
     11        Test: fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html
     12
     13        * page/EventHandler.h:
     14        * page/ios/EventHandlerIOS.mm:
     15        (WebCore::EventHandler::dispatchFakeMouseOut):
     16
    1172019-03-12  Ryosuke Niwa  <rniwa@webkit.org>
    218
  • trunk/Source/WebCore/page/EventHandler.cpp

    r242777 r242798  
    19791979        if (onlyUpdateScrollbars) {
    19801980            if (shouldSendMouseEventsToInactiveWindows())
    1981                 updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, true);
     1981                updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
    19821982
    19831983            return true;
     
    19941994    if (newSubframe) {
    19951995        // Update over/out state before passing the event to the subframe.
    1996         updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, true);
     1996        updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
    19971997       
    19981998        // Event dispatch in updateMouseEventTargetNode may have caused the subframe of the target
     
    24772477}
    24782478
    2479 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& platformMouseEvent, bool fireMouseOverOut)
     2479void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& platformMouseEvent, FireMouseOverOut fireMouseOverOut)
    24802480{
    24812481    Ref<Frame> protectedFrame(m_frame);
     
    24952495
    24962496    // Fire mouseout/mouseover if the mouse has shifted to a different node.
    2497     if (fireMouseOverOut) {
     2497    if (fireMouseOverOut == FireMouseOverOut::Yes) {
    24982498        auto scrollableAreaForLastNode = enclosingScrollableArea(m_lastElementUnderMouse.get());
    24992499        auto scrollableAreaForNodeUnderMouse = enclosingScrollableArea(m_elementUnderMouse.get());
     
    25892589        view->disableLayerFlushThrottlingTemporarilyForInteraction();
    25902590
    2591     updateMouseEventTargetNode(targetNode, platformMouseEvent, setUnder);
     2591    updateMouseEventTargetNode(targetNode, platformMouseEvent, setUnder ? FireMouseOverOut::Yes : FireMouseOverOut::No);
    25922592
    25932593    if (m_elementUnderMouse && !m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventType, clickCount))
  • trunk/Source/WebCore/page/EventHandler.h

    r242777 r242798  
    242242#if PLATFORM(IOS_FAMILY)
    243243    void defaultTouchEventHandler(Node&, TouchEvent&);
     244    WEBCORE_EXPORT void dispatchSyntheticMouseOut(const PlatformMouseEvent&);
    244245#endif
    245246
     
    405406    Node* nodeUnderMouse() const;
    406407   
    407     void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, bool fireMouseOverOut);
    408     void fireMouseOverOut(bool fireMouseOver = true, bool fireMouseOut = true, bool updateLastNodeUnderMouse = true);
    409    
     408    enum class FireMouseOverOut { No, Yes };
     409    void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, FireMouseOverOut);
     410
    410411    MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const PlatformMouseEvent&);
    411412
  • trunk/Source/WebCore/page/ios/EventHandlerIOS.mm

    r242777 r242798  
    516516}
    517517
     518void EventHandler::dispatchSyntheticMouseOut(const PlatformMouseEvent& platformMouseEvent)
     519{
     520    updateMouseEventTargetNode(nullptr, platformMouseEvent, FireMouseOverOut::Yes);
     521}
     522
    518523bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
    519524{
  • trunk/Source/WebKit/ChangeLog

    r242796 r242798  
     12019-03-12  Zalan Bujtas  <zalan@apple.com>
     2
     3        [Synthetic Click] Dispatch mouseout soon after mouseup
     4        https://bugs.webkit.org/show_bug.cgi?id=195575
     5        <rdar://problem/47093049>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * WebProcess/WebPage/ios/WebPageIOS.mm:
     10        (WebKit::WebPage::completeSyntheticClick):
     11
    1122019-03-12  Zalan Bujtas  <zalan@apple.com>
    213
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r242796 r242798  
    641641        elementDidRefocus(*newFocusedElement);
    642642
     643    if (nodeRespondingToClick.document().frame())
     644        nodeRespondingToClick.document().frame()->eventHandler().dispatchSyntheticMouseOut(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::NoType, 0, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
     645    if (m_isClosed)
     646        return;
     647
    643648    if (!tapWasHandled || !nodeRespondingToClick.isElementNode())
    644649        send(Messages::WebPageProxy::DidNotHandleTapAsClick(roundedIntPoint(location)));
Note: See TracChangeset for help on using the changeset viewer.