Index: third_party/WebKit/Source/core/frame/FrameView.cpp |
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp |
index 29096603d9b63a9755fa09492108724c80373533..dd65fe3998e1f0588f41f1628eec4cdcbbd8e2e7 100644 |
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp |
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp |
@@ -382,9 +382,6 @@ bool FrameView::didFirstLayout() const |
void FrameView::invalidateRect(const IntRect& rect) |
{ |
- // For querying PaintLayer::compositingState() when invalidating scrollbars. |
- // FIXME: do all scrollbar invalidations after layout of all frames is complete. It's currently not recursively true. |
- DisableCompositingQueryAsserts disabler; |
if (!parent()) { |
if (HostWindow* window = hostWindow()) |
window->invalidateRect(rect); |
@@ -400,7 +397,7 @@ void FrameView::invalidateRect(const IntRect& rect) |
layoutObject->borderTop() + layoutObject->paddingTop()); |
// FIXME: We should not allow paint invalidation out of paint invalidation state. crbug.com/457415 |
DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler; |
- layoutObject->invalidatePaintRectangle(LayoutRect(paintInvalidationRect)); |
+ layoutObject->invalidatePaintRectangleNotInvalidatingDisplayItemClients(LayoutRect(paintInvalidationRect)); |
} |
void FrameView::setFrameRect(const IntRect& newRect) |
@@ -983,7 +980,7 @@ void FrameView::layout() |
setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear. |
setScrollbarModes(hMode, vMode); |
- setScrollbarsSuppressed(false, true); |
+ setScrollbarsSuppressed(false); |
} else if (hMode != currentHMode || vMode != currentVMode) { |
setScrollbarModes(hMode, vMode); |
} |
@@ -1057,10 +1054,6 @@ void FrameView::layout() |
frame().document()->layoutUpdated(); |
} |
-// The plan is to move to compositor-queried paint invalidation, in which case this |
-// method would setNeedsRedraw on the GraphicsLayers with invalidations and |
-// let the compositor pick which to actually draw. |
-// See http://crbug.com/306706 |
void FrameView::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidationState) |
{ |
if (shouldThrottleRendering()) |
@@ -1076,12 +1069,11 @@ void FrameView::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidation |
rootForPaintInvalidation.invalidateTreeIfNeeded(paintInvalidationState); |
- // Invalidate the paint of the frameviews scrollbars if needed |
- if (hasVerticalBarDamage()) |
- invalidateRect(verticalBarDamage()); |
- if (hasHorizontalBarDamage()) |
- invalidateRect(horizontalBarDamage()); |
- resetScrollbarDamage(); |
+ if (!m_frame->settings() || !m_frame->settings()->rootLayerScrolls()) { |
+ paintInvalidationState.setViewClippingAndScrollOffsetDisabled(true); |
+ invalidatePaintOfScrollControlsIfNeeded(paintInvalidationState, paintInvalidationState.paintInvalidationContainer()); |
+ paintInvalidationState.setViewClippingAndScrollOffsetDisabled(false); |
+ } |
#if ENABLE(ASSERT) |
layoutView()->assertSubtreeClearedPaintInvalidationState(); |
@@ -1509,8 +1501,7 @@ void FrameView::didUpdateElasticOverscroll() |
if (delta != 0) { |
m_horizontalScrollbar->setElasticOverscroll(elasticOverscroll.width()); |
scrollAnimator()->notifyContentAreaScrolled(FloatSize(delta, 0)); |
- if (!m_scrollbarsSuppressed) |
- m_horizontalScrollbar->invalidate(); |
+ setScrollbarNeedsPaintInvalidation(m_horizontalScrollbar.get()); |
} |
} |
if (m_verticalScrollbar) { |
@@ -1518,8 +1509,7 @@ void FrameView::didUpdateElasticOverscroll() |
if (delta != 0) { |
m_verticalScrollbar->setElasticOverscroll(elasticOverscroll.height()); |
scrollAnimator()->notifyContentAreaScrolled(FloatSize(0, delta)); |
- if (!m_scrollbarsSuppressed) |
- m_verticalScrollbar->invalidate(); |
+ setScrollbarNeedsPaintInvalidation(m_verticalScrollbar.get()); |
} |
} |
} |
@@ -2083,24 +2073,10 @@ void FrameView::scrollTo(const DoublePoint& newPosition) |
frame().loader().client()->didChangeScrollOffset(); |
} |
-void FrameView::invalidatePaintForTickmarks() const |
+void FrameView::invalidatePaintForTickmarks() |
{ |
if (Scrollbar* scrollbar = verticalScrollbar()) |
- scrollbar->invalidate(); |
-} |
- |
-void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect) |
-{ |
- // Add in our offset within the FrameView. |
- IntRect dirtyRect = rect; |
- dirtyRect.moveBy(scrollbar->location()); |
- |
- layoutView()->invalidateDisplayItemClient(*scrollbar); |
- |
- if (isInPerformLayout()) |
- addScrollbarDamage(scrollbar, rect); |
- else |
- invalidateRect(dirtyRect); |
+ setScrollbarNeedsPaintInvalidation(scrollbar); |
} |
void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const |
@@ -2300,7 +2276,7 @@ void FrameView::updateScrollCorner() |
if (!m_scrollCorner) |
m_scrollCorner = LayoutScrollbarPart::createAnonymous(doc); |
m_scrollCorner->setStyle(cornerStyle.release()); |
- invalidateScrollCorner(cornerRect); |
+ setScrollCornerNeedsPaintInvalidation(); |
} else if (m_scrollCorner) { |
m_scrollCorner->destroy(); |
m_scrollCorner = nullptr; |
@@ -3025,7 +3001,7 @@ void FrameView::setHasHorizontalScrollbar(bool hasBar) |
cache->handleScrollbarUpdate(this); |
} |
- invalidateScrollCorner(scrollCornerRect()); |
+ setScrollCornerNeedsPaintInvalidation(); |
} |
void FrameView::setHasVerticalScrollbar(bool hasBar) |
@@ -3053,7 +3029,7 @@ void FrameView::setHasVerticalScrollbar(bool hasBar) |
cache->handleScrollbarUpdate(this); |
} |
- invalidateScrollCorner(scrollCornerRect()); |
+ setScrollCornerNeedsPaintInvalidation(); |
} |
void FrameView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode, |
@@ -3220,16 +3196,12 @@ void FrameView::updateScrollbarGeometry() |
width() - (m_verticalScrollbar ? m_verticalScrollbar->width() : 0), |
m_horizontalScrollbar->height()); |
m_horizontalScrollbar->setFrameRect(adjustScrollbarRectForResizer(hBarRect, m_horizontalScrollbar.get())); |
- if (!m_scrollbarsSuppressed && oldRect != m_horizontalScrollbar->frameRect()) |
- m_horizontalScrollbar->invalidate(); |
+ if (oldRect != m_horizontalScrollbar->frameRect()) |
+ setScrollbarNeedsPaintInvalidation(m_horizontalScrollbar.get()); |
- if (m_scrollbarsSuppressed) |
- m_horizontalScrollbar->setSuppressInvalidation(true); |
m_horizontalScrollbar->setEnabled(contentsWidth() > clientWidth); |
m_horizontalScrollbar->setProportion(clientWidth, contentsWidth()); |
m_horizontalScrollbar->offsetDidChange(); |
- if (m_scrollbarsSuppressed) |
- m_horizontalScrollbar->setSuppressInvalidation(false); |
} |
if (m_verticalScrollbar) { |
@@ -3240,16 +3212,12 @@ void FrameView::updateScrollbarGeometry() |
m_verticalScrollbar->width(), |
height() - (m_horizontalScrollbar ? m_horizontalScrollbar->height() : 0)); |
m_verticalScrollbar->setFrameRect(adjustScrollbarRectForResizer(vBarRect, m_verticalScrollbar.get())); |
- if (!m_scrollbarsSuppressed && oldRect != m_verticalScrollbar->frameRect()) |
- m_verticalScrollbar->invalidate(); |
+ if (oldRect != m_verticalScrollbar->frameRect()) |
+ setScrollbarNeedsPaintInvalidation(m_verticalScrollbar.get()); |
- if (m_scrollbarsSuppressed) |
- m_verticalScrollbar->setSuppressInvalidation(true); |
m_verticalScrollbar->setEnabled(contentsHeight() > clientHeight); |
m_verticalScrollbar->setProportion(clientHeight, contentsHeight()); |
m_verticalScrollbar->offsetDidChange(); |
- if (m_scrollbarsSuppressed) |
- m_verticalScrollbar->setSuppressInvalidation(false); |
} |
} |
@@ -3352,8 +3320,6 @@ void FrameView::updateScrollbars(const DoubleSize& desiredOffset) |
return; |
InUpdateScrollbarsScope inUpdateScrollbarsScope(this); |
- IntSize oldVisibleSize = visibleContentSize(); |
- |
bool scrollbarExistenceChanged = false; |
if (needsScrollbarReconstruction()) { |
@@ -3378,17 +3344,6 @@ void FrameView::updateScrollbars(const DoubleSize& desiredOffset) |
updateScrollCorner(); |
} |
- // FIXME: We don't need to do this if we are composited. |
- IntSize newVisibleSize = visibleContentSize(); |
- if (newVisibleSize.width() > oldVisibleSize.width()) { |
- if (shouldPlaceVerticalScrollbarOnLeft()) |
- invalidateRect(IntRect(0, 0, newVisibleSize.width() - oldVisibleSize.width(), newVisibleSize.height())); |
- else |
- invalidateRect(IntRect(oldVisibleSize.width(), 0, newVisibleSize.width() - oldVisibleSize.width(), newVisibleSize.height())); |
- } |
- if (newVisibleSize.height() > oldVisibleSize.height()) |
- invalidateRect(IntRect(0, oldVisibleSize.height(), newVisibleSize.width(), newVisibleSize.height() - oldVisibleSize.height())); |
- |
setScrollOffsetFromUpdateScrollbars(desiredOffset); |
} |
@@ -3569,24 +3524,6 @@ void FrameView::adjustScrollbarsAvoidingResizerCount(int overlapDelta) |
} |
} |
-void FrameView::setScrollbarsSuppressed(bool suppressed, bool repaintOnUnsuppress) |
-{ |
- if (suppressed == m_scrollbarsSuppressed) |
- return; |
- |
- m_scrollbarsSuppressed = suppressed; |
- |
- if (repaintOnUnsuppress && !suppressed) { |
- if (m_horizontalScrollbar) |
- m_horizontalScrollbar->invalidate(); |
- if (m_verticalScrollbar) |
- m_verticalScrollbar->invalidate(); |
- |
- // Invalidate the scroll corner too on unsuppress. |
- invalidateScrollCorner(scrollCornerRect()); |
- } |
-} |
- |
Scrollbar* FrameView::scrollbarAtRootFramePoint(const IntPoint& pointInRootFrame) |
{ |
IntPoint pointInFrame = convertFromContainingWindow(pointInRootFrame); |
@@ -3706,13 +3643,6 @@ bool FrameView::isScrollCornerVisible() const |
return !scrollCornerRect().isEmpty(); |
} |
-void FrameView::invalidateScrollCornerRect(const IntRect& rect) |
-{ |
- invalidateRect(rect); |
- if (m_scrollCorner) |
- layoutView()->invalidateDisplayItemClientForNonCompositingDescendantsOf(*m_scrollCorner); |
-} |
- |
ScrollBehavior FrameView::scrollBehaviorStyle() const |
{ |
Element* scrollElement = m_frame->document()->scrollingElement(); |
@@ -4047,4 +3977,10 @@ bool FrameView::canThrottleRendering() const |
return m_hiddenForThrottling && m_crossOriginForThrottling; |
} |
+LayoutBox& FrameView::boxForScrollControlPaintInvalidation() const |
+{ |
+ ASSERT(layoutView()); |
+ return *layoutView(); |
+} |
+ |
} // namespace blink |