Scrollbar and scroll corner composited layers positioned incorrectly
https://bugs.webkit.org/show_bug.cgi?id=108255
Patch by James Robinson <jamesr@chromium.org> on 2013-01-29
Reviewed by Simon Fraser.
ScrollView::updateScrollbars() needs to update the overflow controls composited layers if scrollbars are added
or removed. It was doing this by recording on entry to the function if it had horizontal or vertical scrollbars
and then comparing that to m_horizontal/verticalScrollbar on exit. Unfortunately updateScrollbars is recursive
and exits without running the postamble code when nested on the callstack. As a result, scrollbars may be
added or removed several times during the recursion, possibly leaving the overflow control layers in an
inconsistent state, while ending up with the same set of scrollbars.
This changes the "has anything changed" logic to only compare local state (hasXXXScrollbar vs
newHasXXXScrollbar) so changes in recursive calls are not considered.
* platform/ScrollView.cpp:
(WebCore::ScrollView::updateScrollbars):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@141226 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/platform/ScrollView.cpp b/Source/WebCore/platform/ScrollView.cpp
index 0472791..de5a563 100644
--- a/Source/WebCore/platform/ScrollView.cpp
+++ b/Source/WebCore/platform/ScrollView.cpp
@@ -603,7 +603,7 @@
m_verticalScrollbar->setSuppressInvalidation(false);
}
- if (hasHorizontalScrollbar != (m_horizontalScrollbar != 0) || hasVerticalScrollbar != (m_verticalScrollbar != 0)) {
+ if (hasHorizontalScrollbar != newHasHorizontalScrollbar || hasVerticalScrollbar != newHasVerticalScrollbar) {
// FIXME: Is frameRectsChanged really necessary here? Have any frame rects changed?
frameRectsChanged();
positionScrollbarLayers();