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