Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 3a5a2dc6d7b110ce9ee677a6f033b51343b1ddb0
https://github.com/WebKit/WebKit/commit/3a5a2dc6d7b110ce9ee677a6f033b51343b1ddb0
Author: Simon Fraser <[email protected]>
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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes