Changeset 244037 in webkit


Ignore:
Timestamp:
Apr 8, 2019 1:32:53 PM (5 years ago)
Author:
Antti Koivisto
Message:

Update touch-action region on property changes
https://bugs.webkit.org/show_bug.cgi?id=196608

Reviewed by Simon Fraser.

Source/WebCore:

Test: pointerevents/ios/touch-action-region-dynamic.html

  • rendering/EventRegion.cpp:

(WebCore::EventRegion::touchActionsForPoint const):

Correctly return 'auto' when nothing is found from the regions (this code is not used yet).

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::styleWillChange):

React to 'touch-action' property changes, similarly to 'pointer-events'.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::invalidateEventRegion):

Test if need to invalidate.

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::setContentsNeedDisplay):
(WebCore::RenderLayerBacking::setContentsNeedDisplayInRect):

Call invalidateEventRegion explicitly instead of relying on compositing update. This ensures
that we update the top level event region correctly when we have touch-actions.

LayoutTests:

  • pointerevents/ios/touch-action-region-dynamic-expected.txt: Added.
  • pointerevents/ios/touch-action-region-dynamic.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244036 r244037  
     12019-04-08  Antti Koivisto  <antti@apple.com>
     2
     3        Update touch-action region on property changes
     4        https://bugs.webkit.org/show_bug.cgi?id=196608
     5
     6        Reviewed by Simon Fraser.
     7
     8        * pointerevents/ios/touch-action-region-dynamic-expected.txt: Added.
     9        * pointerevents/ios/touch-action-region-dynamic.html: Added.
     10
    1112019-04-08  Javier Fernandez  <jfernandez@igalia.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r244036 r244037  
     12019-04-08  Antti Koivisto  <antti@apple.com>
     2
     3        Update touch-action region on property changes
     4        https://bugs.webkit.org/show_bug.cgi?id=196608
     5
     6        Reviewed by Simon Fraser.
     7
     8        Test: pointerevents/ios/touch-action-region-dynamic.html
     9
     10        * rendering/EventRegion.cpp:
     11        (WebCore::EventRegion::touchActionsForPoint const):
     12
     13        Correctly return 'auto' when nothing is found from the regions (this code is not used yet).
     14
     15        * rendering/RenderElement.cpp:
     16        (WebCore::RenderElement::styleWillChange):
     17
     18        React to 'touch-action' property changes, similarly to 'pointer-events'.
     19
     20        * rendering/RenderLayer.cpp:
     21        (WebCore::RenderLayer::invalidateEventRegion):
     22
     23        Test if need to invalidate.
     24
     25        * rendering/RenderLayerBacking.cpp:
     26        (WebCore::RenderLayerBacking::setContentsNeedDisplay):
     27        (WebCore::RenderLayerBacking::setContentsNeedDisplayInRect):
     28
     29        Call invalidateEventRegion explicitly instead of relying on compositing update. This ensures
     30        that we update the top level event region correctly when we have touch-actions.
     31
    1322019-04-08  Javier Fernandez  <jfernandez@igalia.com>
    233
  • trunk/Source/WebCore/rendering/EventRegion.cpp

    r243962 r244037  
    137137    }
    138138
     139    if (actions.isEmpty())
     140        return { TouchAction::Auto };
     141
    139142    return actions;
    140143}
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r243709 r244037  
    731731        }
    732732
    733         if (m_style.pointerEvents() != newStyle.pointerEvents()) {
     733        auto needsInvalidateEventRegion = [&] {
     734            if (m_style.pointerEvents() != newStyle.pointerEvents())
     735                return true;
     736#if ENABLE(POINTER_EVENTS)
     737            if (m_style.effectiveTouchActions() != newStyle.effectiveTouchActions())
     738                return true;
     739#endif
     740            return false;
     741        };
     742
     743        if (needsInvalidateEventRegion()) {
    734744            // Usually the event region gets updated as a result of paint invalidation. Here we need to request an update explicitly.
    735745            if (auto* layer = enclosingLayer())
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r243962 r244037  
    66866686void RenderLayer::invalidateEventRegion()
    66876687{
    6688     if (auto* compositingLayer = enclosingCompositingLayerForRepaint())
    6689         compositingLayer->setNeedsCompositingConfigurationUpdate();
     6688#if PLATFORM(IOS_FAMILY)
     6689    auto* compositingLayer = enclosingCompositingLayerForRepaint();
     6690    if (!compositingLayer)
     6691        return;
     6692
     6693    auto maintainsEventRegion = [&] {
     6694        // UI side scroll overlap testing.
     6695        if (!compositingLayer->isRenderViewLayer())
     6696            return true;
     6697#if ENABLE(POINTER_EVENTS)
     6698        // UI side touch-action resolution.
     6699        if (renderer().document().touchActionElements())
     6700            return true;
     6701#endif
     6702        return false;
     6703    };
     6704
     6705    if (!maintainsEventRegion())
     6706        return;
     6707
     6708    compositingLayer->setNeedsCompositingConfigurationUpdate();
     6709#endif
    66906710}
    66916711
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r243962 r244037  
    24872487        m_owningLayer.setNeedsCompositingConfigurationUpdate();
    24882488
     2489    m_owningLayer.invalidateEventRegion();
     2490
    24892491    auto& frameView = renderer().view().frameView();
    24902492    if (m_isMainFrameRenderViewLayer && frameView.isTrackingRepaints())
     
    25242526    if (!m_owningLayer.isRenderViewLayer())
    25252527        m_owningLayer.setNeedsCompositingConfigurationUpdate();
     2528
     2529    m_owningLayer.invalidateEventRegion();
    25262530
    25272531    FloatRect pixelSnappedRectForPainting = snapRectToDevicePixels(r, deviceScaleFactor());
Note: See TracChangeset for help on using the changeset viewer.