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

Unified Diff: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.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/paint/PaintLayerScrollableArea.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index 282ec669367b4182c74c08c441d105b5eceb4465..b7ea489f47a8bfc36198b4f6a6227cd1f5bbd721 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -199,9 +199,61 @@
return layer()->hasCompositedLayerMapping() ? layer()->compositedLayerMapping()->layerForScrollCorner() : 0;
}
-void PaintLayerScrollableArea::scrollControlWasSetNeedsPaintInvalidation()
-{
- box().setMayNeedPaintInvalidation();
+void PaintLayerScrollableArea::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
+{
+ // See crbug.com/343132.
+ DisableCompositingQueryAsserts disabler;
+
+ ASSERT(scrollbar == horizontalScrollbar() || scrollbar == verticalScrollbar());
+ ASSERT(scrollbar == horizontalScrollbar() ? !layerForHorizontalScrollbar() : !layerForVerticalScrollbar());
+
+ IntRect scrollRect = rect;
+ // If we are not yet inserted into the tree, there is no need to issue paint invaldiations.
+ if (!box().isLayoutView() && !box().parent())
+ return;
+
+ if (scrollbar == verticalScrollbar())
+ scrollRect.move(verticalScrollbarStart(0, box().size().width()), box().borderTop());
+ else
+ scrollRect.move(horizontalScrollbarStart(0), box().size().height() - box().borderBottom() - scrollbar->height());
+
+ if (scrollRect.isEmpty())
+ return;
+
+ LayoutRect paintInvalidationRect = LayoutRect(scrollRect);
+ box().flipForWritingMode(paintInvalidationRect);
+
+ IntRect intRect = pixelSnappedIntRect(paintInvalidationRect);
+
+ if (box().frameView()->isInPerformLayout()) {
+ addScrollbarDamage(scrollbar, intRect);
+ } else {
+ // FIXME: We should not allow paint invalidation out of paint invalidation state. crbug.com/457415
+ DisablePaintInvalidationStateAsserts disabler;
+ // We have invalidated the displayItemClient of the scrollbar, but for now we still need to
+ // invalidate the rectangles to trigger repaints.
+ box().invalidatePaintRectangleNotInvalidatingDisplayItemClients(LayoutRect(intRect));
+ box().invalidateDisplayItemClient(*scrollbar);
+ }
+}
+
+void PaintLayerScrollableArea::invalidateScrollCornerRect(const IntRect& rect)
+{
+ ASSERT(!layerForScrollCorner());
+
+ if (m_scrollCorner) {
+ // FIXME: We should not allow paint invalidation out of paint invalidation state. crbug.com/457415
+ DisablePaintInvalidationStateAsserts disabler;
+ DisableCompositingQueryAsserts compositingDisabler;
+ m_scrollCorner->invalidatePaintRectangle(LayoutRect(rect));
+ box().invalidateDisplayItemClientForNonCompositingDescendantsOf(*m_scrollCorner);
+ } else {
+ box().invalidateDisplayItemClient(box());
+ }
+ if (m_resizer) {
+ m_resizer->invalidatePaintRectangle(LayoutRect(rect));
+ box().invalidateDisplayItemClientForNonCompositingDescendantsOf(*m_resizer);
+ }
}
bool PaintLayerScrollableArea::shouldUseIntegerScrollOffset() const
@@ -984,8 +1036,8 @@
if (hasScrollbar == hasHorizontalScrollbar())
return;
- setScrollbarNeedsPaintInvalidation(horizontalScrollbar());
-
+ if (!hasScrollbar && !layerForHorizontalScrollbar())
+ horizontalScrollbar()->invalidate();
m_scrollbarManager.setHasHorizontalScrollbar(hasScrollbar);
@@ -995,7 +1047,10 @@
if (hasVerticalScrollbar())
verticalScrollbar()->styleChanged();
- setScrollCornerNeedsPaintInvalidation();
+ // These are valid because we want to invalidate display item clients on the current backing.
+ DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler;
+ DisableCompositingQueryAsserts compositingAssertDisabler;
+ invalidateScrollCorner(scrollCornerRect());
// Force an update since we know the scrollbars have changed things.
if (box().document().hasAnnotatedRegions())
@@ -1007,7 +1062,8 @@
if (hasScrollbar == hasVerticalScrollbar())
return;
- setScrollbarNeedsPaintInvalidation(verticalScrollbar());
+ if (!hasScrollbar && !layerForVerticalScrollbar())
+ verticalScrollbar()->invalidate();
m_scrollbarManager.setHasVerticalScrollbar(hasScrollbar);
@@ -1017,7 +1073,10 @@
if (hasVerticalScrollbar())
verticalScrollbar()->styleChanged();
- setScrollCornerNeedsPaintInvalidation();
+ // These are valid because we want to invalidate display item clients on the current backing.
+ DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler;
+ DisableCompositingQueryAsserts compositingAssertDisabler;
+ invalidateScrollCorner(scrollCornerRect());
// Force an update since we know the scrollbars have changed things.
if (box().document().hasAnnotatedRegions())
@@ -1439,9 +1498,9 @@
m_canDetachScrollbars = detach ? 1 : 0;
if (!detach) {
if (m_hBar && !m_hBarIsAttached)
- destroyScrollbar(HorizontalScrollbar);
+ destroyScrollbar(HorizontalScrollbar, true);
if (m_vBar && !m_vBarIsAttached)
- destroyScrollbar(VerticalScrollbar);
+ destroyScrollbar(VerticalScrollbar, true);
}
}
@@ -1497,15 +1556,17 @@
return widget.release();
}
-void PaintLayerScrollableArea::ScrollbarManager::destroyScrollbar(ScrollbarOrientation orientation)
+void PaintLayerScrollableArea::ScrollbarManager::destroyScrollbar(ScrollbarOrientation orientation, bool invalidate)
{
RefPtrWillBeMember<Scrollbar>& scrollbar = orientation == HorizontalScrollbar ? m_hBar : m_vBar;
ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached: !m_vBarIsAttached);
if (!scrollbar)
return;
- m_scrollableArea->setScrollbarNeedsPaintInvalidation(scrollbar.get());
-
+ if (invalidate) {
+ m_scrollableArea->box().invalidateDisplayItemClient(*scrollbar);
+ scrollbar->invalidate();
+ }
if (!scrollbar->isCustomScrollbar())
m_scrollableArea->willRemoveScrollbar(scrollbar.get(), orientation);

Powered by Google App Engine
This is Rietveld 408576698