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

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

Issue 22893055: Split computeScrollDimensions() out of RenderLayer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated after Ian's comment. Created 7 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
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerScrollableArea.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderLayer.cpp
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
index ad7140e7d9eec108e4dfdb6e05ef0952b3217262..957df9c1bf388fec56c0767215b5535b1c098bbc 100644
--- a/Source/core/rendering/RenderLayer.cpp
+++ b/Source/core/rendering/RenderLayer.cpp
@@ -52,10 +52,8 @@
#include "core/dom/Document.h"
#include "core/dom/DocumentEventQueue.h"
#include "core/dom/shadow/ShadowRoot.h"
-#include "core/editing/FrameSelection.h"
#include "core/html/HTMLFrameElement.h"
#include "core/html/HTMLFrameOwnerElement.h"
-#include "core/inspector/InspectorInstrumentation.h"
#include "core/page/EventHandler.h"
#include "core/page/FocusController.h"
#include "core/page/Frame.h"
@@ -125,7 +123,6 @@ bool ClipRect::intersects(const HitTestLocation& hitTestLocation) const
RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
: m_inResizeMode(false)
- , m_scrollDimensionsDirty(true)
, m_normalFlowListDirty(true)
, m_hasSelfPaintingLayerDescendant(false)
, m_hasSelfPaintingLayerDescendantDirty(false)
@@ -2178,7 +2175,7 @@ void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping
if (renderer()->hasOverflowClip() && !restrictedByLineClamp) {
IntSize newScrollOffset = adjustedScrollOffset() + delta;
- scrollToOffset(newScrollOffset, clamp);
+ m_scrollableArea->scrollToOffset(newScrollOffset, clamp);
// If this layer can't do the scroll we ask the next layer up that can scroll to try
IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset();
@@ -2200,90 +2197,9 @@ void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping
}
}
-IntSize RenderLayer::clampScrollOffset(const IntSize& scrollOffset) const
-{
- RenderBox* box = renderBox();
- ASSERT(box);
-
- int maxX = scrollWidth() - box->pixelSnappedClientWidth();
- int maxY = scrollHeight() - box->pixelSnappedClientHeight();
-
- int x = max(min(scrollOffset.width(), maxX), 0);
- int y = max(min(scrollOffset.height(), maxY), 0);
- return IntSize(x, y);
-}
-
void RenderLayer::scrollToOffset(const IntSize& scrollOffset, ScrollOffsetClamping clamp)
{
- IntSize newScrollOffset = clamp == ScrollOffsetClamped ? clampScrollOffset(scrollOffset) : scrollOffset;
- if (newScrollOffset != adjustedScrollOffset())
- m_scrollableArea->scrollToOffsetWithoutAnimation(-scrollOrigin() + newScrollOffset);
-}
-
-void RenderLayer::setScrollOffset(const IntPoint& newScrollOffset)
-{
- RenderBox* box = renderBox();
- if (!box)
- return;
-
- if (!box->isMarquee()) {
- // Ensure that the dimensions will be computed if they need to be (for overflow:hidden blocks).
- if (m_scrollDimensionsDirty)
- computeScrollDimensions();
- }
-
- if (m_scrollableArea->scrollOffset() == toIntSize(newScrollOffset))
- return;
- m_scrollableArea->setScrollOffset(toIntSize(newScrollOffset));
-
- Frame* frame = renderer()->frame();
- InspectorInstrumentation::willScrollLayer(renderer());
-
- RenderView* view = renderer()->view();
-
- // We should have a RenderView if we're trying to scroll.
- ASSERT(view);
-
- // Update the positions of our child layers (if needed as only fixed layers should be impacted by a scroll).
- // We don't update compositing layers, because we need to do a deep update from the compositing ancestor.
- bool inLayout = view ? view->frameView()->isInLayout() : false;
- if (!inLayout) {
- // If we're in the middle of layout, we'll just update layers once layout has finished.
- updateLayerPositionsAfterOverflowScroll();
- if (view) {
- // Update regions, scrolling may change the clip of a particular region.
- view->frameView()->updateAnnotatedRegions();
- view->updateWidgetPositions();
- }
-
- updateCompositingLayersAfterScroll();
- }
-
- RenderLayerModelObject* repaintContainer = renderer()->containerForRepaint();
- if (frame) {
- // The caret rect needs to be invalidated after scrolling
- frame->selection().setCaretRectNeedsUpdate();
-
- FloatQuad quadForFakeMouseMoveEvent = FloatQuad(m_repaintRect);
- if (repaintContainer)
- quadForFakeMouseMoveEvent = repaintContainer->localToAbsoluteQuad(quadForFakeMouseMoveEvent);
- frame->eventHandler()->dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseMoveEvent);
- }
-
- bool requiresRepaint = true;
-
- if (compositor()->inCompositingMode() && usesCompositedScrolling())
- requiresRepaint = false;
-
- // Just schedule a full repaint of our object.
- if (view && requiresRepaint)
- renderer()->repaintUsingContainer(repaintContainer, pixelSnappedIntRect(m_repaintRect));
-
- // Schedule the scroll DOM event.
- if (renderer()->node())
- renderer()->node()->document().eventQueue()->enqueueOrDispatchScrollEvent(renderer()->node(), DocumentEventQueue::ScrollEventElementTarget);
-
- InspectorInstrumentation::didScrollLayer(renderer());
+ m_scrollableArea->scrollToOffset(scrollOffset, clamp);
}
static inline bool frameElementAndViewPermitScroll(HTMLFrameElementBase* frameElementBase, FrameView* frameView)
@@ -2330,10 +2246,10 @@ void RenderLayer::scrollRectToVisible(const LayoutRect& rect, const ScrollAlignm
LayoutRect layerBounds(0, 0, box->clientWidth(), box->clientHeight());
LayoutRect r = getRectToExpose(layerBounds, localExposeRect, alignX, alignY);
- IntSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset() + toIntSize(roundedIntRect(r).location()));
+ IntSize clampedScrollOffset = m_scrollableArea->clampScrollOffset(adjustedScrollOffset() + toIntSize(roundedIntRect(r).location()));
if (clampedScrollOffset != adjustedScrollOffset()) {
IntSize oldScrollOffset = adjustedScrollOffset();
- scrollToOffset(clampedScrollOffset);
+ m_scrollableArea->scrollToOffset(clampedScrollOffset);
IntSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollOffset;
localExposeRect.move(-scrollOffsetDifference);
newRect = LayoutRect(box->localToAbsoluteQuad(FloatQuad(FloatRect(localExposeRect)), UseTransforms).boundingBox());
@@ -2576,24 +2492,10 @@ void RenderLayer::resize(const PlatformEvent& evt, const LayoutSize& oldOffset)
int RenderLayer::scrollSize(ScrollbarOrientation orientation) const
{
- IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition();
+ IntSize scrollDimensions = scrollableArea()->maximumScrollPosition() - scrollableArea()->minimumScrollPosition();
return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scrollDimensions.height();
}
-IntPoint RenderLayer::minimumScrollPosition() const
-{
- return -scrollOrigin();
-}
-
-IntPoint RenderLayer::maximumScrollPosition() const
-{
- RenderBox* box = renderBox();
- if (!box || !box->hasOverflowClip())
- return -scrollOrigin();
-
- return -scrollOrigin() + enclosingIntRect(m_overflowRect).size() - enclosingIntRect(box->clientBoxRect()).size();
-}
-
IntSize RenderLayer::overhangAmount() const
{
return IntSize();
@@ -2733,11 +2635,6 @@ IntPoint RenderLayer::convertFromContainingViewToScrollbar(const Scrollbar* scro
return point;
}
-IntSize RenderLayer::contentsSize() const
-{
- return IntSize(scrollWidth(), scrollHeight());
-}
-
int RenderLayer::visibleHeight() const
{
return m_layerSize.height();
@@ -3035,57 +2932,12 @@ void RenderLayer::positionOverflowControls(const IntSize& offsetFromRoot)
int RenderLayer::scrollWidth() const
{
- ASSERT(renderBox());
- if (m_scrollDimensionsDirty)
- const_cast<RenderLayer*>(this)->computeScrollDimensions();
- return snapSizeToPixel(m_overflowRect.width(), renderBox()->clientLeft() + renderBox()->x());
+ return m_scrollableArea->scrollWidth();
}
int RenderLayer::scrollHeight() const
{
- ASSERT(renderBox());
- if (m_scrollDimensionsDirty)
- const_cast<RenderLayer*>(this)->computeScrollDimensions();
- return snapSizeToPixel(m_overflowRect.height(), renderBox()->clientTop() + renderBox()->y());
-}
-
-void RenderLayer::computeScrollDimensions()
-{
- RenderBox* box = renderBox();
- ASSERT(box);
-
- m_scrollDimensionsDirty = false;
-
- m_overflowRect = box->layoutOverflowRect();
- box->flipForWritingMode(m_overflowRect);
-
- int scrollableLeftOverflow = m_overflowRect.x() - box->borderLeft();
- int scrollableTopOverflow = m_overflowRect.y() - box->borderTop();
- m_scrollableArea->setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow));
-}
-
-bool RenderLayer::hasScrollableHorizontalOverflow() const
-{
- return hasHorizontalOverflow() && renderBox()->scrollsOverflowX();
-}
-
-bool RenderLayer::hasScrollableVerticalOverflow() const
-{
- return hasVerticalOverflow() && renderBox()->scrollsOverflowY();
-}
-
-bool RenderLayer::hasHorizontalOverflow() const
-{
- ASSERT(!m_scrollDimensionsDirty);
-
- return scrollWidth() > renderBox()->pixelSnappedClientWidth();
-}
-
-bool RenderLayer::hasVerticalOverflow() const
-{
- ASSERT(!m_scrollDimensionsDirty);
-
- return scrollHeight() > renderBox()->pixelSnappedClientHeight();
+ return m_scrollableArea->scrollHeight();
}
void RenderLayer::updateScrollbarsAfterLayout()
@@ -3097,8 +2949,8 @@ void RenderLayer::updateScrollbarsAfterLayout()
if (box->style()->appearance() == ListboxPart)
return;
- bool hasHorizontalOverflow = this->hasHorizontalOverflow();
- bool hasVerticalOverflow = this->hasVerticalOverflow();
+ bool hasHorizontalOverflow = m_scrollableArea->hasHorizontalOverflow();
+ bool hasVerticalOverflow = m_scrollableArea->hasVerticalOverflow();
// overflow:scroll should just enable/disable.
if (renderer()->style()->overflowX() == OSCROLL)
@@ -3144,14 +2996,14 @@ void RenderLayer::updateScrollbarsAfterLayout()
// Set up the range (and page step/line step).
if (m_hBar) {
int clientWidth = box->pixelSnappedClientWidth();
- m_hBar->setProportion(clientWidth, m_overflowRect.width());
+ m_hBar->setProportion(clientWidth, m_scrollableArea->overflowRect().width());
}
if (m_vBar) {
int clientHeight = box->pixelSnappedClientHeight();
- m_vBar->setProportion(clientHeight, m_overflowRect.height());
+ m_vBar->setProportion(clientHeight, m_scrollableArea->overflowRect().height());
}
- updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow());
+ updateScrollableAreaSet(m_scrollableArea->hasScrollableHorizontalOverflow() || m_scrollableArea->hasScrollableVerticalOverflow());
}
void RenderLayer::updateScrollInfoAfterLayout()
@@ -3160,24 +3012,9 @@ void RenderLayer::updateScrollInfoAfterLayout()
if (!box)
return;
- m_scrollDimensionsDirty = true;
- IntSize originalScrollOffset = adjustedScrollOffset();
-
- computeScrollDimensions();
-
- if (!box->isMarquee()) {
- // Layout may cause us to be at an invalid scroll position. In this case we need
- // to pull our scroll offsets back to the max (or push them up to the min).
- IntSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset());
- if (clampedScrollOffset != adjustedScrollOffset())
- scrollToOffset(clampedScrollOffset);
- }
-
+ m_scrollableArea->updateAfterLayout();
updateScrollbarsAfterLayout();
- if (originalScrollOffset != adjustedScrollOffset())
- scrollableArea()->scrollToOffsetWithoutAnimation(-scrollOrigin() + adjustedScrollOffset());
-
// Composited scrolling may need to be enabled or disabled if the amount of overflow changed.
if (renderer()->view() && compositor()->updateLayerCompositingState(this))
compositor()->setCompositingLayersNeedRebuild();
@@ -5996,8 +5833,7 @@ void RenderLayer::updateScrollbarsAfterStyleChange(const RenderStyle* oldStyle)
m_vBar->setEnabled(true);
}
- if (!m_scrollDimensionsDirty)
- updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow());
+ m_scrollableArea->updateAfterStyleChange(oldStyle);
}
void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle)
@@ -6411,7 +6247,7 @@ void RenderLayer::addLayerHitTestRects(LayerHitTestRects& rects) const
// For scrolling layers, rects are taken to be in the space of the contents.
// We need to include both the entire contents, and also the bounding box
// of the layer in the space of it's parent (eg. for border / scroll bars).
- rect.append(m_overflowRect);
+ rect.append(m_scrollableArea->overflowRect());
rects.set(this, rect);
if (const RenderLayer* parentLayer = parent()) {
LayerHitTestRects::iterator iter = rects.find(parentLayer);
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerScrollableArea.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698