Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1802)

Unified Diff: Source/platform/scroll/ScrollableArea.cpp

Issue 134443003: Implement CSSOM Smooth Scroll API (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/platform/scroll/ScrollableArea.cpp
diff --git a/Source/platform/scroll/ScrollableArea.cpp b/Source/platform/scroll/ScrollableArea.cpp
index e5c157112e9bd4d49893d9e125a1f9a402d5d1f8..b0a8541838bbb8fb5572ff6015f1338d1bb37e89 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) {
@@ -115,6 +124,8 @@ bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
if (!userInputScrollable(orientation))
return false;
+ cancelProgrammaticScrollAnimation();
+
float step = 0;
switch (granularity) {
case ScrollByLine:
@@ -140,6 +151,7 @@ bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset)
{
+ cancelProgrammaticScrollAnimation();
scrollAnimator()->scrollToOffsetWithoutAnimation(offset);
}
@@ -151,6 +163,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);
@@ -208,6 +228,7 @@ bool ScrollableArea::scrollBehaviorFromString(const String& behaviorString, Scro
bool ScrollableArea::handleWheelEvent(const PlatformWheelEvent& wheelEvent)
{
+ cancelProgrammaticScrollAnimation();
return scrollAnimator()->handleWheelEvent(wheelEvent);
}
@@ -222,6 +243,12 @@ void ScrollableArea::setScrollOffsetFromAnimation(const IntPoint& offset)
scrollPositionChanged(offset);
}
+void ScrollableArea::setScrollOffsetFromProgrammaticAnimation(const IntPoint& offset)
+{
+ scrollPositionChanged(offset);
+ scrollAnimator()->setCurrentPosition(offset);
+}
+
void ScrollableArea::willStartLiveResize()
{
if (m_inLiveResize)
@@ -380,10 +407,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 compositedScrollAnimationsEnabled() && layerForScrolling() && !layerForScrolling()->platformLayer()->shouldScrollOnMainThread();
+}
+
+void ScrollableArea::cancelProgrammaticScrollAnimation()
+{
+ if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgrammaticScrollAnimator())
+ programmaticScrollAnimator->cancelAnimation();
}
IntRect ScrollableArea::visibleContentRect(IncludeScrollbarsInRect scrollbarInclusion) const

Powered by Google App Engine
This is Rietveld 408576698