mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
9b69abb395
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
67 lines
2.6 KiB
C++
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_
|