Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| index 769acc39df44b05836e2d8ab1259afcd765a904f..0eb408c2ca75d28dd60b9d0dd1f261cf87488eae 100644 |
| --- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| +++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| @@ -37,6 +37,7 @@ |
| #include "platform/scroll/MainThreadScrollingReason.h" |
| #include "platform/scroll/ProgrammaticScrollAnimator.h" |
| #include "platform/scroll/ScrollbarTheme.h" |
| +#include "platform/scroll/SmoothScrollSequencer.h" |
| static const int kPixelsPerLineStep = 40; |
| static const float kMinFractionToStepWhenPaging = 0.875f; |
| @@ -154,6 +155,8 @@ ScrollResult ScrollableArea::UserScroll(ScrollGranularity granularity, |
| } |
| CancelProgrammaticScrollAnimation(); |
| + if (SmoothScrollSequencer* sequencer = GetSmoothScrollSequencer()) |
| + sequencer->AbortAnimations(); |
| ScrollResult result = |
| GetScrollAnimator().UserScroll(granularity, pixel_delta); |
| @@ -170,6 +173,12 @@ ScrollResult ScrollableArea::UserScroll(ScrollGranularity granularity, |
| void ScrollableArea::SetScrollOffset(const ScrollOffset& offset, |
| ScrollType scroll_type, |
| ScrollBehavior behavior) { |
| + if (scroll_type != kSequencedSmoothScroll && scroll_type != kClampingScroll && |
| + scroll_type != kAnchoringScroll) { |
|
bokan
2017/06/07 17:56:00
just FYI: I'm not sure how anchoring scrolls shoul
sunyunjia
2017/06/07 18:34:10
Acknowledged.
|
| + if (SmoothScrollSequencer* sequencer = GetSmoothScrollSequencer()) |
| + sequencer->AbortAnimations(); |
| + } |
| + |
| ScrollOffset clamped_offset = ClampScrollOffset(offset); |
| if (clamped_offset == GetScrollOffset()) |
| return; |
| @@ -187,7 +196,10 @@ void ScrollableArea::SetScrollOffset(const ScrollOffset& offset, |
| scroll_type); |
| break; |
| case kProgrammaticScroll: |
| - ProgrammaticScrollHelper(clamped_offset, behavior); |
| + ProgrammaticScrollHelper(clamped_offset, behavior, false); |
| + break; |
| + case kSequencedSmoothScroll: |
| + ProgrammaticScrollHelper(clamped_offset, behavior, true); |
| break; |
| case kUserScroll: |
| UserScrollHelper(clamped_offset, behavior); |
| @@ -222,19 +234,25 @@ void ScrollableArea::SetScrollOffsetSingleAxis(ScrollbarOrientation orientation, |
| ScrollableArea::SetScrollOffset(new_offset, scroll_type, behavior); |
| } |
| -void ScrollableArea::ProgrammaticScrollHelper(const ScrollOffset& offset, |
| - ScrollBehavior scroll_behavior) { |
| +void ScrollableArea::ProgrammaticScrollHelper( |
| + const ScrollOffset& offset, |
| + ScrollBehavior scroll_behavior, |
| + bool sequenced_for_smooth_scroll) { |
| CancelScrollAnimation(); |
| - if (scroll_behavior == kScrollBehaviorSmooth) |
| - GetProgrammaticScrollAnimator().AnimateToOffset(offset); |
| - else |
| + if (scroll_behavior == kScrollBehaviorSmooth) { |
| + GetProgrammaticScrollAnimator().AnimateToOffset( |
| + offset, sequenced_for_smooth_scroll); |
| + } else { |
| GetProgrammaticScrollAnimator().ScrollToOffsetWithoutAnimation(offset); |
| + } |
| } |
| void ScrollableArea::UserScrollHelper(const ScrollOffset& offset, |
| ScrollBehavior scroll_behavior) { |
| CancelProgrammaticScrollAnimation(); |
| + if (SmoothScrollSequencer* sequencer = GetSmoothScrollSequencer()) |
| + sequencer->AbortAnimations(); |
| float x = UserInputScrollable(kHorizontalScrollbar) |
| ? offset.Width() |
| @@ -255,6 +273,7 @@ void ScrollableArea::UserScrollHelper(const ScrollOffset& offset, |
| LayoutRect ScrollableArea::ScrollIntoView(const LayoutRect& rect_in_content, |
| const ScrollAlignment& align_x, |
| const ScrollAlignment& align_y, |
| + bool is_smooth, |
| ScrollType) { |
| // TODO(bokan): This should really be implemented here but ScrollAlignment is |
| // in Core which is a dependency violation. |