Index: third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
index 85016be74b5a15c2f326a65e4254a439ceac12f6..f23801b9243c29badaf4540425180ae39d106b05 100644 |
--- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
+++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
@@ -51,6 +51,7 @@ |
struct SameSizeAsScrollableArea { |
virtual ~SameSizeAsScrollableArea(); |
+ IntRect scrollbarDamage[2]; |
#if ENABLE(ASSERT) && ENABLE(OILPAN) |
VerifyEagerFinalization verifyEager; |
#endif |
@@ -81,9 +82,6 @@ |
: m_inLiveResize(false) |
, m_scrollbarOverlayStyle(ScrollbarOverlayStyleDefault) |
, m_scrollOriginChanged(false) |
- , m_horizontalScrollbarNeedsPaintInvalidation(false) |
- , m_verticalScrollbarNeedsPaintInvalidation(false) |
- , m_scrollCornerNeedsPaintInvalidation(false) |
{ |
} |
@@ -248,13 +246,22 @@ |
// Tell the scrollbars to update their thumb postions. |
if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { |
horizontalScrollbar->offsetDidChange(); |
- if (horizontalScrollbar->isOverlayScrollbar() && !hasLayerForHorizontalScrollbar()) |
- setScrollbarNeedsPaintInvalidation(horizontalScrollbar); |
+ if (horizontalScrollbar->isOverlayScrollbar() && !hasLayerForHorizontalScrollbar()) { |
+ if (!verticalScrollbar) |
+ horizontalScrollbar->invalidate(); |
+ else { |
+ // If there is both a horizontalScrollbar and a verticalScrollbar, |
+ // then we must also invalidate the corner between them. |
+ IntRect boundsAndCorner = horizontalScrollbar->boundsRect(); |
+ boundsAndCorner.setWidth(boundsAndCorner.width() + verticalScrollbar->width()); |
+ horizontalScrollbar->invalidateRect(boundsAndCorner); |
+ } |
+ } |
} |
if (verticalScrollbar) { |
verticalScrollbar->offsetDidChange(); |
if (verticalScrollbar->isOverlayScrollbar() && !hasLayerForVerticalScrollbar()) |
- setScrollbarNeedsPaintInvalidation(verticalScrollbar); |
+ verticalScrollbar->invalidate(); |
} |
if (scrollPositionDouble() != oldPosition) { |
@@ -395,16 +402,16 @@ |
if (Scrollbar* scrollbar = horizontalScrollbar()) { |
ScrollbarTheme::theme()->updateScrollbarOverlayStyle(scrollbar); |
- setScrollbarNeedsPaintInvalidation(scrollbar); |
+ scrollbar->invalidate(); |
} |
if (Scrollbar* scrollbar = verticalScrollbar()) { |
ScrollbarTheme::theme()->updateScrollbarOverlayStyle(scrollbar); |
- setScrollbarNeedsPaintInvalidation(scrollbar); |
- } |
-} |
- |
-void ScrollableArea::setScrollbarNeedsPaintInvalidation(Scrollbar* scrollbar) |
+ scrollbar->invalidate(); |
+ } |
+} |
+ |
+void ScrollableArea::invalidateScrollbar(Scrollbar* scrollbar, const IntRect& rect) |
{ |
if (scrollbar == horizontalScrollbar()) { |
if (GraphicsLayer* graphicsLayer = layerForHorizontalScrollbar()) { |
@@ -412,8 +419,7 @@ |
graphicsLayer->setContentsNeedsDisplay(); |
return; |
} |
- m_horizontalScrollbarNeedsPaintInvalidation = true; |
- scrollControlWasSetNeedsPaintInvalidation(); |
+ invalidateScrollbarRect(scrollbar, rect); |
return; |
} |
if (scrollbar == verticalScrollbar()) { |
@@ -422,22 +428,20 @@ |
graphicsLayer->setContentsNeedsDisplay(); |
return; |
} |
- m_verticalScrollbarNeedsPaintInvalidation = true; |
- scrollControlWasSetNeedsPaintInvalidation(); |
+ invalidateScrollbarRect(scrollbar, rect); |
return; |
} |
// Otherwise the scrollbar is just created and has not been set as either |
// horizontalScrollbar() or verticalScrollbar(). |
} |
-void ScrollableArea::setScrollCornerNeedsPaintInvalidation() |
+void ScrollableArea::invalidateScrollCorner(const IntRect& rect) |
{ |
if (GraphicsLayer* graphicsLayer = layerForScrollCorner()) { |
graphicsLayer->setNeedsDisplay(); |
return; |
} |
- m_scrollCornerNeedsPaintInvalidation = true; |
- scrollControlWasSetNeedsPaintInvalidation(); |
+ invalidateScrollCornerRect(rect); |
} |
bool ScrollableArea::hasLayerForHorizontalScrollbar() const |