Title: [261742] trunk
Revision
261742
Author
[email protected]
Date
2020-05-15 06:59:15 -0700 (Fri, 15 May 2020)

Log Message

[Wheel event region] Invalidation when changing listeners on elements
https://bugs.webkit.org/show_bug.cgi?id=211895

Reviewed by Simon Fraser.

Source/WebCore:

Doesn't handle root (window/document) invalidation yet.

Test: fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html

* dom/EventTarget.cpp:
(WebCore::EventTarget::addEventListener):
(WebCore::EventTarget::removeEventListener):
(WebCore::EventTarget::removeAllEventListeners):

Invalidate element style on wheel event changes.

* rendering/RenderElement.cpp:
(WebCore::RenderElement::styleWillChange):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::invalidateEventRegion):

Build on non-iOS platforms.

* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::maintainsEventRegion const):

Factor into function so it can be shared with RenderLayer::invalidateEventRegion.

(WebCore::RenderLayerBacking::updateEventRegion):
* rendering/RenderLayerBacking.h:

LayoutTests:

* fast/scrolling/mac/wheel-event-listener-region-element-invalidation-expected.txt: Added.
* fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (261741 => 261742)


--- trunk/LayoutTests/ChangeLog	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/LayoutTests/ChangeLog	2020-05-15 13:59:15 UTC (rev 261742)
@@ -1,3 +1,13 @@
+2020-05-15  Antti Koivisto  <[email protected]>
+
+        [Wheel event region] Invalidation when changing listeners on elements
+        https://bugs.webkit.org/show_bug.cgi?id=211895
+
+        Reviewed by Simon Fraser.
+
+        * fast/scrolling/mac/wheel-event-listener-region-element-invalidation-expected.txt: Added.
+        * fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html: Added.
+
 2020-05-15  Antoine Quint  <[email protected]>
 
         Cursor should not update on a 20ms timer

Added: trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation-expected.txt (0 => 261742)


--- trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation-expected.txt	2020-05-15 13:59:15 UTC (rev 261742)
@@ -0,0 +1,43 @@
+(GraphicsLayer
+  (anchor 0.00 0.00)
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (contentsOpaque 1)
+      (drawsContent 1)
+      (backgroundColor #FFFFFF)
+      (event region
+        (rect (0,0) width=800 height=600)
+      (wheel event listener region
+        (rect (8,8) width=250 height=50)
+        (rect (8,58) width=200 height=150)
+        (non-passive
+          (rect (8,8) width=250 height=50)
+          (rect (8,58) width=200 height=150)
+        )
+      )
+      )
+    )
+  )
+)
+(GraphicsLayer
+  (anchor 0.00 0.00)
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (contentsOpaque 1)
+      (drawsContent 1)
+      (backgroundColor #FFFFFF)
+      (event region
+        (rect (0,0) width=800 height=600)
+      (wheel event listener region
+        (rect (208,208) width=250 height=50)
+        (rect (208,258) width=200 height=150)
+      )
+      )
+    )
+  )
+)
+

Added: trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html (0 => 261742)


--- trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html	2020-05-15 13:59:15 UTC (rev 261742)
@@ -0,0 +1,56 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
+<html>
+<style>
+.event {
+    position:relative;
+    background-color:blue;
+    width:200px;
+    height:200px;
+}
+.child {
+    position:relative;
+    background-color:blue;
+    left:200px;
+    width:50px;
+    height:50px;
+}
+.offset {
+    left: 200px;
+}
+
+</style>
+<script>
+if (window.testRunner)
+    testRunner.dumpAsText();
+
+window._onload_ = () => {
+    document.body.offsetLeft;
+
+    function listener() {
+        results.textContent += 'wheel\n';
+    }
+    active.addEventListener("wheel", listener);
+
+    let log = "";
+    if (window.internals)
+        log += internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_EVENT_REGION | internals.LAYER_TREE_INCLUDES_ROOT_LAYER_PROPERTIES);
+
+    active.removeEventListener('wheel', listener);
+    passive.addEventListener('wheel', () => { results.textContent += 'passive wheel\n' }, { passive: true });
+
+    if (window.internals)
+        log += internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_EVENT_REGION | internals.LAYER_TREE_INCLUDES_ROOT_LAYER_PROPERTIES);
+
+    results.textContent = log;
+}
+</script>
+<body>
+<div class="event" id="active">
+    <div class="child"></div>
+</div>
+<div class="event offset" id="passive">
+    <div class="child"></div>
+</div>
+<pre id="results"></pre>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (261741 => 261742)


