[webkit-changes] [WebKit/WebKit] 3a5a2d: REGRESSION (UI-side compositing): Unable to scroll...
Simon Fraser
noreply at github.com
Mon Dec 18 10:49:50 PST 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 3a5a2dc6d7b110ce9ee677a6f033b51343b1ddb0
https://github.com/WebKit/WebKit/commit/3a5a2dc6d7b110ce9ee677a6f033b51343b1ddb0
Author: Simon Fraser <simon.fraser at apple.com>
Date: 2023-12-18 (Mon, 18 Dec 2023)
Changed paths:
A LayoutTests/view-gestures/smart-magnify/double-tap-zoom-scroll-above-top-expected.html
A LayoutTests/view-gestures/smart-magnify/double-tap-zoom-scroll-above-top.html
M Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeDrawingAreaProxyMac.h
M Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeDrawingAreaProxyMac.mm
Log Message:
-----------
REGRESSION (UI-side compositing): Unable to scroll to top of page after double tapping trackpad causes page to scroll down
https://bugs.webkit.org/show_bug.cgi?id=266529
rdar://116419609
Reviewed by Tim Horton.
The smart magnify gesture (two-finger double tap on the trackpad) results in some combination of
scrolling and zooming. `RemoteLayerTreeDrawingAreaProxyMac::commitTransientZoom()` uses a
CAAnimation to animate to the final state, but the completion handler of that animation put the
transform directly onto the `layerForPageScale`.
That's OK if the gesture results in a scale change; that transform will get replaced by one that
comes from the web process. However, if a gesture just resulted in a scroll with no scale change,
we never get a new transform from the web process, so we leave that transform on
`layerForPageScale`. This transform has a translation baked in, so this causes a permanent scroll
offset.
So we have to stop shoving the transform onto this layer. This revealed an issue where there was a
jump when the animation was removed. Fixing this just requires two things:
1. Delay removing the transient zoom animations until we know the web process has committed the new
scale and scroll position (via a `callAfterNextPresentationUpdate()`).
2. Override any scroll position changes that come from the web process before this by adding a
CAAnimation onto the scrolled contents layer which overrides the `position` property. If we
don't do this, scroll position changes cause a flash of offset content. This requires tracking
m_pageScrollingLayerID, but that information was already in the transaction for banner hookup.
* LayoutTests/view-gestures/smart-magnify/double-tap-zoom-scroll-above-top-expected.html: Added.
* LayoutTests/view-gestures/smart-magnify/double-tap-zoom-scroll-above-top.html: Added.
* Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeDrawingAreaProxyMac.h:
* Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeDrawingAreaProxyMac.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxyMac::didCommitLayerTree):
(WebKit::fillFowardsAnimationWithKeyPath):
(WebKit::transientZoomTransformOverrideAnimation):
(WebKit::RemoteLayerTreeDrawingAreaProxyMac::applyTransientZoomToLayer):
(WebKit::RemoteLayerTreeDrawingAreaProxyMac::removeTransientZoomFromLayer):
(WebKit::RemoteLayerTreeDrawingAreaProxyMac::commitTransientZoom):
(WebKit::RemoteLayerTreeDrawingAreaProxyMac::sendCommitTransientZoom):
Canonical link: https://commits.webkit.org/272229@main
More information about the webkit-changes
mailing list