| 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);
|
|
|