Skip to content

Commit 066e5bd

Browse files
committed
[UI-side compositing] Ensure that wheel events got to the web process for JS event handlers
https://bugs.webkit.org/show_bug.cgi?id=248846 Reviewed by Tim Horton. Override `eventListenerRegionTypesForPoint()` in RemoteScrollingTreeMac just as we do in ScrollingTreeMac to get the event handler details for a given point. We use this to know if we have to continue with the web process/main thread event handling path. * Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteScrollingTreeMac.h: * Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteScrollingTreeMac.mm: (WebKit::eventRegionForLayer): (WebKit::layerEventRegionContainsPoint): (WebKit::RemoteScrollingTreeMac::eventListenerRegionTypesForPoint const): Canonical link: https://commits.webkit.org/257531@main
1 parent eeaff86 commit 066e5bd

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteScrollingTreeMac.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class RemoteScrollingTreeMac final : public RemoteScrollingTree {
5151
private:
5252
void handleWheelEventPhase(WebCore::ScrollingNodeID, WebCore::PlatformWheelEventPhase) final;
5353
RefPtr<WebCore::ScrollingTreeNode> scrollingNodeForPoint(WebCore::FloatPoint) final;
54+
#if ENABLE(WHEEL_EVENT_REGIONS)
55+
OptionSet<WebCore::EventListenerRegionType> eventListenerRegionTypesForPoint(WebCore::FloatPoint) const final;
56+
#endif
5457

5558
void hasNodeWithAnimatedScrollChanged(bool) final;
5659
void displayDidRefresh(WebCore::PlatformDisplayID) final;

Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteScrollingTreeMac.mm

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,17 +130,25 @@ static bool isScrolledBy(const ScrollingTree& tree, ScrollingNodeID scrollingNod
130130
return false;
131131
}
132132

133-
static bool layerEventRegionContainsPoint(CALayer *layer, CGPoint localPoint)
133+
static const EventRegion* eventRegionForLayer(CALayer *layer)
134134
{
135135
auto* layerTreeNode = RemoteLayerTreeNode::forCALayer(layer);
136136
if (!layerTreeNode)
137+
return nullptr;
138+
139+
return &layerTreeNode->eventRegion();
140+
}
141+
142+
static bool layerEventRegionContainsPoint(CALayer *layer, CGPoint localPoint)
143+
{
144+
auto* eventRegion = eventRegionForLayer(layer);
145+
if (!eventRegion)
137146
return false;
138147

139148
// Scrolling changes boundsOrigin on the scroll container layer, but we computed its event region ignoring scroll position, so factor out bounds origin.
140149
FloatPoint boundsOrigin = layer.bounds.origin;
141150
FloatPoint originRelativePoint = localPoint - toFloatSize(boundsOrigin);
142-
auto& eventRegion = layerTreeNode->eventRegion();
143-
return eventRegion.contains(roundedIntPoint(originRelativePoint));
151+
return eventRegion->contains(roundedIntPoint(originRelativePoint));
144152
}
145153

146154
RefPtr<ScrollingTreeNode> RemoteScrollingTreeMac::scrollingNodeForPoint(FloatPoint point)
@@ -183,6 +191,33 @@ static bool layerEventRegionContainsPoint(CALayer *layer, CGPoint localPoint)
183191
return rootScrollingNode;
184192
}
185193

194+
#if ENABLE(WHEEL_EVENT_REGIONS)
195+
OptionSet<EventListenerRegionType> RemoteScrollingTreeMac::eventListenerRegionTypesForPoint(FloatPoint point) const
196+
{
197+
auto* rootScrollingNode = rootNode();
198+
if (!rootScrollingNode)
199+
return { };
200+
201+
auto rootContentsLayer = static_cast<ScrollingTreeFrameScrollingNodeMac*>(rootScrollingNode)->rootContentsLayer();
202+
203+
Vector<LayerAndPoint, 16> layersAtPoint;
204+
collectDescendantLayersAtPoint(layersAtPoint, rootContentsLayer.get(), point, layerEventRegionContainsPoint);
205+
206+
if (layersAtPoint.isEmpty())
207+
return { };
208+
209+
auto [hitLayer, localPoint] = layersAtPoint.last();
210+
if (!hitLayer)
211+
return { };
212+
213+
auto* eventRegion = eventRegionForLayer(hitLayer);
214+
if (!eventRegion)
215+
return { };
216+
217+
return eventRegion->eventListenerRegionTypesForPoint(roundedIntPoint(localPoint));
218+
}
219+
#endif
220+
186221
} // namespace WebKit
187222

188223
#endif // PLATFORM(MAC) && ENABLE(UI_SIDE_COMPOSITING)

0 commit comments

Comments
 (0)