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

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: Created 6 years, 5 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
« no previous file with comments | « Source/platform/scroll/ScrollableArea.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/platform/scroll/ScrollableArea.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698