Bug 1655130. Handle non-smooth scrolling with desktop zooming scrollbars. r=kats

Differential Revision: https://phabricator.services.mozilla.com/D89408
This commit is contained in:
Timothy Nikkel 2020-09-13 08:31:54 +00:00
parent ce1a0b3c82
commit ad56527f09
4 changed files with 36 additions and 1 deletions

View File

@ -114,6 +114,14 @@ CSSPoint FrameMetrics::ApplyRelativeScrollUpdateFrom(
return GetVisualScrollOffset() - origin;
}
CSSPoint FrameMetrics::ApplyPureRelativeScrollUpdateFrom(
const ScrollPositionUpdate& aUpdate) {
MOZ_ASSERT(aUpdate.GetType() == ScrollUpdateType::PureRelative);
CSSPoint origin = GetVisualScrollOffset();
ClampAndSetVisualScrollOffset(origin + aUpdate.GetDelta());
return GetVisualScrollOffset() - origin;
}
ScrollSnapInfo::ScrollSnapInfo()
: mScrollSnapStrictnessX(StyleScrollSnapStrictness::None),
mScrollSnapStrictnessY(StyleScrollSnapStrictness::None) {}

View File

@ -264,6 +264,9 @@ struct FrameMetrics {
*/
CSSPoint ApplyRelativeScrollUpdateFrom(const ScrollPositionUpdate& aUpdate);
CSSPoint ApplyPureRelativeScrollUpdateFrom(
const ScrollPositionUpdate& aUpdate);
void UpdatePendingScrollInfo(const ScrollPositionUpdate& aInfo) {
SetLayoutScrollOffset(aInfo.GetDestination());
mScrollGeneration = aInfo.GetGeneration();

View File

@ -82,7 +82,7 @@ ComputeBezierAnimationSettingsForOrigin(ScrollOrigin aOrigin) {
bool isOriginSmoothnessEnabled = false;
#define READ_DURATIONS(prefbase) \
isOriginSmoothnessEnabled = StaticPrefs::general_smoothScroll_ ## prefbase (); \
isOriginSmoothnessEnabled = StaticPrefs::general_smoothScroll() && StaticPrefs::general_smoothScroll_ ## prefbase (); \
if (isOriginSmoothnessEnabled) { \
minMS = StaticPrefs::general_smoothScroll_ ## prefbase ## _durationMinMS(); \
maxMS = StaticPrefs::general_smoothScroll_ ## prefbase ## _durationMaxMS(); \

View File

@ -4697,6 +4697,30 @@ void AsyncPanZoomController::NotifyLayersUpdated(
relativeDelta =
Some(Metrics().ApplyRelativeScrollUpdateFrom(scrollUpdate));
Metrics().RecalculateLayoutViewportOffset();
} else if (scrollUpdate.GetType() == ScrollUpdateType::PureRelative) {
APZC_LOG("%p pure-relative updating scroll offset from %s by %s\n", this,
ToString(Metrics().GetVisualScrollOffset()).c_str(),
ToString(scrollUpdate.GetDelta()).c_str());
// Always need a repaint request with a repaint type for pure relative
// scrolls because apz is doing the scroll at the main thread's request.
// The main thread has not updated it's scroll offset yet, it is depending
// on apz to tell it where to scroll.
needContentRepaint = true;
contentRepaintType = RepaintUpdateType::eVisualUpdate;
// We have to cancel a visual scroll offset update otherwise it will
// clobber the relative scrolling we are about to do. We perform
// visualScrollOffset = visualScrollOffset + delta. Then the
// visualScrollOffsetUpdated block below will do visualScrollOffset =
// aLayerMetrics.GetVisualDestination(). We need visual scroll offset
// updates to be incorporated into this scroll update loop to properly fix
// this.
visualScrollOffsetUpdated = false;
relativeDelta =
Some(Metrics().ApplyPureRelativeScrollUpdateFrom(scrollUpdate));
Metrics().RecalculateLayoutViewportOffset();
} else {
APZC_LOG("%p updating scroll offset from %s to %s\n", this,
ToString(Metrics().GetVisualScrollOffset()).c_str(),