[webkit-changes] [WebKit/WebKit] e94fbc: REGRESSION (262041 at main): Keyboard scrolling anima...
Wenson Hsieh
noreply at github.com
Fri Mar 24 16:32:55 PDT 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: e94fbc9c6f2ad75e234c67d3642c0756c19679c8
https://github.com/WebKit/WebKit/commit/e94fbc9c6f2ad75e234c67d3642c0756c19679c8
Author: Wenson Hsieh <wenson_hsieh at apple.com>
Date: 2023-03-24 (Fri, 24 Mar 2023)
Changed paths:
A LayoutTests/fast/scrolling/programmatic-smooth-scroll-from-nonzero-offset-expected.txt
A LayoutTests/fast/scrolling/programmatic-smooth-scroll-from-nonzero-offset.html
M LayoutTests/platform/glib/TestExpectations
M Source/WebCore/page/scrolling/ScrollingCoordinatorTypes.cpp
M Source/WebCore/page/scrolling/ScrollingStateScrollingNode.cpp
M Source/WebCore/page/scrolling/ScrollingStateScrollingNode.h
M Source/WebKit/Shared/RemoteLayerTree/RemoteScrollingCoordinatorTransaction.cpp
Log Message:
-----------
REGRESSION (262041 at main): Keyboard scrolling animates from (0, 0) when smooth keyboard scrolling is disabled and UI-side compositing is enabled
https://bugs.webkit.org/show_bug.cgi?id=254428
Reviewed by Tim Horton.
My previous patch in 262041 at main had a serious flaw — when decoding `ScrollingStateScrollingNode`,
we'll decode a `RequestedScrollData` and use `ScrollingStateScrollingNode::setRequestedScrollData`
to set the decoded data on the scrolling node. However, since:
- `setRequestedScrollData()` contains the request merging logic I added in 262041 at main, and...
- We decode the changed property flags before calling `setRequestedScrollData`.
...we end up treating all animated scrolling as starting from the origin. This patch fixes that by
keeping the merging logic in the web process, by passing in a `CanMergeScrollData::No` flag when
deserializing the scrolling state node.
Test: fast/scrolling/programmatic-smooth-scroll-from-nonzero-offset.html
* LayoutTests/fast/scrolling/programmatic-smooth-scroll-from-nonzero-offset-expected.txt: Added.
* LayoutTests/fast/scrolling/programmatic-smooth-scroll-from-nonzero-offset.html: Added.
Add a new layout test to exercise the bug, by scrolling (without animation) to a nonzero offset and
then performing an animated scroll from that offset, verifying that we don't attempt to start from
(0, 0) when performing the animated scroll.
* LayoutTests/platform/glib/TestExpectations:
* Source/WebCore/page/scrolling/ScrollingCoordinatorTypes.cpp:
(WebCore::RequestedScrollData::merge):
After fixing the above issue, I also discovered that with UI-side compositing enabled, the original
tests in `imported/w3c/web-platform-tests/css/cssom-view` that I tried to fix started failing again;
this is because of another subtle corner case that wasn't covered in when merging `RequestedScrollData`,
wherein the following sequence of programmatic scroll requests:
1. ScrollRequestType::PositionUpdate (Non-Animated)
2. ScrollRequestType::CancelAnimatedScroll
3. ScrollRequestType::PositionUpdate (Animated)
...caused us to stomp over the `requestedDataBeforeAnimatedScroll` in step (2), when merging the
animated scroll cancellation request into the position update. To address this and keep the WPT
passing with UI-side compositing enabled, I've adjusted the merging logic to preserve `scrollPosition`
after step (2), so that we can stash it in the `requestedDataBeforeAnimatedScroll` in step (3).
* Source/WebCore/page/scrolling/ScrollingStateScrollingNode.cpp:
(WebCore::ScrollingStateScrollingNode::setRequestedScrollData):
* Source/WebCore/page/scrolling/ScrollingStateScrollingNode.h:
* Source/WebKit/Shared/RemoteLayerTree/RemoteScrollingCoordinatorTransaction.cpp:
(ArgumentCoder<ScrollingStateScrollingNode>::decode):
Canonical link: https://commits.webkit.org/262105@main
More information about the webkit-changes
mailing list