Index: Source/platform/scroll/ScrollView.cpp |
diff --git a/Source/platform/scroll/ScrollView.cpp b/Source/platform/scroll/ScrollView.cpp |
index f447873afcd252407dcf492fc30e21f87f8368d5..f213c35ff65a4621acdbcd50b3b05ed596914bab 100644 |
--- a/Source/platform/scroll/ScrollView.cpp |
+++ b/Source/platform/scroll/ScrollView.cpp |
@@ -75,6 +75,8 @@ void ScrollView::setHasHorizontalScrollbar(bool hasBar) |
m_horizontalScrollbar->styleChanged(); |
} else if (!hasBar && m_horizontalScrollbar) { |
willRemoveScrollbar(m_horizontalScrollbar.get(), HorizontalScrollbar); |
+ if (m_horizontalScrollbar->overlapsResizer()) |
Ian Vollick
2014/10/04 01:25:44
It's not obvious to me how we'll know that ScrollV
skobes
2014/10/06 18:18:53
Added a comment. Note that if adjustScrollbarRect
|
+ adjustScrollbarsAvoidingResizerCount(-1); |
removeChild(m_horizontalScrollbar.get()); |
m_horizontalScrollbar = nullptr; |
} |
@@ -89,6 +91,8 @@ void ScrollView::setHasVerticalScrollbar(bool hasBar) |
m_verticalScrollbar->styleChanged(); |
} else if (!hasBar && m_verticalScrollbar) { |
willRemoveScrollbar(m_verticalScrollbar.get(), VerticalScrollbar); |
+ if (m_verticalScrollbar->overlapsResizer()) |
+ adjustScrollbarsAvoidingResizerCount(-1); |
removeChild(m_verticalScrollbar.get()); |
m_verticalScrollbar = nullptr; |
} |
@@ -386,7 +390,7 @@ void ScrollView::updateScrollbarGeometry() |
height() - m_horizontalScrollbar->height(), |
width() - (m_verticalScrollbar ? m_verticalScrollbar->width() : 0), |
m_horizontalScrollbar->height()); |
- m_horizontalScrollbar->setFrameRect(hBarRect); |
+ m_horizontalScrollbar->setFrameRect(adjustScrollbarRectForResizer(hBarRect, m_horizontalScrollbar.get())); |
if (!m_scrollbarsSuppressed && oldRect != m_horizontalScrollbar->frameRect()) |
m_horizontalScrollbar->invalidate(); |
@@ -406,7 +410,7 @@ void ScrollView::updateScrollbarGeometry() |
0, |
m_verticalScrollbar->width(), |
height() - (m_horizontalScrollbar ? m_horizontalScrollbar->height() : 0)); |
- m_verticalScrollbar->setFrameRect(vBarRect); |
+ m_verticalScrollbar->setFrameRect(adjustScrollbarRectForResizer(vBarRect, m_verticalScrollbar.get())); |
if (!m_scrollbarsSuppressed && oldRect != m_verticalScrollbar->frameRect()) |
m_verticalScrollbar->invalidate(); |
@@ -420,6 +424,37 @@ void ScrollView::updateScrollbarGeometry() |
} |
} |
+IntRect ScrollView::adjustScrollbarRectForResizer(const IntRect& rect, Scrollbar* scrollbar) |
+{ |
+ // Get our window resizer rect and see if we overlap. Adjust to avoid the overlap |
+ // if necessary. |
+ IntRect adjustedRect(rect); |
+ bool overlapsResizer = false; |
+ if (!rect.isEmpty() && !windowResizerRect().isEmpty()) { |
+ IntRect resizerRect = convertFromContainingWindow(windowResizerRect()); |
+ if (rect.intersects(resizerRect)) { |
+ if (scrollbar->orientation() == HorizontalScrollbar) { |
+ int overlap = rect.maxX() - resizerRect.x(); |
+ if (overlap > 0 && resizerRect.maxX() >= rect.maxX()) { |
+ adjustedRect.setWidth(rect.width() - overlap); |
+ overlapsResizer = true; |
+ } |
+ } else { |
+ int overlap = rect.maxY() - resizerRect.y(); |
+ if (overlap > 0 && resizerRect.maxY() >= rect.maxY()) { |
+ adjustedRect.setHeight(rect.height() - overlap); |
+ overlapsResizer = true; |
+ } |
+ } |
+ } |
+ } |
+ if (overlapsResizer != scrollbar->overlapsResizer()) { |
+ scrollbar->setOverlapsResizer(overlapsResizer); |
+ adjustScrollbarsAvoidingResizerCount(overlapsResizer ? 1 : -1); |
+ } |
+ return adjustedRect; |
+} |
+ |
bool ScrollView::adjustScrollbarExistence(ComputeScrollbarExistenceOption option) |
{ |
ASSERT(m_inUpdateScrollbars); |