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

Unified Diff: third_party/WebKit/Source/core/frame/FrameView.cpp

Issue 1456953003: Revert of Calculate paint invalidation rect for scrollbars (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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: 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 dd65fe3998e1f0588f41f1628eec4cdcbbd8e2e7..29096603d9b63a9755fa09492108724c80373533 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -382,6 +382,9 @@
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);
@@ -397,7 +400,7 @@
layoutObject->borderTop() + layoutObject->paddingTop());
// FIXME: We should not allow paint invalidation out of paint invalidation state. crbug.com/457415
DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler;
- layoutObject->invalidatePaintRectangleNotInvalidatingDisplayItemClients(LayoutRect(paintInvalidationRect));
+ layoutObject->invalidatePaintRectangle(LayoutRect(paintInvalidationRect));
}
void FrameView::setFrameRect(const IntRect& newRect)
@@ -980,7 +983,7 @@
setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear.
setScrollbarModes(hMode, vMode);
- setScrollbarsSuppressed(false);
+ setScrollbarsSuppressed(false, true);
} else if (hMode != currentHMode || vMode != currentVMode) {
setScrollbarModes(hMode, vMode);
}
@@ -1054,6 +1057,10 @@
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())
@@ -1069,11 +1076,12 @@
rootForPaintInvalidation.invalidateTreeIfNeeded(paintInvalidationState);
- if (!m_frame->settings() || !m_frame->settings()->rootLayerScrolls()) {
- paintInvalidationState.setViewClippingAndScrollOffsetDisabled(true);
- invalidatePaintOfScrollControlsIfNeeded(paintInvalidationState, paintInvalidationState.paintInvalidationContainer());
- paintInvalidationState.setViewClippingAndScrollOffsetDisabled(false);
- }
+ // Invalidate the paint of the frameviews scrollbars if needed
+ if (hasVerticalBarDamage())
+ invalidateRect(verticalBarDamage());
+ if (hasHorizontalBarDamage())
+ invalidateRect(horizontalBarDamage());
+ resetScrollbarDamage();
#if ENABLE(ASSERT)
layoutView()->assertSubtreeClearedPaintInvalidationState();
@@ -1501,7 +1509,8 @@
if (delta != 0) {
m_horizontalScrollbar->setElasticOverscroll(elasticOverscroll.width());
scrollAnimator()->notifyContentAreaScrolled(FloatSize(delta, 0));
- setScrollbarNeedsPaintInvalidation(m_horizontalScrollbar.get());
+ if (!m_scrollbarsSuppressed)
+ m_horizontalScrollbar->invalidate();
}
}
if (m_verticalScrollbar) {
@@ -1509,7 +1518,8 @@
if (delta != 0) {
m_verticalScrollbar->setElasticOverscroll(elasticOverscroll.height());
scrollAnimator()->notifyContentAreaScrolled(FloatSize(0, delta));
- setScrollbarNeedsPaintInvalidation(m_verticalScrollbar.get());
+ if (!m_scrollbarsSuppressed)
+ m_verticalScrollbar->invalidate();
}
}
}
@@ -2073,10 +2083,24 @@
frame().loader().client()->didChangeScrollOffset();
}
-void FrameView::invalidatePaintForTickmarks()
+void FrameView::invalidatePaintForTickmarks() const
{
if (Scrollbar* scrollbar = verticalScrollbar())
- setScrollbarNeedsPaintInvalidation(scrollbar);
+ 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);
}
void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const
@@ -2276,7 +2300,7 @@
if (!m_scrollCorner)
m_scrollCorner = LayoutScrollbarPart::createAnonymous(doc);
m_scrollCorner->setStyle(cornerStyle.release());
- setScrollCornerNeedsPaintInvalidation();
+ invalidateScrollCorner(cornerRect);
} else if (m_scrollCorner) {
m_scrollCorner->destroy();
m_scrollCorner = nullptr;
@@ -3001,7 +3025,7 @@
cache->handleScrollbarUpdate(this);
}
- setScrollCornerNeedsPaintInvalidation();
+ invalidateScrollCorner(scrollCornerRect());
}
void FrameView::setHasVerticalScrollbar(bool hasBar)
@@ -3029,7 +3053,7 @@
cache->handleScrollbarUpdate(this);
}
- setScrollCornerNeedsPaintInvalidation();
+ invalidateScrollCorner(scrollCornerRect());
}
void FrameView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode,
@@ -3196,12 +3220,16 @@
width() - (m_verticalScrollbar ? m_verticalScrollbar->width() : 0),
m_horizontalScrollbar->height());
m_horizontalScrollbar->setFrameRect(adjustScrollbarRectForResizer(hBarRect, m_horizontalScrollbar.get()));
- if (oldRect != m_horizontalScrollbar->frameRect())
- setScrollbarNeedsPaintInvalidation(m_horizontalScrollbar.get());
-
+ if (!m_scrollbarsSuppressed && oldRect != m_horizontalScrollbar->frameRect())
+ m_horizontalScrollbar->invalidate();
+
+ 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) {
@@ -3212,12 +3240,16 @@
m_verticalScrollbar->width(),
height() - (m_horizontalScrollbar ? m_horizontalScrollbar->height() : 0));
m_verticalScrollbar->setFrameRect(adjustScrollbarRectForResizer(vBarRect, m_verticalScrollbar.get()));
- if (oldRect != m_verticalScrollbar->frameRect())
- setScrollbarNeedsPaintInvalidation(m_verticalScrollbar.get());
-
+ if (!m_scrollbarsSuppressed && oldRect != m_verticalScrollbar->frameRect())
+ m_verticalScrollbar->invalidate();
+
+ 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);
}
}
@@ -3320,6 +3352,8 @@
return;
InUpdateScrollbarsScope inUpdateScrollbarsScope(this);
+ IntSize oldVisibleSize = visibleContentSize();
+
bool scrollbarExistenceChanged = false;
if (needsScrollbarReconstruction()) {
@@ -3343,6 +3377,17 @@
positionScrollbarLayers();
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);
}
@@ -3524,6 +3569,24 @@
}
}
+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);
@@ -3641,6 +3704,13 @@
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
@@ -3977,10 +4047,4 @@
return m_hiddenForThrottling && m_crossOriginForThrottling;
}
-LayoutBox& FrameView::boxForScrollControlPaintInvalidation() const
-{
- ASSERT(layoutView());
- return *layoutView();
-}
-
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/frame/FrameView.h ('k') | third_party/WebKit/Source/core/frame/RootFrameViewport.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698