Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
index 515cacad14698660e7c442b3bbd0d9c8a45405f9..196a2f1d2316777b0f2d53fe467703e35735e793 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
@@ -263,22 +263,18 @@ |
} |
// If our zoom factor changes and we have a defined scrollLeft/Top, we need to |
- // adjust that value into the new zoomed coordinate space. Note that the new |
- // scroll position may be outside the normal min/max range of the scrollable |
- // area, which is weird but OK, because the scrollable area will update its |
- // min/max in updateAfterLayout(). |
+ // adjust that value into the new zoomed coordinate space. |
if (hasOverflowClip() && oldStyle && |
oldStyle->effectiveZoom() != newStyle.effectiveZoom()) { |
PaintLayerScrollableArea* scrollableArea = this->getScrollableArea(); |
ASSERT(scrollableArea); |
- // We use scrollPosition() rather than adjustedScrollPosition(), because |
- // scrollPosition is the distance from the beginning of flow for the box, |
- // which is the dimension we want to preserve. |
- DoublePoint oldPosition = scrollableArea->scrollPositionDouble(); |
- if (oldPosition.x() || oldPosition.y()) { |
- DoublePoint newPosition = oldPosition.scaledBy(newStyle.effectiveZoom() / |
- oldStyle->effectiveZoom()); |
- scrollableArea->setScrollPositionUnconditionally(newPosition); |
+ if (int left = scrollableArea->scrollXOffset()) { |
+ left = (left / oldStyle->effectiveZoom()) * newStyle.effectiveZoom(); |
+ scrollableArea->scrollToXOffset(left); |
+ } |
+ if (int top = scrollableArea->scrollYOffset()) { |
+ top = (top / oldStyle->effectiveZoom()) * newStyle.effectiveZoom(); |
+ scrollableArea->scrollToYOffset(top); |
} |
} |
@@ -526,15 +522,13 @@ |
} |
LayoutUnit LayoutBox::scrollLeft() const { |
- return hasOverflowClip() |
- ? LayoutUnit(getScrollableArea()->adjustedScrollOffset().width()) |
- : LayoutUnit(); |
+ return hasOverflowClip() ? LayoutUnit(getScrollableArea()->scrollXOffset()) |
+ : LayoutUnit(); |
} |
LayoutUnit LayoutBox::scrollTop() const { |
- return hasOverflowClip() |
- ? LayoutUnit(getScrollableArea()->adjustedScrollOffset().height()) |
- : LayoutUnit(); |
+ return hasOverflowClip() ? LayoutUnit(getScrollableArea()->scrollYOffset()) |
+ : LayoutUnit(); |
} |
int LayoutBox::pixelSnappedScrollWidth() const { |
@@ -555,12 +549,9 @@ |
// setScrollTop does, presumably this code does as well. |
DisableCompositingQueryAsserts disabler; |
- if (hasOverflowClip()) { |
- PaintLayerScrollableArea* scrollableArea = getScrollableArea(); |
- scrollableArea->scrollToOffset( |
- DoubleSize(newLeft, scrollableArea->adjustedScrollOffset().height()), |
- ScrollBehaviorAuto); |
- } |
+ if (hasOverflowClip()) |
+ getScrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped, |
+ ScrollBehaviorAuto); |
} |
void LayoutBox::setScrollTop(LayoutUnit newTop) { |
@@ -568,12 +559,9 @@ |
// compositing/overflow/do-not-assert-on-invisible-composited-layers.html |
DisableCompositingQueryAsserts disabler; |
- if (hasOverflowClip()) { |
- PaintLayerScrollableArea* scrollableArea = getScrollableArea(); |
- scrollableArea->scrollToOffset( |
- DoubleSize(scrollableArea->adjustedScrollOffset().width(), newTop), |
- ScrollBehaviorAuto); |
- } |
+ if (hasOverflowClip()) |
+ getScrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped, |
+ ScrollBehaviorAuto); |
} |
void LayoutBox::scrollToOffset(const DoubleSize& offset, |
@@ -583,7 +571,8 @@ |
DisableCompositingQueryAsserts disabler; |
if (hasOverflowClip()) |
- getScrollableArea()->scrollToOffset(offset, scrollBehavior); |
+ getScrollableArea()->scrollToOffset(offset, ScrollOffsetClamped, |
+ scrollBehavior); |
} |
// Returns true iff we are attempting an autoscroll inside an iframe with |
@@ -1104,7 +1093,8 @@ |
scroll(ScrollByPixel, FloatSize(adjustedScrollDelta(delta))); |
} |
-void LayoutBox::scrollByRecursively(const DoubleSize& delta) { |
+void LayoutBox::scrollByRecursively(const DoubleSize& delta, |
+ ScrollOffsetClamping clamp) { |
if (delta.isZero()) |
return; |
@@ -1117,7 +1107,7 @@ |
ASSERT(scrollableArea); |
DoubleSize newScrollOffset = scrollableArea->adjustedScrollOffset() + delta; |
- scrollableArea->scrollToOffset(newScrollOffset); |
+ scrollableArea->scrollToOffset(newScrollOffset, clamp); |
// If this layer can't do the scroll we ask the next layer up that can |
// scroll to try. |
@@ -1125,7 +1115,7 @@ |
newScrollOffset - scrollableArea->adjustedScrollOffset(); |
if (!remainingScrollOffset.isZero() && parent()) { |
if (LayoutBox* scrollableBox = enclosingScrollableBox()) |
- scrollableBox->scrollByRecursively(remainingScrollOffset); |
+ scrollableBox->scrollByRecursively(remainingScrollOffset, clamp); |
LocalFrame* frame = this->frame(); |
if (frame && frame->page()) |