Index: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp |
index 32054fb3d7af13061465e7b559e9ec93b3931750..3f89d3f1e5672e1be5a266bccba3a61b653a58b0 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp |
@@ -114,9 +114,10 @@ PaintLayerScrollableArea::PaintLayerScrollableArea(PaintLayer& layer) |
// We save and restore only the scrollOffset as the other scroll values are recalculated. |
Element* element = toElement(node); |
m_scrollOffset = element->savedLayerScrollOffset(); |
- if (!m_scrollOffset.isZero()) |
+ if (!m_scrollOffset.isZero()) { |
scrollAnimator().setCurrentPosition( |
FloatPoint(m_scrollOffset.width(), m_scrollOffset.height())); |
+ } |
element->setSavedLayerScrollOffset(IntSize()); |
} |
updateResizerAreaSet(); |
@@ -148,9 +149,10 @@ void PaintLayerScrollableArea::dispose() { |
if (!box().documentBeingDestroyed()) { |
Node* node = box().node(); |
// FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/414283. |
- if (node && node->isElementNode()) |
+ if (node && node->isElementNode()) { |
toElement(node)->setSavedLayerScrollOffset( |
flooredIntSize(m_scrollOffset)); |
+ } |
} |
if (LocalFrame* frame = box().frame()) { |
@@ -498,8 +500,9 @@ IntRect PaintLayerScrollableArea::visibleContentRect( |
: 0; |
} |
+ // TODO(szager): Handle fractional scroll offsets correctly. |
return IntRect( |
- IntPoint(scrollXOffset(), scrollYOffset()), |
+ IntPoint(flooredIntSize(adjustedScrollOffset())), |
IntSize(max(0, layer()->size().width() - verticalScrollbarWidth), |
max(0, layer()->size().height() - horizontalScrollbarHeight))); |
} |
@@ -635,17 +638,11 @@ void PaintLayerScrollableArea::updateScrollDimensions() { |
updateScrollOrigin(); |
} |
-void PaintLayerScrollableArea::scrollToPosition( |
- const DoublePoint& scrollPosition, |
- ScrollOffsetClamping clamp, |
- ScrollBehavior scrollBehavior, |
+void PaintLayerScrollableArea::setScrollPositionUnconditionally( |
+ const DoublePoint& position, |
ScrollType scrollType) { |
- DoublePoint newScrollPosition = clamp == ScrollOffsetClamped |
- ? clampScrollPosition(scrollPosition) |
- : scrollPosition; |
- if (newScrollPosition != scrollPositionDouble()) |
- ScrollableArea::setScrollPosition(newScrollPosition, scrollType, |
- scrollBehavior); |
+ cancelScrollAnimation(); |
skobes
2016/10/04 22:25:26
Is this what happened before? (cancelling the anim
szager1
2016/10/04 22:54:13
Yes, it's the same thing that ProgrammaticScrollAn
|
+ scrollPositionChanged(position, scrollType); |
} |
void PaintLayerScrollableArea::updateAfterLayout() { |
@@ -806,9 +803,13 @@ void PaintLayerScrollableArea::clampScrollPositionsAfterLayout() { |
if (shouldPerformScrollAnchoring()) |
m_scrollAnchor.restore(); |
- DoublePoint clamped = clampScrollPosition(scrollPositionDouble()); |
- if (clamped != scrollPositionDouble() || scrollOriginChanged()) |
- ScrollableArea::setScrollPosition(clamped, ProgrammaticScroll); |
+ if (scrollOriginChanged()) { |
+ setScrollPositionUnconditionally( |
+ clampScrollPosition(scrollPositionDouble())); |
+ } else { |
+ ScrollableArea::setScrollPosition(scrollPositionDouble(), |
bokan
2016/10/04 22:17:25
Why not just ScrollableArea::setScrollPosition
szager1
2016/10/04 22:54:14
I don't understand the question; maybe you're aski
bokan
2016/10/04 22:56:51
What I meant was, since ScrollableArea::setScrollP
szager1
2016/10/04 23:37:37
No, this is necessary for the case where the scrol
bokan
2016/10/04 23:38:38
Got it, thanks.
|
+ ProgrammaticScroll); |
+ } |
setNeedsScrollPositionClamp(false); |
resetScrollOriginChanged(); |
@@ -1563,17 +1564,17 @@ LayoutRect PaintLayerScrollableArea::scrollIntoView( |
DoublePoint clampedScrollPosition = clampScrollPosition( |
scrollPositionDouble() + roundedIntSize(r.location())); |
- if (clampedScrollPosition == scrollPositionDouble()) |
+ if (clampedScrollPosition == scrollPositionDouble()) { |
return LayoutRect( |
box() |
.localToAbsoluteQuad(FloatQuad(FloatRect(intersection( |
layerBounds, localExposeRect))), |
UseTransforms) |
.boundingBox()); |
+ } |
DoubleSize oldScrollOffset = adjustedScrollOffset(); |
- scrollToPosition(clampedScrollPosition, ScrollOffsetUnclamped, |
- ScrollBehaviorInstant, scrollType); |
+ setScrollPosition(clampedScrollPosition, scrollType, ScrollBehaviorInstant); |
DoubleSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollOffset; |
localExposeRect.move(-LayoutSize(scrollOffsetDifference)); |
return LayoutRect( |