--- trunk/Source/WebCore/ChangeLog	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/ChangeLog	2020-05-15 13:59:15 UTC (rev 261742)
@@ -1,3 +1,36 @@
+2020-05-15  Antti Koivisto  <[email protected]>
+
+        [Wheel event region] Invalidation when changing listeners on elements
+        https://bugs.webkit.org/show_bug.cgi?id=211895
+
+        Reviewed by Simon Fraser.
+
+        Doesn't handle root (window/document) invalidation yet.
+
+        Test: fast/scrolling/mac/wheel-event-listener-region-element-invalidation.html
+
+        * dom/EventTarget.cpp:
+        (WebCore::EventTarget::addEventListener):
+        (WebCore::EventTarget::removeEventListener):
+        (WebCore::EventTarget::removeAllEventListeners):
+
+        Invalidate element style on wheel event changes.
+
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::styleWillChange):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::invalidateEventRegion):
+
+        Build on non-iOS platforms.
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::maintainsEventRegion const):
+
+        Factor into function so it can be shared with RenderLayer::invalidateEventRegion.
+
+        (WebCore::RenderLayerBacking::updateEventRegion):
+        * rendering/RenderLayerBacking.h:
+
 2020-05-15  Antoine Quint  <[email protected]>
 
         Cursor should not update on a 20ms timer

Modified: trunk/Source/WebCore/dom/EventTarget.cpp (261741 => 261742)


--- trunk/Source/WebCore/dom/EventTarget.cpp	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/dom/EventTarget.cpp	2020-05-15 13:59:15 UTC (rev 261742)
@@ -95,6 +95,11 @@
     if (listenerCreatedFromScript)
         InspectorInstrumentation::didAddEventListener(*this, eventType, listenerRef.get(), options.capture);
 
+    if (eventNames().isWheelEventType(eventType)) {
+        if (is<Element>(*this))
+            downcast<Element>(*this).invalidateStyleInternal();
+    }
+
     eventListenersDidChange();
     return true;
 }
@@ -136,6 +141,11 @@
     InspectorInstrumentation::willRemoveEventListener(*this, eventType, listener, options.capture);
 
     if (data->eventListenerMap.remove(eventType, listener, options.capture)) {
+        if (eventNames().isWheelEventType(eventType)) {
+            if (is<Element>(*this))
+                downcast<Element>(*this).invalidateStyleInternal();
+        }
+
         eventListenersDidChange();
         return true;
     }
@@ -367,6 +377,11 @@
 
     auto* data = ""
     if (data && !data->eventListenerMap.isEmpty()) {
+        if (data->eventListenerMap.contains(eventNames().wheelEvent) || data->eventListenerMap.contains(eventNames().mousewheelEvent)) {
+            if (is<Element>(*this))
+                downcast<Element>(*this).invalidateStyleInternal();
+        }
+
         data->eventListenerMap.clear();
         eventListenersDidChange();
     }

Modified: trunk/Source/WebCore/rendering/EventRegion.cpp (261741 => 261742)


