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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved. 3 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 16 matching lines...) Expand all
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32 #include "config.h" 32 #include "config.h"
33 #include "platform/scroll/ScrollableArea.h" 33 #include "platform/scroll/ScrollableArea.h"
34 34
35 #include "platform/graphics/GraphicsLayer.h" 35 #include "platform/graphics/GraphicsLayer.h"
36 #include "platform/geometry/FloatPoint.h" 36 #include "platform/geometry/FloatPoint.h"
37 #include "platform/scroll/ProgrammaticScrollAnimator.h"
37 #include "platform/scroll/ScrollbarTheme.h" 38 #include "platform/scroll/ScrollbarTheme.h"
38 #include "wtf/PassOwnPtr.h" 39 #include "wtf/PassOwnPtr.h"
39 40
40 #include "platform/TraceEvent.h" 41 #include "platform/TraceEvent.h"
41 42
42 static const int kPixelsPerLineStep = 40; 43 static const int kPixelsPerLineStep = 40;
43 static const float kMinFractionToStepWhenPaging = 0.875f; 44 static const float kMinFractionToStepWhenPaging = 0.875f;
44 45
45 namespace WebCore { 46 namespace WebCore {
46 47
47 struct SameSizeAsScrollableArea { 48 struct SameSizeAsScrollableArea {
48 virtual ~SameSizeAsScrollableArea(); 49 virtual ~SameSizeAsScrollableArea();
49 unsigned damageBits : 2; 50 unsigned damageBits : 2;
50 IntRect scrollbarDamage[2]; 51 IntRect scrollbarDamage[2];
51 void* pointer; 52 void* pointer[2];
52 unsigned bitfields : 16; 53 unsigned bitfields : 16;
53 IntPoint origin; 54 IntPoint origin;
54 }; 55 };
55 56
56 COMPILE_ASSERT(sizeof(ScrollableArea) == sizeof(SameSizeAsScrollableArea), Scrol lableArea_should_stay_small); 57 COMPILE_ASSERT(sizeof(ScrollableArea) == sizeof(SameSizeAsScrollableArea), Scrol lableArea_should_stay_small);
57 58
58 int ScrollableArea::pixelsPerLineStep() 59 int ScrollableArea::pixelsPerLineStep()
59 { 60 {
60 return kPixelsPerLineStep; 61 return kPixelsPerLineStep;
61 } 62 }
(...skipping 26 matching lines...) Expand all
88 } 89 }
89 90
90 ScrollAnimator* ScrollableArea::scrollAnimator() const 91 ScrollAnimator* ScrollableArea::scrollAnimator() const
91 { 92 {
92 if (!m_scrollAnimator) 93 if (!m_scrollAnimator)
93 m_scrollAnimator = ScrollAnimator::create(const_cast<ScrollableArea*>(th is)); 94 m_scrollAnimator = ScrollAnimator::create(const_cast<ScrollableArea*>(th is));
94 95
95 return m_scrollAnimator.get(); 96 return m_scrollAnimator.get();
96 } 97 }
97 98
99 ProgrammaticScrollAnimator* ScrollableArea::programmaticScrollAnimator() const
100 {
101 if (!m_programmaticScrollAnimator)
102 m_programmaticScrollAnimator = ProgrammaticScrollAnimator::create(const_ cast<ScrollableArea*>(this));
103
104 return m_programmaticScrollAnimator.get();
105 }
106
98 void ScrollableArea::setScrollOrigin(const IntPoint& origin) 107 void ScrollableArea::setScrollOrigin(const IntPoint& origin)
99 { 108 {
100 if (m_scrollOrigin != origin) { 109 if (m_scrollOrigin != origin) {
101 m_scrollOrigin = origin; 110 m_scrollOrigin = origin;
102 m_scrollOriginChanged = true; 111 m_scrollOriginChanged = true;
103 } 112 }
104 } 113 }
105 114
106 bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula rity, float delta) 115 bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula rity, float delta)
107 { 116 {
108 ScrollbarOrientation orientation; 117 ScrollbarOrientation orientation;
109 118
110 if (direction == ScrollUp || direction == ScrollDown) 119 if (direction == ScrollUp || direction == ScrollDown)
111 orientation = VerticalScrollbar; 120 orientation = VerticalScrollbar;
112 else 121 else
113 orientation = HorizontalScrollbar; 122 orientation = HorizontalScrollbar;
114 123
115 if (!userInputScrollable(orientation)) 124 if (!userInputScrollable(orientation))
116 return false; 125 return false;
117 126
127 cancelProgrammaticScrollAnimation();
128
118 float step = 0; 129 float step = 0;
119 switch (granularity) { 130 switch (granularity) {
120 case ScrollByLine: 131 case ScrollByLine:
121 step = lineStep(orientation); 132 step = lineStep(orientation);
122 break; 133 break;
123 case ScrollByPage: 134 case ScrollByPage:
124 step = pageStep(orientation); 135 step = pageStep(orientation);
125 break; 136 break;
126 case ScrollByDocument: 137 case ScrollByDocument:
127 step = documentStep(orientation); 138 step = documentStep(orientation);
128 break; 139 break;
129 case ScrollByPixel: 140 case ScrollByPixel:
130 case ScrollByPrecisePixel: 141 case ScrollByPrecisePixel:
131 step = pixelStep(orientation); 142 step = pixelStep(orientation);
132 break; 143 break;
133 } 144 }
134 145
135 if (direction == ScrollUp || direction == ScrollLeft) 146 if (direction == ScrollUp || direction == ScrollLeft)
136 delta = -delta; 147 delta = -delta;
137 148
138 return scrollAnimator()->scroll(orientation, granularity, step, delta); 149 return scrollAnimator()->scroll(orientation, granularity, step, delta);
139 } 150 }
140 151
141 void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset) 152 void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset)
142 { 153 {
154 cancelProgrammaticScrollAnimation();
143 scrollAnimator()->scrollToOffsetWithoutAnimation(offset); 155 scrollAnimator()->scrollToOffsetWithoutAnimation(offset);
144 } 156 }
145 157
146 void ScrollableArea::scrollToOffsetWithoutAnimation(ScrollbarOrientation orienta tion, float offset) 158 void ScrollableArea::scrollToOffsetWithoutAnimation(ScrollbarOrientation orienta tion, float offset)
147 { 159 {
148 if (orientation == HorizontalScrollbar) 160 if (orientation == HorizontalScrollbar)
149 scrollToOffsetWithoutAnimation(FloatPoint(offset, scrollAnimator()->curr entPosition().y())); 161 scrollToOffsetWithoutAnimation(FloatPoint(offset, scrollAnimator()->curr entPosition().y()));
150 else 162 else
151 scrollToOffsetWithoutAnimation(FloatPoint(scrollAnimator()->currentPosit ion().x(), offset)); 163 scrollToOffsetWithoutAnimation(FloatPoint(scrollAnimator()->currentPosit ion().x(), offset));
152 } 164 }
153 165
166 void ScrollableArea::programmaticallyScrollSmoothlyToOffset(const FloatPoint& of fset)
167 {
168 if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
169 scrollAnimator->cancelAnimations();
170 cancelProgrammaticScrollAnimation();
171 programmaticScrollAnimator()->animateToOffset(offset);
172 }
173
154 void ScrollableArea::notifyScrollPositionChanged(const IntPoint& position) 174 void ScrollableArea::notifyScrollPositionChanged(const IntPoint& position)
155 { 175 {
156 scrollPositionChanged(position); 176 scrollPositionChanged(position);
157 scrollAnimator()->setCurrentPosition(position); 177 scrollAnimator()->setCurrentPosition(position);
158 } 178 }
159 179
160 void ScrollableArea::scrollPositionChanged(const IntPoint& position) 180 void ScrollableArea::scrollPositionChanged(const IntPoint& position)
161 { 181 {
162 TRACE_EVENT0("webkit", "ScrollableArea::scrollPositionChanged"); 182 TRACE_EVENT0("webkit", "ScrollableArea::scrollPositionChanged");
163 183
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 else if (behaviorString == "smooth") 221 else if (behaviorString == "smooth")
202 behavior = ScrollBehaviorSmooth; 222 behavior = ScrollBehaviorSmooth;
203 else 223 else
204 return false; 224 return false;
205 225
206 return true; 226 return true;
207 } 227 }
208 228
209 bool ScrollableArea::handleWheelEvent(const PlatformWheelEvent& wheelEvent) 229 bool ScrollableArea::handleWheelEvent(const PlatformWheelEvent& wheelEvent)
210 { 230 {
231 cancelProgrammaticScrollAnimation();
211 return scrollAnimator()->handleWheelEvent(wheelEvent); 232 return scrollAnimator()->handleWheelEvent(wheelEvent);
212 } 233 }
213 234
214 // NOTE: Only called from Internals for testing. 235 // NOTE: Only called from Internals for testing.
215 void ScrollableArea::setScrollOffsetFromInternals(const IntPoint& offset) 236 void ScrollableArea::setScrollOffsetFromInternals(const IntPoint& offset)
216 { 237 {
217 setScrollOffsetFromAnimation(offset); 238 setScrollOffsetFromAnimation(offset);
218 } 239 }
219 240
220 void ScrollableArea::setScrollOffsetFromAnimation(const IntPoint& offset) 241 void ScrollableArea::setScrollOffsetFromAnimation(const IntPoint& offset)
221 { 242 {
222 scrollPositionChanged(offset); 243 scrollPositionChanged(offset);
223 } 244 }
224 245
246 void ScrollableArea::setScrollOffsetFromProgrammaticAnimation(const IntPoint& of fset)
247 {
248 scrollPositionChanged(offset);
249 scrollAnimator()->setCurrentPosition(offset);
250 }
251
225 void ScrollableArea::willStartLiveResize() 252 void ScrollableArea::willStartLiveResize()
226 { 253 {
227 if (m_inLiveResize) 254 if (m_inLiveResize)
228 return; 255 return;
229 m_inLiveResize = true; 256 m_inLiveResize = true;
230 if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) 257 if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
231 scrollAnimator->willStartLiveResize(); 258 scrollAnimator->willStartLiveResize();
232 } 259 }
233 260
234 void ScrollableArea::willEndLiveResize() 261 void ScrollableArea::willEndLiveResize()
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 bool ScrollableArea::hasLayerForVerticalScrollbar() const 400 bool ScrollableArea::hasLayerForVerticalScrollbar() const
374 { 401 {
375 return layerForVerticalScrollbar(); 402 return layerForVerticalScrollbar();
376 } 403 }
377 404
378 bool ScrollableArea::hasLayerForScrollCorner() const 405 bool ScrollableArea::hasLayerForScrollCorner() const
379 { 406 {
380 return layerForScrollCorner(); 407 return layerForScrollCorner();
381 } 408 }
382 409
383 void ScrollableArea::serviceScrollAnimations() 410 void ScrollableArea::serviceScrollAnimations(double monotonicTime)
384 { 411 {
385 if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) 412 if (ScrollAnimator* scrollAnimator = existingScrollAnimator())
386 scrollAnimator->serviceScrollAnimations(); 413 scrollAnimator->serviceScrollAnimations();
414 if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgram maticScrollAnimator())
415 programmaticScrollAnimator->tickAnimation(monotonicTime);
416 }
417
418 void ScrollableArea::notifyAnimationStarted(double monotonicTime)
419 {
420 programmaticScrollAnimator()->notifyAnimationStarted(monotonicTime);
421 }
422
423 void ScrollableArea::notifyAnimationFinished(double monotonicTime)
424 {
425 programmaticScrollAnimator()->notifyAnimationFinished(monotonicTime);
426 }
427
428 void ScrollableArea::layerForScrollingDidChange()
429 {
430 if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgram maticScrollAnimator())
431 programmaticScrollAnimator->canUseCompositedScrollAnimationsDidChange();
432 }
433
434 void ScrollableArea::requiresMainThreadScrollingDidChange()
435 {
436 if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgram maticScrollAnimator())
437 programmaticScrollAnimator->canUseCompositedScrollAnimationsDidChange();
438 }
439
440 bool ScrollableArea::canUseCompositedScrollAnimations() const
441 {
442 return compositedScrollAnimationsEnabled() && layerForScrolling() && !layerF orScrolling()->platformLayer()->shouldScrollOnMainThread();
443 }
444
445 void ScrollableArea::cancelProgrammaticScrollAnimation()
446 {
447 if (ProgrammaticScrollAnimator* programmaticScrollAnimator = existingProgram maticScrollAnimator())
448 programmaticScrollAnimator->cancelAnimation();
387 } 449 }
388 450
389 IntRect ScrollableArea::visibleContentRect(IncludeScrollbarsInRect scrollbarIncl usion) const 451 IntRect ScrollableArea::visibleContentRect(IncludeScrollbarsInRect scrollbarIncl usion) const
390 { 452 {
391 int verticalScrollbarWidth = 0; 453 int verticalScrollbarWidth = 0;
392 int horizontalScrollbarHeight = 0; 454 int horizontalScrollbarHeight = 0;
393 455
394 if (scrollbarInclusion == IncludeScrollbars) { 456 if (scrollbarInclusion == IncludeScrollbars) {
395 if (Scrollbar* verticalBar = verticalScrollbar()) 457 if (Scrollbar* verticalBar = verticalScrollbar())
396 verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? vertic alBar->width() : 0; 458 verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? vertic alBar->width() : 0;
(...skipping 21 matching lines...) Expand all
418 { 480 {
419 return scrollSize(orientation); 481 return scrollSize(orientation);
420 } 482 }
421 483
422 float ScrollableArea::pixelStep(ScrollbarOrientation) const 484 float ScrollableArea::pixelStep(ScrollbarOrientation) const
423 { 485 {
424 return 1; 486 return 1;
425 } 487 }
426 488
427 } // namespace WebCore 489 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698