bug 1249162 - Fix unwanted thumb shifts when starting APZ drag r=botond

Fix thumb position determination in these places:
- nsSliderFrame::StartAPZDrag() -- Constrain sliderTrack using
  GetXULClientRect() to match dimensions used in
  SetCurrentThumbPosition() and DoXULLayout(). This is what caused
  the scaling/offset mismatch.
- nsSliderFrame::StartAPZDrag() -- Adjust nonsensical calculation of
  cssSliderTrack. Should be sliderFrame + scrollbarFramePosition -
  compositionBoundsPosition, to get coordinates relative to the same
  region as that of APZ event coordinates.
- AsyncDragMetrics -- Make mScrollTrack and mScrollbarDragOffset float
  instead of int coordinates.
- AsyncPanZoomController::HandleDragEvent() -- Use
  GetAxisLength(scrollTrack) instead of GetAxisEnd(scrollTrack) in
  calculation of scrollMax.
- AsyncPanZoomController::HandleDragEvent() -- Only change position on
  MOUSE_MOVE.

Additional refactors:
- Rename HitTestingTreeNode::GetScrollSize() to GetScrollThumbLength(),
  along with related functions/variables.
- Rename AsyncPanZoomController::GetAxisSize() to GetAxisLength().
- Rename cf to scrollFrame in nsSliderFrame::StartAPZDrag().

MozReview-Commit-ID: CIsU8Pj6qfa

--HG--
extra : rebase_source : 29548fb95ec3e958d903d964753857ee949753ba
This commit is contained in:
Kevin Wern 2016-11-27 20:48:08 -05:00
Родитель 416bbcf818
Коммит e4d8f7fbe8
7 изменённых файлов: 43 добавлений и 30 удалений

Просмотреть файл

