diff --git a/gfx/ipc/GfxMessageUtils.h b/gfx/ipc/GfxMessageUtils.h index c54ddeb334e5..462e2f29382f 100644 --- a/gfx/ipc/GfxMessageUtils.h +++ b/gfx/ipc/GfxMessageUtils.h @@ -1305,7 +1305,6 @@ struct ParamTraits WriteParam(aMsg, aParam.mPresShellId); WriteParam(aMsg, aParam.mDragStartSequenceNumber); WriteParam(aMsg, aParam.mScrollbarDragOffset); - WriteParam(aMsg, aParam.mScrollTrack); WriteParam(aMsg, aParam.mDirection); } @@ -1315,7 +1314,6 @@ struct ParamTraits ReadParam(aMsg, aIter, &aResult->mPresShellId) && ReadParam(aMsg, aIter, &aResult->mDragStartSequenceNumber) && ReadParam(aMsg, aIter, &aResult->mScrollbarDragOffset) && - ReadParam(aMsg, aIter, &aResult->mScrollTrack) && ReadParam(aMsg, aIter, &aResult->mDirection)); } }; diff --git a/gfx/layers/LayerAttributes.h b/gfx/layers/LayerAttributes.h index 701d9a2861ca..dd73a75bc839 100644 --- a/gfx/layers/LayerAttributes.h +++ b/gfx/layers/LayerAttributes.h @@ -27,11 +27,15 @@ struct ScrollThumbData { ScrollThumbData(ScrollDirection aDirection, float aThumbRatio, CSSCoord aThumbLength, - bool aIsAsyncDraggable) + bool aIsAsyncDraggable, + CSSCoord aScrollTrackStart, + CSSCoord aScrollTrackLength) : mDirection(aDirection) , mThumbRatio(aThumbRatio) , mThumbLength(aThumbLength) , mIsAsyncDraggable(aIsAsyncDraggable) + , mScrollTrackStart(aScrollTrackStart) + , mScrollTrackLength(aScrollTrackLength) {} ScrollDirection mDirection; @@ -42,12 +46,16 @@ struct ScrollThumbData { CSSCoord mThumbLength; // Whether the scrollbar thumb can be dragged asynchronously. bool mIsAsyncDraggable; + CSSCoord mScrollTrackStart; + CSSCoord mScrollTrackLength; bool operator==(const ScrollThumbData& aOther) const { return mDirection == aOther.mDirection && mThumbRatio == aOther.mThumbRatio && mThumbLength == aOther.mThumbLength && - mIsAsyncDraggable == aOther.mIsAsyncDraggable; + mIsAsyncDraggable == aOther.mIsAsyncDraggable && + mScrollTrackStart == aOther.mScrollTrackStart && + mScrollTrackLength == aOther.mScrollTrackLength; } bool operator!=(const ScrollThumbData& aOther) const { return !(*this == aOther); diff --git a/gfx/layers/apz/src/AsyncDragMetrics.h b/gfx/layers/apz/src/AsyncDragMetrics.h index cd763a243e55..498605d7ff18 100644 --- a/gfx/layers/apz/src/AsyncDragMetrics.h +++ b/gfx/layers/apz/src/AsyncDragMetrics.h @@ -41,13 +41,11 @@ public: uint32_t aPresShellId, uint64_t aDragStartSequenceNumber, CSSCoord aScrollbarDragOffset, - const CSSRect& aScrollTrack, DragDirection aDirection) : mViewId(aViewId) , mPresShellId(aPresShellId) , mDragStartSequenceNumber(aDragStartSequenceNumber) , mScrollbarDragOffset(aScrollbarDragOffset) - , mScrollTrack(aScrollTrack) , mDirection(aDirection) {} @@ -55,7 +53,6 @@ public: uint32_t mPresShellId; uint64_t mDragStartSequenceNumber; CSSCoord mScrollbarDragOffset; - CSSRect mScrollTrack; DragDirection mDirection; }; diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp index c989f64f94bc..447870b10b77 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -926,9 +926,9 @@ nsEventStatus AsyncPanZoomController::HandleDragEvent(const MouseInput& aEvent, CSSCoord mousePosition = GetAxisStart(aDragMetrics.mDirection, scrollbarPoint) - aDragMetrics.mScrollbarDragOffset - GetAxisStart(aDragMetrics.mDirection, cssCompositionBound) - - GetAxisStart(aDragMetrics.mDirection, aDragMetrics.mScrollTrack); + thumbData.mScrollTrackStart; - CSSCoord scrollMax = GetAxisLength(aDragMetrics.mDirection, aDragMetrics.mScrollTrack); + CSSCoord scrollMax = thumbData.mScrollTrackLength; scrollMax -= thumbData.mThumbLength; float scrollPercent = mousePosition / scrollMax; diff --git a/layout/xul/nsSliderFrame.cpp b/layout/xul/nsSliderFrame.cpp index 54edae502823..3d289c6735e7 100644 --- a/layout/xul/nsSliderFrame.cpp +++ b/layout/xul/nsSliderFrame.cpp @@ -361,10 +361,10 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, thumb->GetXULMargin(m); thumbRect.Inflate(m); - nsRect crect; - GetXULClientRect(crect); + nsRect sliderTrack; + GetXULClientRect(sliderTrack); - if (crect.width < thumbRect.width || crect.height < thumbRect.height) + if (sliderTrack.width < thumbRect.width || sliderTrack.height < thumbRect.height) return; // If this scrollbar is the scrollbar of an actively scrolled scroll frame, @@ -394,6 +394,21 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, nsIFrame* scrollbarBox = GetScrollbar(); bool isAsyncDraggable = !UsesCustomScrollbarMediator(scrollbarBox); + nsPoint scrollPortOrigin; + if (nsIScrollableFrame* scrollFrame = do_QueryFrame(scrollbarBox->GetParent())) { + scrollPortOrigin = scrollFrame->GetScrollPortRect().TopLeft(); + } else { + isAsyncDraggable = false; + } + + // This rect is the range in which the scroll thumb can slide in. + sliderTrack = sliderTrack + GetRect().TopLeft() + scrollbarBox->GetPosition() - + scrollPortOrigin; + CSSCoord sliderTrackStart = NSAppUnitsToFloatPixels( + isHorizontal ? sliderTrack.x : sliderTrack.y, appUnitsPerCss); + CSSCoord sliderTrackLength = NSAppUnitsToFloatPixels( + isHorizontal ? sliderTrack.width : sliderTrack.height, appUnitsPerCss); + nsDisplayListBuilder::AutoContainerASRTracker contASRTracker(aBuilder); nsDisplayListCollection tempLists; nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, tempLists); @@ -418,7 +433,9 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, ScrollThumbData{scrollDirection, GetThumbRatio(), thumbLength, - isAsyncDraggable})); + isAsyncDraggable, + sliderTrackStart, + sliderTrackLength})); return; } @@ -1044,11 +1061,6 @@ nsSliderFrame::StartAPZDrag(WidgetGUIEvent* aEvent) return; } - nsIScrollableFrame* scrollFrameAsScrollable = do_QueryFrame(scrollFrame); - if (!scrollFrameAsScrollable) { - return; - } - // APZ dragging requires the scrollbar to be layerized, which doesn't // happen for scroll info layers. if (ScrollFrameWillBuildScrollInfoLayer(scrollFrame)) { @@ -1072,21 +1084,12 @@ nsSliderFrame::StartAPZDrag(WidgetGUIEvent* aEvent) nsCOMPtr scrollbar = GetContentOfBox(scrollbarBox); - nsRect sliderTrack; - GetXULClientRect(sliderTrack); - - // This rect is the range in which the scroll thumb can slide in. - sliderTrack = sliderTrack + GetRect().TopLeft() + scrollbarBox->GetPosition() - - scrollFrameAsScrollable->GetScrollPortRect().TopLeft(); - CSSRect sliderTrackCSS = CSSRect::FromAppUnits(sliderTrack); - nsIPresShell* shell = PresContext()->PresShell(); uint64_t inputblockId = InputAPZContext::GetInputBlockId(); uint32_t presShellId = shell->GetPresShellId(); AsyncDragMetrics dragMetrics(scrollTargetId, presShellId, inputblockId, NSAppUnitsToFloatPixels(mDragStart, float(AppUnitsPerCSSPixel())), - sliderTrackCSS, isHorizontal ? AsyncDragMetrics::HORIZONTAL : AsyncDragMetrics::VERTICAL);