Index: Source/platform/scroll/ScrollableArea.cpp |
diff --git a/Source/platform/scroll/ScrollableArea.cpp b/Source/platform/scroll/ScrollableArea.cpp |
index aa12fe367fb90e3c05540f9a77bfcb9d33823948..9ebb13274c38d958afaa8914af56817d09611a08 100644 |
--- a/Source/platform/scroll/ScrollableArea.cpp |
+++ b/Source/platform/scroll/ScrollableArea.cpp |
@@ -34,13 +34,14 @@ |
#include "platform/HostWindow.h" |
#include "platform/Logging.h" |
+#include "platform/TraceEvent.h" |
#include "platform/graphics/GraphicsLayer.h" |
#include "platform/geometry/FloatPoint.h" |
#include "platform/scroll/ProgrammaticScrollAnimator.h" |
+#include "platform/scroll/ScrollbarStateTransitionAnimator.h" |
#include "platform/scroll/ScrollbarTheme.h" |
#include "wtf/PassOwnPtr.h" |
-#include "platform/TraceEvent.h" |
static const int kPixelsPerLineStep = 40; |
static const float kMinFractionToStepWhenPaging = 0.875f; |
@@ -109,6 +110,39 @@ ProgrammaticScrollAnimator* ScrollableArea::programmaticScrollAnimator() const |
return m_animators->programmaticScrollAnimator.get(); |
} |
+ScrollbarStateTransitionAnimator* ScrollableArea::scrollbarStateTransitionAnimator() const |
+{ |
+ if (!m_animators) |
+ m_animators = adoptPtr(new ScrollableAreaAnimators); |
+ |
+ if (!m_animators->scrollbarStateTransitionAnimator) |
+ m_animators->scrollbarStateTransitionAnimator = ScrollbarStateTransitionAnimator::create(const_cast<ScrollableArea*>(this)); |
+ |
+ return m_animators->scrollbarStateTransitionAnimator.get(); |
+} |
+ |
+bool ScrollableArea::isDuringStateTransitionAnimation() const |
+{ |
+ return hasOverlayScrollbars() && existingScrollbarStateTransitionAnimator() && existingScrollbarStateTransitionAnimator()->isDuringStateTransitionAnimation(); |
+} |
+ |
+void ScrollableArea::stateTransitionInProgress() |
+{ |
+ if (isDuringStateTransitionAnimation()) { |
+ double progress = existingScrollbarStateTransitionAnimator()->stateTransitionProgress(); |
+ blink::WebThemeEngine::State startState = existingScrollbarStateTransitionAnimator()->stateTransitionStartState(); |
+ blink::WebThemeEngine::State endState = existingScrollbarStateTransitionAnimator()->stateTransitionEndState(); |
+ |
+ if (Scrollbar* verticalScrollbar = this->verticalScrollbar()) { |
+ verticalScrollbar->updateStateTransitionData(startState, endState, progress); |
+ } |
+ |
+ if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { |
+ horizontalScrollbar->updateStateTransitionData(startState, endState, progress); |
+ } |
+ } |
+} |
+ |
void ScrollableArea::setScrollOrigin(const IntPoint& origin) |
{ |
if (m_scrollOrigin != origin) { |
@@ -301,11 +335,15 @@ void ScrollableArea::mouseMovedInContentArea() const |
void ScrollableArea::mouseEnteredScrollbar(Scrollbar* scrollbar) const |
{ |
scrollAnimator()->mouseEnteredScrollbar(scrollbar); |
+ if (ScrollbarStateTransitionAnimator* animator = scrollbarStateTransitionAnimator()) |
+ animator->mouseEnteredScrollbar(scrollbar); |
} |
void ScrollableArea::mouseExitedScrollbar(Scrollbar* scrollbar) const |
{ |
scrollAnimator()->mouseExitedScrollbar(scrollbar); |
+ if (ScrollbarStateTransitionAnimator* animator = scrollbarStateTransitionAnimator()) |
+ animator->mouseExitedScrollbar(scrollbar); |
} |
void ScrollableArea::contentAreaDidShow() const |
@@ -442,6 +480,14 @@ void ScrollableArea::cancelProgrammaticScrollAnimation() |
programmaticScrollAnimator->cancelAnimation(); |
} |
+void ScrollableArea::serviceScrollbarAnimations() |
+{ |
+ if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) |
+ scrollAnimator->serviceScrollAnimations(); |
+ if (ScrollbarStateTransitionAnimator* animator = existingScrollbarStateTransitionAnimator()) |
+ animator->serviceAnimations(); |
+} |
+ |
IntRect ScrollableArea::visibleContentRect(IncludeScrollbarsInRect scrollbarInclusion) const |
{ |
int verticalScrollbarWidth = 0; |