@ -423,7 +423,7 @@ public:
return mLayer->GetScrollbarTargetContainerId();
}
int32_t GetScrollbarSize() const
int32_t GetScrollThumbLength() const
{
if (GetScrollbarDirection() == Layer::VERTICAL) {
return mLayer->GetVisibleRegion().GetBounds().height;

Просмотреть файл

@ -478,7 +478,7 @@ APZCTreeManager::PrepareNodeForLayer(const LayerMetricsWrapper& aLayer,
GetEventRegionsOverride(aParent, aLayer));
node->SetScrollbarData(aLayer.GetScrollbarTargetContainerId(),
aLayer.GetScrollbarDirection(),
aLayer.GetScrollbarSize(),
aLayer.GetScrollThumbLength(),
aLayer.IsScrollbarContainer());
node->SetFixedPosData(aLayer.GetFixedPositionScrollContainerId());
return node;
@ -665,7 +665,7 @@ APZCTreeManager::PrepareNodeForLayer(const LayerMetricsWrapper& aLayer,
node->SetScrollbarData(aLayer.GetScrollbarTargetContainerId(),
aLayer.GetScrollbarDirection(),
aLayer.GetScrollbarSize(),
aLayer.GetScrollThumbLength(),
aLayer.IsScrollbarContainer());
node->SetFixedPosData(aLayer.GetFixedPositionScrollContainerId());
return node;

Просмотреть файл

@ -40,8 +40,8 @@ public:
AsyncDragMetrics(const FrameMetrics::ViewID& aViewId,
uint32_t aPresShellId,
uint64_t aDragStartSequenceNumber,
CSSIntCoord aScrollbarDragOffset,
const CSSIntRect& aScrollTrack,
CSSCoord aScrollbarDragOffset,
const CSSRect& aScrollTrack,
DragDirection aDirection)
: mViewId(aViewId)
, mPresShellId(aPresShellId)
@ -54,8 +54,8 @@ public:
FrameMetrics::ViewID mViewId;
uint32_t mPresShellId;
uint64_t mDragStartSequenceNumber;
CSSIntCoord mScrollbarDragOffset;
CSSIntRect mScrollTrack;
CSSCoord mScrollbarDragOffset;
CSSRect mScrollTrack;
DragDirection mDirection;
};

Просмотреть файл

@ -861,7 +861,7 @@ static IntCoordTyped<Units> GetAxisStart(AsyncDragMetrics::DragDirection aDir, c
}
template <typename Units>
static IntCoordTyped<Units> GetAxisEnd(AsyncDragMetrics::DragDirection aDir, const IntRectTyped<Units>& aValue) {
static CoordTyped<Units> GetAxisEnd(AsyncDragMetrics::DragDirection aDir, const RectTyped<Units>& aValue) {
if (aDir == AsyncDragMetrics::HORIZONTAL) {
return aValue.x + aValue.width;
} else {
@ -870,7 +870,7 @@ static IntCoordTyped<Units> GetAxisEnd(AsyncDragMetrics::DragDirection aDir, con
}
template <typename Units>
static CoordTyped<Units> GetAxisSize(AsyncDragMetrics::DragDirection aDir, const RectTyped<Units>& aValue) {
static CoordTyped<Units> GetAxisLength(AsyncDragMetrics::DragDirection aDir, const RectTyped<Units>& aValue) {
if (aDir == AsyncDragMetrics::HORIZONTAL) {
return aValue.width;
} else {
@ -898,6 +898,10 @@ nsEventStatus AsyncPanZoomController::HandleDragEvent(const MouseInput& aEvent,
return nsEventStatus_eConsumeNoDefault;
}
if (aEvent.mType != MouseInput::MouseType::MOUSE_MOVE) {
return nsEventStatus_eConsumeNoDefault;
}
RefPtr<HitTestingTreeNode> node =
GetApzcTreeManager()->FindScrollNode(aDragMetrics);
if (!node) {
@ -915,12 +919,12 @@ nsEventStatus AsyncPanZoomController::HandleDragEvent(const MouseInput& aEvent,
CSSRect cssCompositionBound = mFrameMetrics.CalculateCompositedRectInCssPixels();
CSSCoord mousePosition = GetAxisStart(aDragMetrics.mDirection, scrollbarPoint) -
CSSCoord(aDragMetrics.mScrollbarDragOffset) -
aDragMetrics.mScrollbarDragOffset -
GetAxisStart(aDragMetrics.mDirection, cssCompositionBound) -
CSSCoord(GetAxisStart(aDragMetrics.mDirection, aDragMetrics.mScrollTrack));
GetAxisStart(aDragMetrics.mDirection, aDragMetrics.mScrollTrack);
CSSCoord scrollMax = CSSCoord(GetAxisEnd(aDragMetrics.mDirection, aDragMetrics.mScrollTrack));
scrollMax -= node->GetScrollSize() /
CSSCoord scrollMax = GetAxisLength(aDragMetrics.mDirection, aDragMetrics.mScrollTrack);
scrollMax -= node->GetScrollThumbLength() /
GetAxisScale(aDragMetrics.mDirection, mFrameMetrics.GetZoom()) *
mFrameMetrics.GetPresShellResolution();
@ -929,8 +933,8 @@ nsEventStatus AsyncPanZoomController::HandleDragEvent(const MouseInput& aEvent,
CSSCoord minScrollPosition =
GetAxisStart(aDragMetrics.mDirection, mFrameMetrics.GetScrollableRect().TopLeft());
CSSCoord maxScrollPosition =
GetAxisSize(aDragMetrics.mDirection, mFrameMetrics.GetScrollableRect()) -
GetAxisSize(aDragMetrics.mDirection, cssCompositionBound);
GetAxisLength(aDragMetrics.mDirection, mFrameMetrics.GetScrollableRect()) -
GetAxisLength(aDragMetrics.mDirection, cssCompositionBound);
CSSCoord scrollPosition = scrollPercent * maxScrollPosition;
scrollPosition = std::max(scrollPosition, minScrollPosition);

Просмотреть файл

@ -27,7 +27,7 @@ HitTestingTreeNode::HitTestingTreeNode(AsyncPanZoomController* aApzc,
, mLayersId(aLayersId)
, mScrollViewId(FrameMetrics::NULL_SCROLL_ID)
, mScrollDir(Layer::NONE)
, mScrollSize(0)
, mScrollThumbLength(0)
, mIsScrollbarContainer(false)
, mFixedPosTarget(FrameMetrics::NULL_SCROLL_ID)
, mOverride(EventRegionsOverride::NoOverride)
@ -96,12 +96,12 @@ HitTestingTreeNode::SetLastChild(HitTestingTreeNode* aChild)
void
HitTestingTreeNode::SetScrollbarData(FrameMetrics::ViewID aScrollViewId,
Layer::ScrollDirection aDir,
int32_t aScrollSize,
int32_t aScrollThumbLength,
bool aIsScrollContainer)
{
mScrollViewId = aScrollViewId;
mScrollDir = aDir;
mScrollSize = aScrollSize;;
mScrollThumbLength = aScrollThumbLength;
mIsScrollbarContainer = aIsScrollContainer;
}
@ -115,10 +115,10 @@ HitTestingTreeNode::MatchesScrollDragMetrics(const AsyncDragMetrics& aDragMetric
mScrollViewId == aDragMetrics.mViewId;
}
int32_t
HitTestingTreeNode::GetScrollSize() const
LayerIntCoord
HitTestingTreeNode::GetScrollThumbLength() const
{
return mScrollSize;
return mScrollThumbLength;
}
bool

Просмотреть файл

@ -93,10 +93,10 @@ public:
void SetScrollbarData(FrameMetrics::ViewID aScrollViewId,
Layer::ScrollDirection aDir,
int32_t aScrollSize,
int32_t aScrollThumbLength,
bool aIsScrollContainer);
bool MatchesScrollDragMetrics(const AsyncDragMetrics& aDragMetrics) const;
int32_t GetScrollSize() const;
LayerIntCoord GetScrollThumbLength() const;
bool IsScrollbarNode() const;
/* Fixed pos info */
@ -130,7 +130,7 @@ private:
FrameMetrics::ViewID mScrollViewId;
Layer::ScrollDirection mScrollDir;
int32_t mScrollSize;
int32_t mScrollThumbLength;
bool mIsScrollbarContainer;
FrameMetrics::ViewID mFixedPosTarget;

Просмотреть файл

@ -936,16 +936,21 @@ nsSliderFrame::StartAPZDrag()
return false;
}
nsContainerFrame* cf = GetScrollbar()->GetParent();
if (!cf) {
nsContainerFrame* scrollFrame = GetScrollbar()->GetParent();
if (!scrollFrame) {
return false;
}
nsIContent* scrollableContent = cf->GetContent();
nsIContent* scrollableContent = scrollFrame->GetContent();
if (!scrollableContent) {
return false;
}
nsIScrollableFrame* scrollFrameAsScrollable = do_QueryFrame(scrollFrame);
if (!scrollFrameAsScrollable) {
return false;
}
mozilla::layers::FrameMetrics::ViewID scrollTargetId;
bool hasID = nsLayoutUtils::FindIDFor(scrollableContent, &scrollTargetId);
bool hasAPZView = hasID && (scrollTargetId != layers::FrameMetrics::NULL_SCROLL_ID);
@ -957,14 +962,18 @@ nsSliderFrame::StartAPZDrag()
nsIFrame* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar = GetContentOfBox(scrollbarBox);
nsRect sliderTrack;
GetXULClientRect(sliderTrack);
// This rect is the range in which the scroll thumb can slide in.
nsRect sliderTrack = GetRect() - scrollbarBox->GetPosition();
CSSIntRect sliderTrackCSS = CSSIntRect::FromAppUnitsRounded(sliderTrack);
sliderTrack = sliderTrack + GetRect().TopLeft() + scrollbarBox->GetPosition() -
scrollFrameAsScrollable->GetScrollPortRect().TopLeft();
CSSRect sliderTrackCSS = CSSRect::FromAppUnits(sliderTrack);
uint64_t inputblockId = InputAPZContext::GetInputBlockId();
uint32_t presShellId = PresContext()->PresShell()->GetPresShellId();
AsyncDragMetrics dragMetrics(scrollTargetId, presShellId, inputblockId,
NSAppUnitsToIntPixels(mDragStart,
NSAppUnitsToFloatPixels(mDragStart,
float(AppUnitsPerCSSPixel())),
sliderTrackCSS,
IsXULHorizontal() ? AsyncDragMetrics::HORIZONTAL :