--- trunk/Source/WebCore/rendering/EventRegion.cpp	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/rendering/EventRegion.cpp	2020-05-15 13:59:15 UTC (rev 261742)
@@ -100,6 +100,10 @@
 {
     if (m_touchActionRegions != other.m_touchActionRegions)
         return false;
+    if (m_wheelEventListenerRegion != other.m_wheelEventListenerRegion)
+        return false;
+    if (m_nonPassiveWheelEventListenerRegion != other.m_nonPassiveWheelEventListenerRegion)
+        return false;
 #if ENABLE(EDITABLE_REGION)
     if (m_editableRegion != other.m_editableRegion)
         return false;

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (261741 => 261742)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2020-05-15 13:59:15 UTC (rev 261742)
@@ -741,6 +741,8 @@
                 return true;
             if (m_style.effectiveTouchActions() != newStyle.effectiveTouchActions())
                 return true;
+            if (m_style.eventListenerRegionTypes() != newStyle.eventListenerRegionTypes())
+                return true;
 #if ENABLE(EDITABLE_REGION)
             bool wasEditable = m_style.userModify() != UserModify::ReadOnly;
             bool isEditable = newStyle.userModify() != UserModify::ReadOnly;

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (261741 => 261742)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2020-05-15 13:59:15 UTC (rev 261742)
@@ -6970,28 +6970,20 @@
 
 bool RenderLayer::invalidateEventRegion(EventRegionInvalidationReason reason)
 {
-    // FIXME: This should not be conditioned on PLATFORM(IOS_FAMILY). See <https://webkit.org/b/210216>.
-#if PLATFORM(IOS_FAMILY)
+#if ENABLE(ASYNC_SCROLLING)
     auto* compositingLayer = enclosingCompositingLayerForRepaint();
-    if (!compositingLayer)
-        return false;
 
-    auto maintainsEventRegion = [&] {
-        // UI side scroll overlap testing.
-        if (!compositingLayer->isRenderViewLayer())
+    auto shouldInvalidate = [&] {
+        if (!compositingLayer)
+            return false;
+
+        if (reason == EventRegionInvalidationReason::NonCompositedFrame)
             return true;
-        // UI side touch-action resolution.
-        if (renderer().document().mayHaveElementsWithNonAutoTouchAction())
-            return true;
-#if ENABLE(EDITABLE_REGION)
-        // UI side editable elements resolution.
-        if (renderer().document().mayHaveEditableElements())
-            return true;
-#endif
-        return false;
+
+        return compositingLayer->backing()->maintainsEventRegion();
     };
 
-    if (reason != EventRegionInvalidationReason::NonCompositedFrame && !maintainsEventRegion())
+    if (!shouldInvalidate())
         return false;
 
     compositingLayer->setNeedsCompositingConfigurationUpdate();
@@ -6999,7 +6991,7 @@
     if (reason == EventRegionInvalidationReason::NonCompositedFrame) {
         auto& view = renderer().view();
         view.setNeedsEventRegionUpdateForNonCompositedFrame();
-        if (renderer().settings().visibleDebugOverlayRegions() & (TouchActionRegion | EditableElementRegion))
+        if (renderer().settings().visibleDebugOverlayRegions() & (TouchActionRegion | EditableElementRegion | WheelEventHandlerRegion))
             view.setNeedsRepaintHackAfterCompositingLayerUpdateForDebugOverlaysOnly();
         view.compositor().scheduleCompositingLayerUpdate();
     }

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (261741 => 261742)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2020-05-15 13:59:15 UTC (rev 261742)
@@ -1688,41 +1688,42 @@
 }
 
 #if ENABLE(ASYNC_SCROLLING)
-void RenderLayerBacking::updateEventRegion()
+bool RenderLayerBacking::maintainsEventRegion() const
 {
-    auto needsUpdate = [&] {
-        if (!m_owningLayer.page().scrollingCoordinator())
-            return false;
+    if (!m_owningLayer.page().scrollingCoordinator())
+        return false;
 
-        if (paintsIntoCompositedAncestor())
-            return false;
+    if (paintsIntoCompositedAncestor())
+        return false;
 
-        if (renderer().view().needsEventRegionUpdateForNonCompositedFrame())
-            return true;
-        
+    if (renderer().view().needsEventRegionUpdateForNonCompositedFrame())
+        return true;
+
 #if PLATFORM(IOS_FAMILY)
-        if (renderer().document().mayHaveElementsWithNonAutoTouchAction())
-            return true;
+    if (renderer().document().mayHaveElementsWithNonAutoTouchAction())
+        return true;
 #endif
 #if ENABLE(EDITABLE_REGION)
-        if (renderer().document().mayHaveEditableElements())
-            return true;
+    if (renderer().document().mayHaveEditableElements())
+        return true;
 #endif
 #if !PLATFORM(IOS_FAMILY)
-        if (renderer().document().wheelEventTargets())
-            return true;
+    if (renderer().document().wheelEventTargets())
+        return true;
 #endif
-        if (m_owningLayer.isRenderViewLayer())
-            return false;
+    if (m_owningLayer.isRenderViewLayer())
+        return false;
 
-        auto& settings = renderer().settings();
-        if (!settings.asyncFrameScrollingEnabled() && !settings.asyncOverflowScrollingEnabled())
-            return false;
+    auto& settings = renderer().settings();
+    if (!settings.asyncFrameScrollingEnabled() && !settings.asyncOverflowScrollingEnabled())
+        return false;
 
-        return true;
-    };
+    return true;
+}
 
-    if (!needsUpdate())
+void RenderLayerBacking::updateEventRegion()
+{
+    if (!maintainsEventRegion())
         return;
 
     auto updateEventRegionForLayer = [&](GraphicsLayer& graphicsLayer) {

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (261741 => 261742)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.h	2020-05-15 13:19:29 UTC (rev 261741)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h	2020-05-15 13:59:15 UTC (rev 261742)
@@ -202,6 +202,7 @@
     void updateAllowsBackingStoreDetaching(const LayoutRect& absoluteBounds);
 
 #if ENABLE(ASYNC_SCROLLING)
+    bool maintainsEventRegion() const;
     void updateEventRegion();
 #endif
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to