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