Bug 1259296 - Do not scroll snap on the main thread for wheel events handled by APZ. r=kats
MozReview-Commit-ID: DudrJuO4pFM
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -3171,29 +3171,16 @@ EventStateManager::PostHandleEvent(nsPre
nsPluginFrame* pluginFrame = do_QueryFrame(frameToScroll);
// When APZ is enabled, the actual scroll animation might be handled by
// the compositor.
WheelPrefs::Action action;
if (pluginFrame) {
MOZ_ASSERT(pluginFrame->WantsToHandleWheelEventAsDefaultAction());
action = WheelPrefs::ACTION_SEND_TO_PLUGIN;
- } else if (!wheelEvent->mayHaveMomentum &&
- nsLayoutUtils::IsScrollFrameWithSnapping(frameToScroll)) {
- // If the target has scroll-snapping points then we want to handle
- // the wheel event on the main thread even if we have APZ enabled. Do
- // so and let the APZ know that it should ignore this event. However,
- // if the wheel event is synthesized from a Mac trackpad or other device
- // that can generate additional momentum events, then we should allow
- // APZ to handle it, because it will track the velocity and predicted
- // destination from the momentum.
- if (wheelEvent->mFlags.mHandledByAPZ) {
- wheelEvent->PreventDefault();
- }
- action = WheelPrefs::GetInstance()->ComputeActionFor(wheelEvent);
} else if (wheelEvent->mFlags.mHandledByAPZ) {
action = WheelPrefs::ACTION_NONE;
} else {
action = WheelPrefs::GetInstance()->ComputeActionFor(wheelEvent);
}
switch (action) {
case WheelPrefs::ACTION_SCROLL: {
// For scrolling of default action, we should honor the mouse wheel
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -3502,22 +3502,16 @@ nsDisplayLayerEventRegions::AddFrame(nsD
mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, borderBox);
} else if (aFrame->GetType() == nsGkAtoms::objectFrame) {
// If the frame is a plugin frame and wants to handle wheel events as
// default action, we should add the frame to dispatch-to-content region.
nsPluginFrame* pluginFrame = do_QueryFrame(aFrame);
if (pluginFrame && pluginFrame->WantsToHandleWheelEventAsDefaultAction()) {
mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, borderBox);
}
- } else if (gfxPlatform::GetPlatform()->SupportsApzWheelInput() &&
- nsLayoutUtils::IsScrollFrameWithSnapping(aFrame->GetParent())) {
- // If the frame is the inner content of a scrollable frame with snap-points
- // then we want to handle wheel events for it on the main thread. Add it to
- // the d-t-c region so that APZ waits for the main thread.
- mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, borderBox);
}
// Touch action region
uint32_t touchAction = nsLayoutUtils::GetTouchActionFromFrame(aFrame);
if (touchAction & NS_STYLE_TOUCH_ACTION_NONE) {
mNoActionRegion.Or(mNoActionRegion, borderBox);
} else {
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -8936,26 +8936,16 @@ nsLayoutUtils::GetSelectionBoundingRect(
}
res = accumulator.mResultRect.IsEmpty() ? accumulator.mFirstRect :
accumulator.mResultRect;
}
return res;
}
-/* static */ bool
-nsLayoutUtils::IsScrollFrameWithSnapping(nsIFrame* aFrame)
-{
- nsIScrollableFrame* sf = do_QueryFrame(aFrame);
- if (!sf) {
- return false;
- }
- return sf->IsScrollFrameWithSnapping();
-}
-
/* static */ nsBlockFrame*
nsLayoutUtils::GetFloatContainingBlock(nsIFrame* aFrame)
{
nsIFrame* ancestor = aFrame->GetParent();
while (ancestor && !ancestor->IsFloatContainingBlock()) {
ancestor = ancestor->GetParent();
}
MOZ_ASSERT(!ancestor || GetAsBlock(ancestor),
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -2779,20 +2779,16 @@ public:
* Takes a selection, and returns selection's bounding rect which is relative
* to its root frame.
*
* @param aSel Selection to check
*/
static nsRect GetSelectionBoundingRect(mozilla::dom::Selection* aSel);
/**
- * Returns true if the given frame is a scrollframe and it has snap points.
- */
- static bool IsScrollFrameWithSnapping(nsIFrame* aFrame);
- /**
* Calculate the bounding rect of |aContent|, relative to the origin
* of the scrolled content of |aRootScrollFrame|.
* Where the element is contained inside a scrollable subframe, the
* bounding rect is clipped to the bounds of the subframe.
*/
static CSSRect GetBoundingContentRect(const nsIContent* aContent,
const nsIScrollableFrame* aRootScrollFrame);
--- a/layout/forms/nsListControlFrame.h
+++ b/layout/forms/nsListControlFrame.h
@@ -103,19 +103,16 @@ public:
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override;
#endif
// nsIFormControlFrame
virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue) override;
virtual void SetFocus(bool aOn = true, bool aRepaint = false) override;
- virtual bool IsScrollFrameWithSnapping() const override {
- return false;
- }
virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override;
virtual bool ShouldPropagateComputedBSizeToScrolledContent() const override;
// for accessibility purposes
#ifdef ACCESSIBILITY
virtual mozilla::a11y::AccType AccessibleType() override;
#endif
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -3639,36 +3639,16 @@ static void HandleScrollPref(nsIScrollab
aValue = NS_STYLE_OVERFLOW_HIDDEN;
break;
case nsIScrollable::Scrollbar_Always:
aValue = NS_STYLE_OVERFLOW_SCROLL;
break;
}
}
-bool
-ScrollFrameHelper::IsScrollFrameWithSnapping() const
-{
- nsPresContext* presContext = mOuter->PresContext();
- if (!presContext->IsDynamic() &&
- !(mIsRoot && presContext->HasPaginatedScrolling())) {
- return false;
- }
-
- if (!mIsRoot) {
- const nsStyleDisplay& display = *mOuter->StyleDisplay();
- return display.mScrollSnapTypeY != NS_STYLE_SCROLL_SNAP_TYPE_NONE ||
- display.mScrollSnapTypeX != NS_STYLE_SCROLL_SNAP_TYPE_NONE;
- } else {
- const ScrollbarStyles& display = presContext->GetViewportScrollbarStylesOverride();
- return display.mScrollSnapTypeY != NS_STYLE_SCROLL_SNAP_TYPE_NONE ||
- display.mScrollSnapTypeX != NS_STYLE_SCROLL_SNAP_TYPE_NONE;
- }
-}
-
ScrollbarStyles
ScrollFrameHelper::GetScrollbarStylesFromFrame() const
{
nsPresContext* presContext = mOuter->PresContext();
if (!presContext->IsDynamic() &&
!(mIsRoot && presContext->HasPaginatedScrolling())) {
return ScrollbarStyles(NS_STYLE_OVERFLOW_HIDDEN, NS_STYLE_OVERFLOW_HIDDEN);
}
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -53,17 +53,16 @@ public:
typedef mozilla::layers::Layer Layer;
class AsyncScroll;
class AsyncSmoothMSDScroll;
ScrollFrameHelper(nsContainerFrame* aOuter, bool aIsRoot);
~ScrollFrameHelper();
- bool IsScrollFrameWithSnapping() const;
mozilla::ScrollbarStyles GetScrollbarStylesFromFrame() const;
// If a child frame was added or removed on the scrollframe,
// reload our child frame list.
// We need this if a scrollbar frame is recreated.
void ReloadChildFrames();
nsresult CreateAnonymousContent(
@@ -747,19 +746,16 @@ public:
virtual nsresult CreateAnonymousContent(nsTArray<ContentInfo>& aElements) override;
virtual void AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
uint32_t aFilter) override;
// nsIScrollableFrame
virtual nsIFrame* GetScrolledFrame() const override {
return mHelper.GetScrolledFrame();
}
- virtual bool IsScrollFrameWithSnapping() const override {
- return mHelper.IsScrollFrameWithSnapping();
- }
virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override {
return mHelper.GetScrollbarStylesFromFrame();
}
virtual uint32_t GetScrollbarVisibility() const override {
return mHelper.GetScrollbarVisibility();
}
virtual nsMargin GetActualScrollbarSizes() const override {
return mHelper.GetActualScrollbarSizes();
@@ -1163,19 +1159,16 @@ public:
static void AdjustReflowStateForPrintPreview(nsBoxLayoutState& aState, bool& aSetBack);
static void AdjustReflowStateBack(nsBoxLayoutState& aState, bool aSetBack);
// nsIScrollableFrame
virtual nsIFrame* GetScrolledFrame() const override {
return mHelper.GetScrolledFrame();
}
- virtual bool IsScrollFrameWithSnapping() const override {
- return mHelper.IsScrollFrameWithSnapping();
- }
virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override {
return mHelper.GetScrollbarStylesFromFrame();
}
virtual uint32_t GetScrollbarVisibility() const override {
return mHelper.GetScrollbarVisibility();
}
virtual nsMargin GetActualScrollbarSizes() const override {
return mHelper.GetActualScrollbarSizes();
--- a/layout/generic/nsIScrollableFrame.h
+++ b/layout/generic/nsIScrollableFrame.h
@@ -60,18 +60,16 @@ public:
/**
* Get the styles (NS_STYLE_OVERFLOW_SCROLL, NS_STYLE_OVERFLOW_HIDDEN,
* or NS_STYLE_OVERFLOW_AUTO) governing the horizontal and vertical
* scrollbars for this frame.
*/
virtual mozilla::ScrollbarStyles GetScrollbarStyles() const = 0;
- virtual bool IsScrollFrameWithSnapping() const = 0;
-
enum { HORIZONTAL = 0x01, VERTICAL = 0x02 };
/**
* Return the scrollbars which are visible. It's OK to call this during reflow
* of the scrolled contents, in which case it will reflect the current
* assumptions about scrollbar visibility.
*/
virtual uint32_t GetScrollbarVisibility() const = 0;
/**