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

Unified Diff: Source/core/frame/FrameView.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/core/frame/FrameView.h ('k') | Source/core/frame/LocalDOMWindow.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/frame/FrameView.cpp
diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp
index 4531ee4e637ff563196e553b7d56f66621303165..08134addfd6408c5e3a90a1d9475bcfa6e6aa06f 100644
--- a/Source/core/frame/FrameView.cpp
+++ b/Source/core/frame/FrameView.cpp
@@ -78,6 +78,7 @@
#include "platform/geometry/FloatRect.h"
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/GraphicsLayerDebugInfo.h"
+#include "platform/scroll/ProgrammaticScrollAnimator.h"
#include "platform/scroll/ScrollAnimator.h"
#include "platform/scroll/ScrollbarTheme.h"
#include "platform/text/TextStream.h"
@@ -263,6 +264,7 @@ void FrameView::prepareForDetach()
if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
scrollAnimator->cancelAnimations();
+ cancelProgrammaticScrollAnimation();
detachCustomScrollbars();
// When the view is no longer associated with a frame, it needs to be removed from the ax object cache
@@ -390,6 +392,21 @@ bool FrameView::scheduleAnimation()
return false;
}
+void FrameView::serviceScrollAnimations(double monotonicTime)
+{
+ ScrollableArea::serviceScrollAnimations(monotonicTime);
+
+ if (!m_animatingScrollableAreas || m_animatingScrollableAreas->isEmpty())
+ return;
+
+ // We need to iterate over a copy of m_animatingScrollableAreas, since ScrollableAreas
+ // may deregister themselves during the iteration.
+ Vector<ScrollableArea*> animatingScrollableAreas;
+ copyToVector(*m_animatingScrollableAreas, animatingScrollableAreas);
+ for (size_t i = 0; i < animatingScrollableAreas.size(); ++i)
+ animatingScrollableAreas[i]->serviceScrollAnimations(monotonicTime);
+}
+
Page* FrameView::page() const
{
return frame().page();
@@ -1569,8 +1586,9 @@ void FrameView::scrollElementToRect(Element* element, const IntRect& rect)
}
}
-void FrameView::setScrollPosition(const IntPoint& scrollPoint)
+void FrameView::setScrollPosition(const IntPoint& scrollPoint, ScrollBehavior scrollBehavior)
{
+ cancelProgrammaticScrollAnimation();
TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
m_maintainScrollPositionAnchor = nullptr;
@@ -1579,7 +1597,9 @@ void FrameView::setScrollPosition(const IntPoint& scrollPoint)
if (newScrollPosition == scrollPosition())
return;
- ScrollView::setScrollPosition(newScrollPosition);
+ if (scrollBehavior == ScrollBehaviorAuto)
+ scrollBehavior = m_frame->document()->documentElement()->renderer()->style()->scrollBehavior();
+ ScrollView::setScrollPosition(newScrollPosition, scrollBehavior);
}
void FrameView::setScrollPositionNonProgrammatically(const IntPoint& scrollPoint)
@@ -3186,6 +3206,27 @@ void FrameView::removeScrollableArea(ScrollableArea* scrollableArea)
m_scrollableAreas->remove(scrollableArea);
}
+bool FrameView::addAnimatingScrollableArea(ScrollableArea* scrollableArea)
+{
+ ASSERT(scrollableArea);
+ if (!m_animatingScrollableAreas)
+ m_animatingScrollableAreas = adoptPtr(new ScrollableAreaSet);
+ return m_animatingScrollableAreas->add(scrollableArea).isNewEntry;
+}
+
+bool FrameView::removeAnimatingScrollableArea(ScrollableArea* scrollableArea)
+{
+ if (!m_animatingScrollableAreas)
+ return false;
+
+ ScrollableAreaSet::iterator it = m_animatingScrollableAreas->find(scrollableArea);
+ if (it == m_animatingScrollableAreas->end())
+ return false;
+
+ m_animatingScrollableAreas->remove(it);
+ return true;
+}
+
void FrameView::removeChild(Widget* widget)
{
if (widget->isFrameView())
« no previous file with comments | « Source/core/frame/FrameView.h ('k') | Source/core/frame/LocalDOMWindow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698