[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