gecko-dev/layout/generic/ScrollOrigin.h
Kartikaya Gupta 9b69abb395 Bug 1662013 - Make the scroll-behavior-element WPT test pass. r=tnikkel
The previous patches caused the scroll-behavior-element WPT to fail, specificallly
the subtest that does a no-op instant scroll immediately following an APZ smooth
scroll, within the same transaction. In this subtest, the APZ smooth scroll
request gets added to mScrollUpdates but then the instant scroll is a no-op
(destination is same as current position) so we early return and don't add a
scroll update for it. This patch adds a bit of code to the early-exit path to
detect this scenario and let APZ know to cancel the animation. By itself this
causes a different test to fail, because we also hit this codepath when the
main thread internally does a no-op instant scroll to reclamp the scroll offset
after a reflow. That requires further refining the condition with a new scroll
origin used for the clamping call.

This ain't the prettiest thing but I'm hopeful that after untangling more of
the surrounding code in the future we can replace this with something more
elegant.

Differential Revision: https://phabricator.services.mozilla.com/D88745
2020-09-12 13:06:12 +00:00

67 lines
2.6 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_ScrollOrigin_h_
#define mozilla_ScrollOrigin_h_
namespace mozilla {
// A scroll origin is a bit of a combination of "what part of the code caused
// this scroll" and "what special properties does this scroll have, in the
// context of what caused it". See specific comments below.
enum class ScrollOrigin : uint8_t {
// This is used as an initial value for the "LastScrollOrigin" property on
// scrollable frames. It is not intended to be an actual scroll origin, but
// a sentinel value that indicates that there was no "last scroll". It is
// used similarly for the "LastSmoothScrollOrigin" property, to indicate
// no smooth scroll is in progress.
None,
// This is a default value that we use when we don't know of a more specific
// value that we can use.
NotSpecified,
// The scroll came from APZ code.
Apz,
// The scroll came from an attempt at restoring a scroll position saved in
// the bfcache or history.
Restore,
// The scroll came from a "relative" scroll method like ScrollBy, where the
// scroll destination is indicated by a delta from the current position
// instead of an absolute value.
Relative,
// The scroll came from an attempt by the main thread to re-clamp the scroll
// position after a reflow.
Clamp,
// The following scroll origins also are associated with prefs of the form
// general.smoothScroll.<origin>(.*)
// e.g. general.smoothScroll.lines indicates whether or not a scroll with
// origin Lines will be animated smoothly, and e.g. subprefs like
// general.smoothScroll.lines.durationMinMS control some of the animation
// timing behavior.
// The scroll came from some sort of input that's not one of the above or
// below values. Generally this means it came from a content-exposed API,
// like window.scrollTo, but may also be from other sources that don't need
// any particular special handling.
Other,
// The scroll was originated by pixel-scrolling input device (e.g. precision
// mouse wheel).
Pixels,
// The scroll was originated by a line-scrolling input device (e.g. up/down
// keyboard buttons).
Lines,
// The scroll was originated by a page-scrolling input device (e.g. pgup/
// pgdn keyboard buttons).
Pages,
// The scroll was originated by a mousewheel that scrolls by lines.
MouseWheel,
// The scroll was originated by moving the scrollbars.
Scrollbars,
};
} // namespace mozilla
#endif // mozilla_ScrollOrigin_h_