| Index: Source/platform/scroll/ScrollView.cpp
|
| diff --git a/Source/platform/scroll/ScrollView.cpp b/Source/platform/scroll/ScrollView.cpp
|
| index e362c659d1378b7ed09bcdb9103402f5a08ef821..653857b12a8019fa5ca9e2360787d6742376335c 100644
|
| --- a/Source/platform/scroll/ScrollView.cpp
|
| +++ b/Source/platform/scroll/ScrollView.cpp
|
| @@ -75,6 +75,10 @@ void ScrollView::setHasHorizontalScrollbar(bool hasBar)
|
| m_horizontalScrollbar->styleChanged();
|
| } else if (!hasBar && m_horizontalScrollbar) {
|
| willRemoveScrollbar(m_horizontalScrollbar.get(), HorizontalScrollbar);
|
| + // If the scrollbar has been marked as overlapping the window resizer,
|
| + // then its removal should reduce the count.
|
| + if (m_horizontalScrollbar->overlapsResizer())
|
| + adjustScrollbarsAvoidingResizerCount(-1);
|
| removeChild(m_horizontalScrollbar.get());
|
| m_horizontalScrollbar = nullptr;
|
| }
|
| @@ -89,6 +93,10 @@ void ScrollView::setHasVerticalScrollbar(bool hasBar)
|
| m_verticalScrollbar->styleChanged();
|
| } else if (!hasBar && m_verticalScrollbar) {
|
| willRemoveScrollbar(m_verticalScrollbar.get(), VerticalScrollbar);
|
| + // If the scrollbar has been marked as overlapping the window resizer,
|
| + // then its removal should reduce the count.
|
| + if (m_verticalScrollbar->overlapsResizer())
|
| + adjustScrollbarsAvoidingResizerCount(-1);
|
| removeChild(m_verticalScrollbar.get());
|
| m_verticalScrollbar = nullptr;
|
| }
|
| @@ -403,7 +411,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();
|
|
|
| @@ -423,7 +431,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();
|
|
|
| @@ -437,6 +445,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);
|
|
|