| Index: Source/platform/scroll/ScrollableArea.cpp
|
| diff --git a/Source/platform/scroll/ScrollableArea.cpp b/Source/platform/scroll/ScrollableArea.cpp
|
| index b6dbd83c7e23446ba60408c856327903527c829c..dcc8c489d4b79baf65090a82ab35abc8053ee6eb 100644
|
| --- a/Source/platform/scroll/ScrollableArea.cpp
|
| +++ b/Source/platform/scroll/ScrollableArea.cpp
|
| @@ -34,6 +34,7 @@
|
|
|
| #include "platform/graphics/GraphicsLayer.h"
|
| #include "platform/geometry/FloatPoint.h"
|
| +#include "platform/scroll/ProgrammaticScrollAnimator.h"
|
| #include "platform/scroll/ScrollbarTheme.h"
|
| #include "wtf/PassOwnPtr.h"
|
|
|
| @@ -48,7 +49,7 @@ struct SameSizeAsScrollableArea {
|
| virtual ~SameSizeAsScrollableArea();
|
| unsigned damageBits : 2;
|
| IntRect scrollbarDamage[2];
|
| - void* pointer;
|
| + void* pointer[2];
|
| unsigned bitfields : 16;
|
| IntPoint origin;
|
| };
|
| @@ -95,6 +96,14 @@ ScrollAnimator* ScrollableArea::scrollAnimator() const
|
| return m_scrollAnimator.get();
|
| }
|
|
|
| +ProgrammaticScrollAnimator* ScrollableArea::programmaticScrollAnimator() const
|
| +{
|
| + if (!m_programmaticScrollAnimator)
|
| + m_programmaticScrollAnimator = ProgrammaticScrollAnimator::create(const_cast<ScrollableArea*>(this));
|
| +
|
| + return m_programmaticScrollAnimator.get();
|
| +}
|
| +
|
| void ScrollableArea::setScrollOrigin(const IntPoint& origin)
|
| {
|
| if (m_scrollOrigin != origin) {
|
| @@ -120,6 +129,8 @@ bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
|
| if (!userInputScrollable(orientation))
|
| return false;
|
|
|
| + cancelProgrammaticScrollAnimation();
|
| +
|
| float step = 0;
|
| switch (granularity) {
|
| case ScrollByLine:
|
| @@ -145,6 +156,7 @@ bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
|
|
|
| void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset)
|
| {
|
| + cancelProgrammaticScrollAnimation();
|
| scrollAnimator()->scrollToOffsetWithoutAnimation(offset);
|
| }
|
|
|
| @@ -156,6 +168,14 @@ void ScrollableArea::scrollToOffsetWithoutAnimation(ScrollbarOrientation orienta
|
| scrollToOffsetWithoutAnimation(FloatPoint(scrollAnimator()->currentPosition().x(), offset));
|
| }
|
|
|
| +void ScrollableArea::programmaticallyScrollSmoothlyToOffset(const FloatPoint& offset)
|
| +{
|
| + if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
|
| + scrollAnimator->cancelAnimations();
|
| + cancelProgrammaticScrollAnimation();
|
| + programmaticScrollAnimator()->animateToOffset(offset);
|
| +}
|
| +
|
| void ScrollableArea::notifyScrollPositionChanged(const IntPoint& position)
|
| {
|
| scrollPositionChanged(position);
|
| @@ -217,6 +237,7 @@ bool ScrollableArea::handleWheelEvent(const PlatformWheelEvent& wheelEvent)
|
| if (wheelEvent.modifiers() & PlatformEvent::CtrlKey)
|
| return false;
|
|
|
| + cancelProgrammaticScrollAnimation();
|
| return scrollAnimator()->handleWheelEvent(wheelEvent);
|
| }
|
|
|
| @@ -392,10 +413,45 @@ bool ScrollableArea::hasLayerForScrollCorner() const
|
| return layerForScrollCorner();
|
| }
|
|
|
| -void ScrollableArea::serviceScrollAnimations()
|
| +void ScrollableArea::serviceScrollAnimations(double monotonicTime)
|
| {
|
| if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
|
| scrollAnimator->serviceScrollAnimations();
|
| + if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgrammaticScrollAnimator())
|
| + programmaticScrollAnimator->tickAnimation(monotonicTime);
|
| +}
|
| +
|
| +void ScrollableArea::notifyAnimationStarted(double monotonicTime)
|
| +{
|
| + programmaticScrollAnimator()->notifyAnimationStarted(monotonicTime);
|
| +}
|
| +
|
| +void ScrollableArea::notifyAnimationFinished(double monotonicTime)
|
| +{
|
| + programmaticScrollAnimator()->notifyAnimationFinished(monotonicTime);
|
| +}
|
| +
|
| +void ScrollableArea::layerForScrollingDidChange()
|
| +{
|
| + if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgrammaticScrollAnimator())
|
| + programmaticScrollAnimator->canUseCompositedScrollAnimationsDidChange();
|
| +}
|
| +
|
| +void ScrollableArea::requiresMainThreadScrollingDidChange()
|
| +{
|
| + if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgrammaticScrollAnimator())
|
| + programmaticScrollAnimator->canUseCompositedScrollAnimationsDidChange();
|
| +}
|
| +
|
| +bool ScrollableArea::canUseCompositedScrollAnimations() const
|
| +{
|
| + return layerForScrolling() && !layerForScrolling()->platformLayer()->shouldScrollOnMainThread();
|
| +}
|
| +
|
| +void ScrollableArea::cancelProgrammaticScrollAnimation()
|
| +{
|
| + if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgrammaticScrollAnimator())
|
| + programmaticScrollAnimator->cancelAnimation();
|
| }
|
|
|
| IntRect ScrollableArea::visibleContentRect(IncludeScrollbarsInRect scrollbarInclusion) const
|
|
|