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 |