Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2383113003: Refactor ScrollableArea::setScrollPosition. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 b59cf4626abb3a6e4380f5724f7e55c2d0214412..bf2bbdc558be98055fb006d193dae454530e77fe 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -256,18 +256,20 @@ void LayoutBox::styleDidChange(StyleDifference diff,
}
// If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the
- // new zoomed coordinate space.
+ // 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().
if (hasOverflowClip() && oldStyle &&
oldStyle->effectiveZoom() != newStyle.effectiveZoom()) {
PaintLayerScrollableArea* scrollableArea = this->getScrollableArea();
ASSERT(scrollableArea);
- 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);
+ // We use scrollPosition() rather than offsetFromOrigin(), 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);
}
}
@@ -512,13 +514,15 @@ LayoutUnit LayoutBox::scrollHeight() const {
}
LayoutUnit LayoutBox::scrollLeft() const {
- return hasOverflowClip() ? LayoutUnit(getScrollableArea()->scrollXOffset())
- : LayoutUnit();
+ return hasOverflowClip()
+ ? LayoutUnit(getScrollableArea()->offsetFromOrigin().width())
+ : LayoutUnit();
}
LayoutUnit LayoutBox::scrollTop() const {
- return hasOverflowClip() ? LayoutUnit(getScrollableArea()->scrollYOffset())
- : LayoutUnit();
+ return hasOverflowClip()
+ ? LayoutUnit(getScrollableArea()->offsetFromOrigin().height())
+ : LayoutUnit();
}
int LayoutBox::pixelSnappedScrollWidth() const {
@@ -539,18 +543,24 @@ void LayoutBox::setScrollLeft(LayoutUnit newLeft) {
// does, presumably this code does as well.
DisableCompositingQueryAsserts disabler;
- if (hasOverflowClip())
- getScrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped,
- ScrollBehaviorAuto);
+ if (!hasOverflowClip())
+ return;
+
+ PaintLayerScrollableArea* scrollableArea = getScrollableArea();
+ DoubleSize newOffset(newLeft, scrollableArea->offsetFromOrigin().height());
+ scrollableArea->scrollToOffsetFromOrigin(newOffset, ScrollBehaviorAuto);
}
void LayoutBox::setScrollTop(LayoutUnit newTop) {
// Hits in compositing/overflow/do-not-assert-on-invisible-composited-layers.html
DisableCompositingQueryAsserts disabler;
- if (hasOverflowClip())
- getScrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped,
- ScrollBehaviorAuto);
+ if (!hasOverflowClip())
+ return;
+
+ PaintLayerScrollableArea* scrollableArea = getScrollableArea();
+ DoubleSize newOffset(scrollableArea->offsetFromOrigin().width(), newTop);
+ scrollableArea->scrollToOffsetFromOrigin(newOffset, ScrollBehaviorAuto);
}
void LayoutBox::scrollToOffset(const DoubleSize& offset,
@@ -559,9 +569,10 @@ void LayoutBox::scrollToOffset(const DoubleSize& offset,
// does, presumably this code does as well.
DisableCompositingQueryAsserts disabler;
- if (hasOverflowClip())
- getScrollableArea()->scrollToOffset(offset, ScrollOffsetClamped,
- scrollBehavior);
+ if (!hasOverflowClip())
+ return;
+
+ getScrollableArea()->scrollToOffsetFromOrigin(offset, scrollBehavior);
}
// Returns true iff we are attempting an autoscroll inside an iframe with scrolling="no".
@@ -1076,8 +1087,7 @@ void LayoutBox::middleClickAutoscroll(const IntPoint& sourcePoint) {
scroll(ScrollByPixel, FloatSize(adjustedScrollDelta(delta)));
}
-void LayoutBox::scrollByRecursively(const DoubleSize& delta,
- ScrollOffsetClamping clamp) {
+void LayoutBox::scrollByRecursively(const DoubleSize& delta) {
if (delta.isZero())
return;
@@ -1089,15 +1099,15 @@ void LayoutBox::scrollByRecursively(const DoubleSize& delta,
PaintLayerScrollableArea* scrollableArea = this->getScrollableArea();
ASSERT(scrollableArea);
- DoubleSize newScrollOffset = scrollableArea->adjustedScrollOffset() + delta;
- scrollableArea->scrollToOffset(newScrollOffset, clamp);
+ DoubleSize newScrollOffset = scrollableArea->offsetFromOrigin() + delta;
+ scrollableArea->scrollToOffsetFromOrigin(newScrollOffset);
// If this layer can't do the scroll we ask the next layer up that can scroll to try
DoubleSize remainingScrollOffset =
- newScrollOffset - scrollableArea->adjustedScrollOffset();
+ newScrollOffset - scrollableArea->offsetFromOrigin();
if (!remainingScrollOffset.isZero() && parent()) {
if (LayoutBox* scrollableBox = enclosingScrollableBox())
- scrollableBox->scrollByRecursively(remainingScrollOffset, clamp);
+ scrollableBox->scrollByRecursively(remainingScrollOffset);
LocalFrame* frame = this->frame();
if (frame && frame->page())
@@ -1135,7 +1145,7 @@ IntSize LayoutBox::scrolledContentOffset() const {
ASSERT(hasLayer());
// FIXME: Return DoubleSize here. crbug.com/414283.
PaintLayerScrollableArea* scrollableArea = getScrollableArea();
- IntSize result = flooredIntSize(scrollableArea->scrollOffset()) +
+ IntSize result = flooredIntSize(scrollableArea->scrollPosition()) +
originAdjustmentForScrollbars();
if (isHorizontalWritingMode() &&
shouldPlaceBlockDirectionScrollbarOnLogicalLeft())

Powered by Google App Engine
This is Rietveld 408576698