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

Unified Diff: Source/core/rendering/RenderLayer.cpp

Issue 16982005: Allow objects without scrollbars to be scrollable (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix broken Mac build Created 7 years, 6 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: Source/core/rendering/RenderLayer.cpp
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
index 70f6a3e44e358bdcd4586651d1ec5fb1fe8afff1..f66e0e5d920edc16a6ff54718254be76fea44c60 100644
--- a/Source/core/rendering/RenderLayer.cpp
+++ b/Source/core/rendering/RenderLayer.cpp
@@ -1329,6 +1329,29 @@ IntRect RenderLayer::scrollableAreaBoundingBox() const
return renderer()->absoluteBoundingBoxRect();
}
+bool RenderLayer::userInputScrollable(ScrollbarOrientation orientation) const
+{
+ RenderBox* box = renderBox();
+ ASSERT(box);
+
+ EOverflow overflowStyle = (orientation == HorizontalScrollbar) ?
+ renderer()->style()->overflowX() : renderer()->style()->overflowY();
+ return (overflowStyle == OSCROLL || overflowStyle == OAUTO);
+}
+
+int RenderLayer::pageStep(ScrollbarOrientation orientation) const
+{
+ RenderBox* box = renderBox();
+ ASSERT(box);
+
+ int length = (orientation == HorizontalScrollbar) ?
+ box->pixelSnappedClientWidth() : box->pixelSnappedClientHeight();
+ int minPageStep = static_cast<float>(length) * ScrollableArea::minFractionToStepWhenPaging();
+ int pageStep = max(minPageStep, length - ScrollableArea::maxOverlapBetweenPages());
+
+ return max(pageStep, 1);
+}
+
RenderLayer* RenderLayer::enclosingTransformedAncestor() const
{
RenderLayer* curr = parent();
@@ -2489,17 +2512,8 @@ void RenderLayer::resize(const PlatformEvent& evt, const LayoutSize& oldOffset)
int RenderLayer::scrollSize(ScrollbarOrientation orientation) const
{
- Scrollbar* scrollbar = ((orientation == HorizontalScrollbar) ? m_hBar : m_vBar).get();
- return scrollbar ? (scrollbar->totalSize() - scrollbar->visibleSize()) : 0;
-}
-
-int RenderLayer::scrollPosition(Scrollbar* scrollbar) const
-{
- if (scrollbar->orientation() == HorizontalScrollbar)
- return scrollXOffset();
- if (scrollbar->orientation() == VerticalScrollbar)
- return scrollYOffset();
- return 0;
+ IntSize scrollDims = maximumScrollPosition() - minimumScrollPosition();
tdanderson 2013/07/15 23:17:44 scrollDims -> scrollDimensions
bokan 2013/07/22 15:08:47 Done.
+ return (orientation == HorizontalScrollbar) ? scrollDims.width() : scrollDims.height();
}
IntPoint RenderLayer::scrollPosition() const
@@ -2518,9 +2532,7 @@ IntPoint RenderLayer::maximumScrollPosition() const
if (!box || !box->hasOverflowClip())
return -scrollOrigin();
- LayoutRect overflowRect(box->layoutOverflowRect());
- box->flipForWritingMode(overflowRect);
- return -scrollOrigin() + enclosingIntRect(overflowRect).size() - enclosingIntRect(box->clientBoxRect()).size();
+ return -scrollOrigin() + enclosingIntRect(m_overflowRect).size() - enclosingIntRect(box->clientBoxRect()).size();
}
IntRect RenderLayer::visibleContentRect(VisibleContentRectIncludesScrollbars scrollbarInclusion) const
@@ -2860,14 +2872,6 @@ void RenderLayer::destroyScrollbar(ScrollbarOrientation orientation)
scrollbar = 0;
}
-bool RenderLayer::scrollsOverflow() const
-{
- if (!renderer()->isBox())
- return false;
-
- return toRenderBox(renderer())->scrollsOverflow();
-}
-
void RenderLayer::setHasHorizontalScrollbar(bool hasScrollbar)
{
if (hasScrollbar == hasHorizontalScrollbar())
@@ -2989,7 +2993,7 @@ int RenderLayer::scrollWidth() const
ASSERT(renderBox());
if (m_scrollDimensionsDirty)
const_cast<RenderLayer*>(this)->computeScrollDimensions();
- return snapSizeToPixel(m_scrollSize.width(), renderBox()->clientLeft() + renderBox()->x());
+ return snapSizeToPixel(m_overflowRect.width(), renderBox()->clientLeft() + renderBox()->x());
}
int RenderLayer::scrollHeight() const
@@ -2997,39 +3001,7 @@ int RenderLayer::scrollHeight() const
ASSERT(renderBox());
if (m_scrollDimensionsDirty)
const_cast<RenderLayer*>(this)->computeScrollDimensions();
- return snapSizeToPixel(m_scrollSize.height(), renderBox()->clientTop() + renderBox()->y());
-}
-
-LayoutUnit RenderLayer::overflowTop() const
-{
- RenderBox* box = renderBox();
- LayoutRect overflowRect(box->layoutOverflowRect());
- box->flipForWritingMode(overflowRect);
- return overflowRect.y();
-}
-
-LayoutUnit RenderLayer::overflowBottom() const
-{
- RenderBox* box = renderBox();
- LayoutRect overflowRect(box->layoutOverflowRect());
- box->flipForWritingMode(overflowRect);
- return overflowRect.maxY();
-}
-
-LayoutUnit RenderLayer::overflowLeft() const
-{
- RenderBox* box = renderBox();
- LayoutRect overflowRect(box->layoutOverflowRect());
- box->flipForWritingMode(overflowRect);
- return overflowRect.x();
-}
-
-LayoutUnit RenderLayer::overflowRight() const
-{
- RenderBox* box = renderBox();
- LayoutRect overflowRect(box->layoutOverflowRect());
- box->flipForWritingMode(overflowRect);
- return overflowRect.maxX();
+ return snapSizeToPixel(m_overflowRect.height(), renderBox()->clientTop() + renderBox()->y());
}
void RenderLayer::computeScrollDimensions()
@@ -3039,11 +3011,11 @@ void RenderLayer::computeScrollDimensions()
m_scrollDimensionsDirty = false;
- m_scrollSize.setWidth(overflowRight() - overflowLeft());
- m_scrollSize.setHeight(overflowBottom() - overflowTop());
+ m_overflowRect = box->layoutOverflowRect();
+ box->flipForWritingMode(m_overflowRect);
- int scrollableLeftOverflow = overflowLeft() - box->borderLeft();
- int scrollableTopOverflow = overflowTop() - box->borderTop();
+ int scrollableLeftOverflow = m_overflowRect.x() - box->borderLeft();
+ int scrollableTopOverflow = m_overflowRect.y() - box->borderTop();
setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow));
}
@@ -3126,15 +3098,11 @@ void RenderLayer::updateScrollbarsAfterLayout()
// Set up the range (and page step/line step).
if (m_hBar) {
int clientWidth = box->pixelSnappedClientWidth();
- int pageStep = max(max<int>(clientWidth * Scrollbar::minFractionToStepWhenPaging(), clientWidth - Scrollbar::maxOverlapBetweenPages()), 1);
- m_hBar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
- m_hBar->setProportion(clientWidth, m_scrollSize.width());
+ m_hBar->setProportion(clientWidth, m_overflowRect.width());
}
if (m_vBar) {
int clientHeight = box->pixelSnappedClientHeight();
- int pageStep = max(max<int>(clientHeight * Scrollbar::minFractionToStepWhenPaging(), clientHeight - Scrollbar::maxOverlapBetweenPages()), 1);
- m_vBar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
- m_vBar->setProportion(clientHeight, m_scrollSize.height());
+ m_vBar->setProportion(clientHeight, m_overflowRect.height());
}
updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow());

Powered by Google App Engine
This is Rietveld 408576698