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

Side by Side Diff: Source/platform/mac/ScrollAnimatorMac.mm

Issue 197213011: Selectively disable rubber banding on mac. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 9 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 - (id)initWithScrollAnimator:(WebCore::ScrollAnimatorMac*)scrollAnimator; 93 - (id)initWithScrollAnimator:(WebCore::ScrollAnimatorMac*)scrollAnimator;
94 @end 94 @end
95 95
96 static NSSize abs(NSSize size) 96 static NSSize abs(NSSize size)
97 { 97 {
98 NSSize finalSize = size; 98 NSSize finalSize = size;
99 if (finalSize.width < 0) 99 if (finalSize.width < 0)
100 finalSize.width = -finalSize.width; 100 finalSize.width = -finalSize.width;
101 if (finalSize.height < 0) 101 if (finalSize.height < 0)
102 finalSize.height = -finalSize.height; 102 finalSize.height = -finalSize.height;
103 return finalSize; 103 return finalSize;
104 } 104 }
105 105
106 @implementation WebScrollAnimationHelperDelegate 106 @implementation WebScrollAnimationHelperDelegate
107 107
108 - (id)initWithScrollAnimator:(WebCore::ScrollAnimatorMac*)scrollAnimator 108 - (id)initWithScrollAnimator:(WebCore::ScrollAnimatorMac*)scrollAnimator
109 { 109 {
110 self = [super init]; 110 self = [super init];
111 if (!self) 111 if (!self)
112 return nil; 112 return nil;
113 113
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 - (id)initWithScrollableArea:(ScrollableArea*)scrollableArea; 189 - (id)initWithScrollableArea:(ScrollableArea*)scrollableArea;
190 @end 190 @end
191 191
192 @implementation WebScrollbarPainterControllerDelegate 192 @implementation WebScrollbarPainterControllerDelegate
193 193
194 - (id)initWithScrollableArea:(ScrollableArea*)scrollableArea 194 - (id)initWithScrollableArea:(ScrollableArea*)scrollableArea
195 { 195 {
196 self = [super init]; 196 self = [super init];
197 if (!self) 197 if (!self)
198 return nil; 198 return nil;
199 199
200 _scrollableArea = scrollableArea; 200 _scrollableArea = scrollableArea;
201 return self; 201 return self;
202 } 202 }
203 203
204 - (void)invalidate 204 - (void)invalidate
205 { 205 {
206 _scrollableArea = 0; 206 _scrollableArea = 0;
207 } 207 }
208 208
209 - (NSRect)contentAreaRectForScrollerImpPair:(id)scrollerImpPair 209 - (NSRect)contentAreaRectForScrollerImpPair:(id)scrollerImpPair
(...skipping 23 matching lines...) Expand all
233 233
234 - (NSPoint)scrollerImpPair:(id)scrollerImpPair convertContentPoint:(NSPoint)poin tInContentArea toScrollerImp:(id)scrollerImp 234 - (NSPoint)scrollerImpPair:(id)scrollerImpPair convertContentPoint:(NSPoint)poin tInContentArea toScrollerImp:(id)scrollerImp
235 { 235 {
236 236
237 if (!_scrollableArea || !scrollerImp) 237 if (!_scrollableArea || !scrollerImp)
238 return NSZeroPoint; 238 return NSZeroPoint;
239 239
240 WebCore::Scrollbar* scrollbar = 0; 240 WebCore::Scrollbar* scrollbar = 0;
241 if ([scrollerImp isHorizontal]) 241 if ([scrollerImp isHorizontal])
242 scrollbar = _scrollableArea->horizontalScrollbar(); 242 scrollbar = _scrollableArea->horizontalScrollbar();
243 else 243 else
244 scrollbar = _scrollableArea->verticalScrollbar(); 244 scrollbar = _scrollableArea->verticalScrollbar();
245 245
246 // It is possible to have a null scrollbar here since it is possible for thi s delegate 246 // It is possible to have a null scrollbar here since it is possible for thi s delegate
247 // method to be called between the moment when a scrollbar has been set to 0 and the 247 // method to be called between the moment when a scrollbar has been set to 0 and the
248 // moment when its destructor has been called. We should probably de-couple some 248 // moment when its destructor has been called. We should probably de-couple some
249 // of the clean-up work in ScrollbarThemeMac::unregisterScrollbar() to avoid this 249 // of the clean-up work in ScrollbarThemeMac::unregisterScrollbar() to avoid this
250 // issue. 250 // issue.
251 if (!scrollbar) 251 if (!scrollbar)
252 return NSZeroPoint; 252 return NSZeroPoint;
253 253
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 - (void)cancelAnimations; 394 - (void)cancelAnimations;
395 @end 395 @end
396 396
397 @implementation WebScrollbarPainterDelegate 397 @implementation WebScrollbarPainterDelegate
398 398
399 - (id)initWithScrollbar:(WebCore::Scrollbar*)scrollbar 399 - (id)initWithScrollbar:(WebCore::Scrollbar*)scrollbar
400 { 400 {
401 self = [super init]; 401 self = [super init];
402 if (!self) 402 if (!self)
403 return nil; 403 return nil;
404 404
405 _scrollbar = scrollbar; 405 _scrollbar = scrollbar;
406 return self; 406 return self;
407 } 407 }
408 408
409 - (void)cancelAnimations 409 - (void)cancelAnimations
410 { 410 {
411 BEGIN_BLOCK_OBJC_EXCEPTIONS; 411 BEGIN_BLOCK_OBJC_EXCEPTIONS;
412 [_knobAlphaAnimation.get() stopAnimation]; 412 [_knobAlphaAnimation.get() stopAnimation];
413 [_trackAlphaAnimation.get() stopAnimation]; 413 [_trackAlphaAnimation.get() stopAnimation];
414 [_uiStateTransitionAnimation.get() stopAnimation]; 414 [_uiStateTransitionAnimation.get() stopAnimation];
(...skipping 21 matching lines...) Expand all
436 if (!_scrollbar) 436 if (!_scrollbar)
437 return NSZeroPoint; 437 return NSZeroPoint;
438 438
439 ASSERT_UNUSED(scrollerImp, scrollerImp == scrollbarPainterForScrollbar(_scro llbar)); 439 ASSERT_UNUSED(scrollerImp, scrollerImp == scrollbarPainterForScrollbar(_scro llbar));
440 440
441 return _scrollbar->convertFromContainingView(_scrollbar->scrollableArea()->l astKnownMousePosition()); 441 return _scrollbar->convertFromContainingView(_scrollbar->scrollableArea()->l astKnownMousePosition());
442 } 442 }
443 443
444 - (void)setUpAlphaAnimation:(RetainPtr<WebScrollbarPartAnimation>&)scrollbarPart Animation scrollerPainter:(ScrollbarPainter)scrollerPainter part:(WebCore::Scrol lbarPart)part animateAlphaTo:(CGFloat)newAlpha duration:(NSTimeInterval)duration 444 - (void)setUpAlphaAnimation:(RetainPtr<WebScrollbarPartAnimation>&)scrollbarPart Animation scrollerPainter:(ScrollbarPainter)scrollerPainter part:(WebCore::Scrol lbarPart)part animateAlphaTo:(CGFloat)newAlpha duration:(NSTimeInterval)duration
445 { 445 {
446 // If the user has scrolled the page, then the scrollbars must be animated h ere. 446 // If the user has scrolled the page, then the scrollbars must be animated h ere.
447 // This overrides the early returns. 447 // This overrides the early returns.
448 bool mustAnimate = [self scrollAnimator]->haveScrolledSincePageLoad(); 448 bool mustAnimate = [self scrollAnimator]->haveScrolledSincePageLoad();
449 449
450 if ([self scrollAnimator]->scrollbarPaintTimerIsActive() && !mustAnimate) 450 if ([self scrollAnimator]->scrollbarPaintTimerIsActive() && !mustAnimate)
451 return; 451 return;
452 452
453 if (_scrollbar->scrollableArea()->shouldSuspendScrollAnimations() && !mustAn imate) { 453 if (_scrollbar->scrollableArea()->shouldSuspendScrollAnimations() && !mustAn imate) {
454 [self scrollAnimator]->startScrollbarPaintTimer(); 454 [self scrollAnimator]->startScrollbarPaintTimer();
455 return; 455 return;
456 } 456 }
457 457
458 // At this point, we are definitely going to animate now, so stop the timer. 458 // At this point, we are definitely going to animate now, so stop the timer.
459 [self scrollAnimator]->stopScrollbarPaintTimer(); 459 [self scrollAnimator]->stopScrollbarPaintTimer();
460 460
461 // If we are currently animating, stop 461 // If we are currently animating, stop
462 if (scrollbarPartAnimation) { 462 if (scrollbarPartAnimation) {
463 [scrollbarPartAnimation.get() stopAnimation]; 463 [scrollbarPartAnimation.get() stopAnimation];
464 scrollbarPartAnimation = nil; 464 scrollbarPartAnimation = nil;
465 } 465 }
466 466
467 if (part == WebCore::ThumbPart && _scrollbar->orientation() == VerticalScrol lbar) { 467 if (part == WebCore::ThumbPart && _scrollbar->orientation() == VerticalScrol lbar) {
468 if (newAlpha == 1) { 468 if (newAlpha == 1) {
469 IntRect thumbRect = IntRect([scrollerPainter rectForPart:NSScrollerK nob]); 469 IntRect thumbRect = IntRect([scrollerPainter rectForPart:NSScrollerK nob]);
470 [self scrollAnimator]->setVisibleScrollerThumbRect(thumbRect); 470 [self scrollAnimator]->setVisibleScrollerThumbRect(thumbRect);
471 } else 471 } else
472 [self scrollAnimator]->setVisibleScrollerThumbRect(IntRect()); 472 [self scrollAnimator]->setVisibleScrollerThumbRect(IntRect());
473 } 473 }
474 474
475 scrollbarPartAnimation.adoptNS([[WebScrollbarPartAnimation alloc] initWithSc rollbar:_scrollbar 475 scrollbarPartAnimation.adoptNS([[WebScrollbarPartAnimation alloc] initWithSc rollbar:_scrollbar
476 featureTo Animate:part == ThumbPart ? ThumbAlpha : TrackAlpha 476 featureTo Animate:part == ThumbPart ? ThumbAlpha : TrackAlpha
477 anim ateFrom:part == ThumbPart ? [scrollerPainter knobAlpha] : [scrollerPainter track Alpha] 477 anim ateFrom:part == ThumbPart ? [scrollerPainter knobAlpha] : [scrollerPainter track Alpha]
478 an imateTo:newAlpha 478 an imateTo:newAlpha
479 d uration:duration]); 479 d uration:duration]);
480 [scrollbarPartAnimation.get() startAnimation]; 480 [scrollbarPartAnimation.get() startAnimation];
481 } 481 }
482 482
483 - (void)scrollerImp:(id)scrollerImp animateKnobAlphaTo:(CGFloat)newKnobAlpha dur ation:(NSTimeInterval)duration 483 - (void)scrollerImp:(id)scrollerImp animateKnobAlphaTo:(CGFloat)newKnobAlpha dur ation:(NSTimeInterval)duration
484 { 484 {
485 if (!_scrollbar) 485 if (!_scrollbar)
486 return; 486 return;
487 487
488 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar)); 488 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar));
489 489
490 ScrollbarPainter scrollerPainter = (ScrollbarPainter)scrollerImp; 490 ScrollbarPainter scrollerPainter = (ScrollbarPainter)scrollerImp;
491 [self setUpAlphaAnimation:_knobAlphaAnimation scrollerPainter:scrollerPainte r part:WebCore::ThumbPart animateAlphaTo:newKnobAlpha duration:duration]; 491 [self setUpAlphaAnimation:_knobAlphaAnimation scrollerPainter:scrollerPainte r part:WebCore::ThumbPart animateAlphaTo:newKnobAlpha duration:duration];
492 } 492 }
493 493
494 - (void)scrollerImp:(id)scrollerImp animateTrackAlphaTo:(CGFloat)newTrackAlpha d uration:(NSTimeInterval)duration 494 - (void)scrollerImp:(id)scrollerImp animateTrackAlphaTo:(CGFloat)newTrackAlpha d uration:(NSTimeInterval)duration
495 { 495 {
496 if (!_scrollbar) 496 if (!_scrollbar)
497 return; 497 return;
498 498
499 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar)); 499 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar));
500 500
501 ScrollbarPainter scrollerPainter = (ScrollbarPainter)scrollerImp; 501 ScrollbarPainter scrollerPainter = (ScrollbarPainter)scrollerImp;
502 [self setUpAlphaAnimation:_trackAlphaAnimation scrollerPainter:scrollerPaint er part:WebCore::BackTrackPart animateAlphaTo:newTrackAlpha duration:duration]; 502 [self setUpAlphaAnimation:_trackAlphaAnimation scrollerPainter:scrollerPaint er part:WebCore::BackTrackPart animateAlphaTo:newTrackAlpha duration:duration];
503 } 503 }
504 504
505 - (void)scrollerImp:(id)scrollerImp animateUIStateTransitionWithDuration:(NSTime Interval)duration 505 - (void)scrollerImp:(id)scrollerImp animateUIStateTransitionWithDuration:(NSTime Interval)duration
506 { 506 {
507 if (!_scrollbar) 507 if (!_scrollbar)
508 return; 508 return;
509 509
510 if (!supportsUIStateTransitionProgress()) 510 if (!supportsUIStateTransitionProgress())
511 return; 511 return;
512 512
513 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar)); 513 ASSERT(scrollerImp == scrollbarPainterForScrollbar(_scrollbar));
514 514
515 ScrollbarPainter scrollbarPainter = (ScrollbarPainter)scrollerImp; 515 ScrollbarPainter scrollbarPainter = (ScrollbarPainter)scrollerImp;
516 516
517 // UIStateTransition always animates to 1. In case an animation is in progre ss this avoids a hard transition. 517 // UIStateTransition always animates to 1. In case an animation is in progre ss this avoids a hard transition.
518 [scrollbarPainter setUiStateTransitionProgress:1 - [scrollerImp uiStateTrans itionProgress]]; 518 [scrollbarPainter setUiStateTransitionProgress:1 - [scrollerImp uiStateTrans itionProgress]];
519 519
520 if (!_uiStateTransitionAnimation) 520 if (!_uiStateTransitionAnimation)
521 _uiStateTransitionAnimation.adoptNS([[WebScrollbarPartAnimation alloc] i nitWithScrollbar:_scrollbar 521 _uiStateTransitionAnimation.adoptNS([[WebScrollbarPartAnimation alloc] i nitWithScrollbar:_scrollbar
522 featureToAnimate:UIStateTransition 522 featureToAnimate:UIStateTransition
523 animateFrom:[scrollbarPainter uiStateTransitionProgress] 523 animateFrom:[scrollbarPainter uiStateTransitionProgress]
524 animateTo:1.0 524 animateTo:1.0
525 duration:duration]); 525 duration:duration]);
526 else { 526 else {
527 // If we don't need to initialize the animation, just reset the values i n case they have changed. 527 // If we don't need to initialize the animation, just reset the values i n case they have changed.
528 [_uiStateTransitionAnimation.get() setStartValue:[scrollbarPainter uiSta teTransitionProgress]]; 528 [_uiStateTransitionAnimation.get() setStartValue:[scrollbarPainter uiSta teTransitionProgress]];
529 [_uiStateTransitionAnimation.get() setEndValue:1.0]; 529 [_uiStateTransitionAnimation.get() setEndValue:1.0];
530 [_uiStateTransitionAnimation.get() setDuration:duration]; 530 [_uiStateTransitionAnimation.get() setDuration:duration];
531 } 531 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 [m_scrollbarPainterController.get() setDelegate:nil]; 616 [m_scrollbarPainterController.get() setDelegate:nil];
617 [m_horizontalScrollbarPainterDelegate.get() invalidate]; 617 [m_horizontalScrollbarPainterDelegate.get() invalidate];
618 [m_verticalScrollbarPainterDelegate.get() invalidate]; 618 [m_verticalScrollbarPainterDelegate.get() invalidate];
619 [m_scrollAnimationHelperDelegate.get() invalidate]; 619 [m_scrollAnimationHelperDelegate.get() invalidate];
620 END_BLOCK_OBJC_EXCEPTIONS; 620 END_BLOCK_OBJC_EXCEPTIONS;
621 } 621 }
622 } 622 }
623 623
624 static bool scrollAnimationEnabledForSystem() 624 static bool scrollAnimationEnabledForSystem()
625 { 625 {
626 NSString* scrollAnimationDefaultsKey = 626 NSString* scrollAnimationDefaultsKey =
627 @"AppleScrollAnimationEnabled"; 627 @"AppleScrollAnimationEnabled";
628 static bool enabled = [[NSUserDefaults standardUserDefaults] boolForKey:scro llAnimationDefaultsKey]; 628 static bool enabled = [[NSUserDefaults standardUserDefaults] boolForKey:scro llAnimationDefaultsKey];
629 return enabled; 629 return enabled;
630 } 630 }
631 631
632 #if USE(RUBBER_BANDING) 632 #if USE(RUBBER_BANDING)
633 static bool rubberBandingEnabledForSystem() 633 static bool rubberBandingEnabledForSystem()
634 { 634 {
635 static bool initialized = false; 635 static bool initialized = false;
636 static bool enabled = true; 636 static bool enabled = true;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 689
690 float newX = max<float>(min<float>(position.x(), maxPos.x()), minPos.x()); 690 float newX = max<float>(min<float>(position.x(), maxPos.x()), minPos.x());
691 float newY = max<float>(min<float>(position.y(), maxPos.y()), minPos.y()); 691 float newY = max<float>(min<float>(position.y(), maxPos.y()), minPos.y());
692 692
693 return FloatPoint(newX, newY); 693 return FloatPoint(newX, newY);
694 } 694 }
695 695
696 void ScrollAnimatorMac::immediateScrollTo(const FloatPoint& newPosition) 696 void ScrollAnimatorMac::immediateScrollTo(const FloatPoint& newPosition)
697 { 697 {
698 FloatPoint adjustedPosition = adjustScrollPositionIfNecessary(newPosition); 698 FloatPoint adjustedPosition = adjustScrollPositionIfNecessary(newPosition);
699 699
700 bool positionChanged = adjustedPosition.x() != m_currentPosX || adjustedPosi tion.y() != m_currentPosY; 700 bool positionChanged = adjustedPosition.x() != m_currentPosX || adjustedPosi tion.y() != m_currentPosY;
701 if (!positionChanged && !scrollableArea()->scrollOriginChanged()) 701 if (!positionChanged && !scrollableArea()->scrollOriginChanged())
702 return; 702 return;
703 703
704 FloatSize delta = FloatSize(adjustedPosition.x() - m_currentPosX, adjustedPo sition.y() - m_currentPosY); 704 FloatSize delta = FloatSize(adjustedPosition.x() - m_currentPosX, adjustedPo sition.y() - m_currentPosY);
705 705
706 m_currentPosX = adjustedPosition.x(); 706 m_currentPosX = adjustedPosition.x();
707 m_currentPosY = adjustedPosition.y(); 707 m_currentPosY = adjustedPosition.y();
708 notifyPositionChanged(delta); 708 notifyPositionChanged(delta);
709 } 709 }
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 if (!painter) 956 if (!painter)
957 return false; 957 return false;
958 return [painter knobAlpha] > 0; 958 return [painter knobAlpha] > 0;
959 } 959 }
960 960
961 void ScrollAnimatorMac::notifyContentAreaScrolled(const FloatSize& delta) 961 void ScrollAnimatorMac::notifyContentAreaScrolled(const FloatSize& delta)
962 { 962 {
963 if (!ScrollbarThemeMacCommon::isOverlayAPIAvailable()) 963 if (!ScrollbarThemeMacCommon::isOverlayAPIAvailable())
964 return; 964 return;
965 965
966 // This function is called when a page is going into the page cache, but the page 966 // This function is called when a page is going into the page cache, but the page
967 // isn't really scrolling in that case. We should only pass the message on t o the 967 // isn't really scrolling in that case. We should only pass the message on t o the
968 // ScrollbarPainterController when we're really scrolling on an active page. 968 // ScrollbarPainterController when we're really scrolling on an active page.
969 if (scrollableArea()->scrollbarsCanBeActive()) 969 if (scrollableArea()->scrollbarsCanBeActive())
970 sendContentAreaScrolledSoon(delta); 970 sendContentAreaScrolledSoon(delta);
971 } 971 }
972 972
973 void ScrollAnimatorMac::cancelAnimations() 973 void ScrollAnimatorMac::cancelAnimations()
974 { 974 {
975 m_haveScrolledSincePageLoad = false; 975 m_haveScrolledSincePageLoad = false;
976 976
(...skipping 13 matching lines...) Expand all
990 990
991 if (phase == PlatformWheelEventPhaseBegan) 991 if (phase == PlatformWheelEventPhaseBegan)
992 didBeginScrollGesture(); 992 didBeginScrollGesture();
993 else if (phase == PlatformWheelEventPhaseEnded || phase == PlatformWheelEven tPhaseCancelled) 993 else if (phase == PlatformWheelEventPhaseEnded || phase == PlatformWheelEven tPhaseCancelled)
994 didEndScrollGesture(); 994 didEndScrollGesture();
995 else if (phase == PlatformWheelEventPhaseMayBegin) 995 else if (phase == PlatformWheelEventPhaseMayBegin)
996 mayBeginScrollGesture(); 996 mayBeginScrollGesture();
997 } 997 }
998 998
999 #if USE(RUBBER_BANDING) 999 #if USE(RUBBER_BANDING)
1000 bool ScrollAnimatorMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent) 1000 bool ScrollAnimatorMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent, b ool canRubberbandLeft, bool canRubberbandRight)
1001 { 1001 {
1002 m_haveScrolledSincePageLoad = true; 1002 m_haveScrolledSincePageLoad = true;
1003 1003
1004 if (!wheelEvent.hasPreciseScrollingDeltas() || !rubberBandingEnabledForSyste m()) 1004 if (!wheelEvent.hasPreciseScrollingDeltas() || !rubberBandingEnabledForSyste m())
1005 return ScrollAnimator::handleWheelEvent(wheelEvent); 1005 return ScrollAnimator::handleWheelEvent(wheelEvent, canRubberbandLeft, c anRubberbandRight);
1006 1006
1007 // FIXME: This is somewhat roundabout hack to allow forwarding wheel events 1007 // FIXME: This is somewhat roundabout hack to allow forwarding wheel events
1008 // up to the parent scrollable area. It takes advantage of the fact that 1008 // up to the parent scrollable area. It takes advantage of the fact that
1009 // the base class implementation of handleWheelEvent will not accept the 1009 // the base class implementation of handleWheelEvent will not accept the
1010 // wheel event if there is nowhere to scroll. 1010 // wheel event if there is nowhere to scroll.
1011 if (fabsf(wheelEvent.deltaY()) >= fabsf(wheelEvent.deltaX())) { 1011 if (fabsf(wheelEvent.deltaY()) >= fabsf(wheelEvent.deltaX())) {
1012 if (!allowsVerticalStretching()) 1012 if (!allowsVerticalStretching())
1013 return ScrollAnimator::handleWheelEvent(wheelEvent); 1013 return ScrollAnimator::handleWheelEvent(wheelEvent, canRubberbandLef t, canRubberbandRight);
1014 } else { 1014 } else {
1015 if (!allowsHorizontalStretching()) 1015 if (!allowsHorizontalStretching())
1016 return ScrollAnimator::handleWheelEvent(wheelEvent); 1016 return ScrollAnimator::handleWheelEvent(wheelEvent, canRubberbandLef t, canRubberbandRight);
1017 } 1017 }
1018 1018
1019 bool didHandleEvent = m_scrollElasticityController.handleWheelEvent(wheelEve nt); 1019 bool didHandleEvent = m_scrollElasticityController.handleWheelEvent(wheelEve nt, canRubberbandLeft, canRubberbandRight);
1020 1020
1021 // The elasticity controller can return false on a phase end event if rubber banding wasn't in progress. 1021 // The elasticity controller can return false on a phase end event if rubber banding wasn't in progress.
1022 // In this case, the wheel phase must still be handled so that that overlay scroll bars get hidden. 1022 // In this case, the wheel phase must still be handled so that that overlay scroll bars get hidden.
1023 if (didHandleEvent || wheelEvent.phase() == PlatformWheelEventPhaseEnded || wheelEvent.phase() == PlatformWheelEventPhaseCancelled) 1023 if (didHandleEvent || wheelEvent.phase() == PlatformWheelEventPhaseEnded || wheelEvent.phase() == PlatformWheelEventPhaseCancelled)
1024 handleWheelEventPhase(wheelEvent.phase()); 1024 handleWheelEventPhase(wheelEvent.phase());
1025 1025
1026 return didHandleEvent; 1026 return didHandleEvent;
1027 } 1027 }
1028 1028
1029 bool ScrollAnimatorMac::pinnedInDirection(float deltaX, float deltaY) 1029 bool ScrollAnimatorMac::pinnedInDirection(float deltaX, float deltaY)
1030 { 1030 {
1031 FloatSize limitDelta; 1031 FloatSize limitDelta;
1032 if (fabsf(deltaY) >= fabsf(deltaX)) { 1032 if (fabsf(deltaY) >= fabsf(deltaX)) {
1033 if (deltaY < 0) { 1033 if (deltaY < 0) {
1034 // We are trying to scroll up. Make sure we are not pinned to the t op 1034 // We are trying to scroll up. Make sure we are not pinned to the t op
1035 limitDelta.setHeight(m_scrollableArea->visibleContentRect().y() + + m_scrollableArea->scrollOrigin().y()); 1035 limitDelta.setHeight(m_scrollableArea->visibleContentRect().y() + + m_scrollableArea->scrollOrigin().y());
1036 } else { 1036 } else {
1037 // We are trying to scroll down. Make sure we are not pinned to the bottom 1037 // We are trying to scroll down. Make sure we are not pinned to the bottom
1038 limitDelta.setHeight(m_scrollableArea->contentsSize().height() - (m_ scrollableArea->visibleContentRect().maxY() + m_scrollableArea->scrollOrigin().y ())); 1038 limitDelta.setHeight(m_scrollableArea->contentsSize().height() - (m_ scrollableArea->visibleContentRect().maxY() + m_scrollableArea->scrollOrigin().y ()));
1039 } 1039 }
1040 } else if (deltaX != 0) { 1040 } else if (deltaX != 0) {
1041 if (deltaX < 0) { 1041 if (deltaX < 0) {
1042 // We are trying to scroll left. Make sure we are not pinned to the left 1042 // We are trying to scroll left. Make sure we are not pinned to the left
1043 limitDelta.setWidth(m_scrollableArea->visibleContentRect().x() + m_s crollableArea->scrollOrigin().x()); 1043 limitDelta.setWidth(m_scrollableArea->visibleContentRect().x() + m_s crollableArea->scrollOrigin().x());
1044 } else { 1044 } else {
1045 // We are trying to scroll right. Make sure we are not pinned to th e right 1045 // We are trying to scroll right. Make sure we are not pinned to th e right
1046 limitDelta.setWidth(m_scrollableArea->contentsSize().width() - (m_sc rollableArea->visibleContentRect().maxX() + m_scrollableArea->scrollOrigin().x() )); 1046 limitDelta.setWidth(m_scrollableArea->contentsSize().width() - (m_sc rollableArea->visibleContentRect().maxX() + m_scrollableArea->scrollOrigin().x() ));
1047 } 1047 }
1048 } 1048 }
1049 1049
1050 if ((deltaX != 0 || deltaY != 0) && (limitDelta.width() < 1 && limitDelta.he ight() < 1)) 1050 if ((deltaX != 0 || deltaY != 0) && (limitDelta.width() < 1 && limitDelta.he ight() < 1))
1051 return true; 1051 return true;
1052 return false; 1052 return false;
1053 } 1053 }
1054 1054
1055 bool ScrollAnimatorMac::allowsVerticalStretching() 1055 bool ScrollAnimatorMac::allowsVerticalStretching()
1056 { 1056 {
1057 switch (m_scrollableArea->verticalScrollElasticity()) { 1057 switch (m_scrollableArea->verticalScrollElasticity()) {
1058 case ScrollElasticityAutomatic: { 1058 case ScrollElasticityAutomatic: {
1059 Scrollbar* hScroller = m_scrollableArea->horizontalScrollbar(); 1059 Scrollbar* hScroller = m_scrollableArea->horizontalScrollbar();
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 m_needsScrollerStyleUpdate = false; 1186 m_needsScrollerStyleUpdate = false;
1187 return; 1187 return;
1188 } 1188 }
1189 1189
1190 NSScrollerStyle newStyle = [m_scrollbarPainterController.get() scrollerStyle ]; 1190 NSScrollerStyle newStyle = [m_scrollbarPainterController.get() scrollerStyle ];
1191 1191
1192 if (Scrollbar* verticalScrollbar = scrollableArea()->verticalScrollbar()) { 1192 if (Scrollbar* verticalScrollbar = scrollableArea()->verticalScrollbar()) {
1193 verticalScrollbar->invalidate(); 1193 verticalScrollbar->invalidate();
1194 1194
1195 ScrollbarPainter oldVerticalPainter = [m_scrollbarPainterController.get( ) verticalScrollerImp]; 1195 ScrollbarPainter oldVerticalPainter = [m_scrollbarPainterController.get( ) verticalScrollerImp];
1196 ScrollbarPainter newVerticalPainter = [NSClassFromString(@"NSScrollerImp ") scrollerImpWithStyle:newStyle 1196 ScrollbarPainter newVerticalPainter = [NSClassFromString(@"NSScrollerImp ") scrollerImpWithStyle:newStyle
1197 controlSize:(NSControlSize)verticalScrollbar->controlSize() 1197 controlSize:(NSControlSize)verticalScrollbar->controlSize()
1198 horizontal:NO 1198 horizontal:NO
1199 replacingScrollerImp:oldVerticalPainter]; 1199 replacingScrollerImp:oldVerticalPainter];
1200 [m_scrollbarPainterController.get() setVerticalScrollerImp:newVerticalPa inter]; 1200 [m_scrollbarPainterController.get() setVerticalScrollerImp:newVerticalPa inter];
1201 macTheme->setNewPainterForScrollbar(verticalScrollbar, newVerticalPainte r); 1201 macTheme->setNewPainterForScrollbar(verticalScrollbar, newVerticalPainte r);
1202 1202
1203 // The different scrollbar styles have different thicknesses, so we must re-set the 1203 // The different scrollbar styles have different thicknesses, so we must re-set the
1204 // frameRect to the new thickness, and the re-layout below will ensure t he position 1204 // frameRect to the new thickness, and the re-layout below will ensure t he position
1205 // and length are properly updated. 1205 // and length are properly updated.
1206 int thickness = macTheme->scrollbarThickness(verticalScrollbar->controlS ize()); 1206 int thickness = macTheme->scrollbarThickness(verticalScrollbar->controlS ize());
1207 verticalScrollbar->setFrameRect(IntRect(0, 0, thickness, thickness)); 1207 verticalScrollbar->setFrameRect(IntRect(0, 0, thickness, thickness));
1208 } 1208 }
1209 1209
1210 if (Scrollbar* horizontalScrollbar = scrollableArea()->horizontalScrollbar() ) { 1210 if (Scrollbar* horizontalScrollbar = scrollableArea()->horizontalScrollbar() ) {
1211 horizontalScrollbar->invalidate(); 1211 horizontalScrollbar->invalidate();
1212 1212
1213 ScrollbarPainter oldHorizontalPainter = [m_scrollbarPainterController.ge t() horizontalScrollerImp]; 1213 ScrollbarPainter oldHorizontalPainter = [m_scrollbarPainterController.ge t() horizontalScrollerImp];
1214 ScrollbarPainter newHorizontalPainter = [NSClassFromString(@"NSScrollerI mp") scrollerImpWithStyle:newStyle 1214 ScrollbarPainter newHorizontalPainter = [NSClassFromString(@"NSScrollerI mp") scrollerImpWithStyle:newStyle
1215 controlSize:(NSControlSize)horizontalScrollbar->controlSize() 1215 controlSize:(NSControlSize)horizontalScrollbar->controlSize()
1216 horizontal:YES 1216 horizontal:YES
1217 replacingScrollerImp:oldHorizontalPainter]; 1217 replacingScrollerImp:oldHorizontalPainter];
1218 [m_scrollbarPainterController.get() setHorizontalScrollerImp:newHorizont alPainter]; 1218 [m_scrollbarPainterController.get() setHorizontalScrollerImp:newHorizont alPainter];
1219 macTheme->setNewPainterForScrollbar(horizontalScrollbar, newHorizontalPa inter); 1219 macTheme->setNewPainterForScrollbar(horizontalScrollbar, newHorizontalPa inter);
1220 1220
1221 // The different scrollbar styles have different thicknesses, so we must re-set the 1221 // The different scrollbar styles have different thicknesses, so we must re-set the
1222 // frameRect to the new thickness, and the re-layout below will ensure t he position 1222 // frameRect to the new thickness, and the re-layout below will ensure t he position
1223 // and length are properly updated. 1223 // and length are properly updated.
1224 int thickness = macTheme->scrollbarThickness(horizontalScrollbar->contro lSize()); 1224 int thickness = macTheme->scrollbarThickness(horizontalScrollbar->contro lSize());
1225 horizontalScrollbar->setFrameRect(IntRect(0, 0, thickness, thickness)); 1225 horizontalScrollbar->setFrameRect(IntRect(0, 0, thickness, thickness));
1226 } 1226 }
1227 1227
1228 // If m_needsScrollerStyleUpdate is true, then the page is restoring from th e page cache, and 1228 // If m_needsScrollerStyleUpdate is true, then the page is restoring from th e page cache, and
1229 // a relayout will happen on its own. Otherwise, we must initiate a re-layou t ourselves. 1229 // a relayout will happen on its own. Otherwise, we must initiate a re-layou t ourselves.
1230 scrollableArea()->scrollbarStyleChanged(newStyle, !m_needsScrollerStyleUpdat e); 1230 scrollableArea()->scrollbarStyleChanged(newStyle, !m_needsScrollerStyleUpdat e);
1231 1231
1232 m_needsScrollerStyleUpdate = false; 1232 m_needsScrollerStyleUpdate = false;
1233 } 1233 }
1234 1234
1235 void ScrollAnimatorMac::startScrollbarPaintTimer() 1235 void ScrollAnimatorMac::startScrollbarPaintTimer()
1236 { 1236 {
1237 m_initialScrollbarPaintTimer.startOneShot(0.1); 1237 m_initialScrollbarPaintTimer.startOneShot(0.1);
1238 } 1238 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 return; 1284 return;
1285 1285
1286 m_visibleScrollerThumbRect = rectInViewCoordinates; 1286 m_visibleScrollerThumbRect = rectInViewCoordinates;
1287 } 1287 }
1288 1288
1289 bool ScrollAnimatorMac::canUseCoordinatedScrollbar() { 1289 bool ScrollAnimatorMac::canUseCoordinatedScrollbar() {
1290 return ScrollbarThemeMacCommon::isOverlayAPIAvailable(); 1290 return ScrollbarThemeMacCommon::isOverlayAPIAvailable();
1291 } 1291 }
1292 1292
1293 } // namespace WebCore 1293 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698