Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 , m_ignoreMomentumScrolls(false) | 103 , m_ignoreMomentumScrolls(false) |
| 104 , m_lastMomentumScrollTimestamp(0) | 104 , m_lastMomentumScrollTimestamp(0) |
| 105 , m_startTime(0) | 105 , m_startTime(0) |
| 106 , m_snapRubberbandTimerIsActive(false) | 106 , m_snapRubberbandTimerIsActive(false) |
| 107 { | 107 { |
| 108 } | 108 } |
| 109 | 109 |
| 110 bool ScrollElasticityController::handleWheelEvent(const PlatformWheelEvent& whee lEvent) | 110 bool ScrollElasticityController::handleWheelEvent(const PlatformWheelEvent& whee lEvent) |
| 111 { | 111 { |
| 112 if (wheelEvent.phase() == PlatformWheelEventPhaseBegan) { | 112 if (wheelEvent.phase() == PlatformWheelEventPhaseBegan) { |
| 113 // First, check if we should rubber-band at all. | 113 if (!shouldStartRubberBanding(wheelEvent)) |
| 114 if (m_client->pinnedInDirection(FloatSize(-wheelEvent.deltaX(), 0)) && | |
| 115 !shouldRubberBandInHorizontalDirection(wheelEvent)) | |
| 116 return false; | 114 return false; |
| 117 | 115 |
| 118 m_inScrollGesture = true; | 116 m_inScrollGesture = true; |
| 119 m_momentumScrollInProgress = false; | 117 m_momentumScrollInProgress = false; |
| 120 m_ignoreMomentumScrolls = false; | 118 m_ignoreMomentumScrolls = false; |
| 121 m_lastMomentumScrollTimestamp = 0; | 119 m_lastMomentumScrollTimestamp = 0; |
| 122 m_momentumVelocity = FloatSize(); | 120 m_momentumVelocity = FloatSize(); |
| 123 | 121 |
| 124 IntSize stretchAmount = m_client->stretchAmount(); | 122 IntSize stretchAmount = m_client->stretchAmount(); |
| 125 m_stretchScrollForce.setWidth(reboundDeltaForElasticDelta(stretchAmount. width())); | 123 m_stretchScrollForce.setWidth(reboundDeltaForElasticDelta(stretchAmount. width())); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 deltaX = 0; | 176 deltaX = 0; |
| 179 else | 177 else |
| 180 deltaY = 0; | 178 deltaY = 0; |
| 181 | 179 |
| 182 bool shouldStretch = false; | 180 bool shouldStretch = false; |
| 183 | 181 |
| 184 PlatformWheelEventPhase momentumPhase = wheelEvent.momentumPhase(); | 182 PlatformWheelEventPhase momentumPhase = wheelEvent.momentumPhase(); |
| 185 | 183 |
| 186 // If we are starting momentum scrolling then do some setup. | 184 // If we are starting momentum scrolling then do some setup. |
| 187 if (!m_momentumScrollInProgress && (momentumPhase == PlatformWheelEventPhase Began || momentumPhase == PlatformWheelEventPhaseChanged)) { | 185 if (!m_momentumScrollInProgress && (momentumPhase == PlatformWheelEventPhase Began || momentumPhase == PlatformWheelEventPhaseChanged)) { |
| 186 if (!shouldStartRubberBanding(wheelEvent)) | |
| 187 return false; | |
| 188 | |
| 188 m_momentumScrollInProgress = true; | 189 m_momentumScrollInProgress = true; |
| 189 // Start the snap rubber band timer if it's not running. This is needed to | 190 // Start the snap rubber band timer if it's not running. This is needed to |
| 190 // snap back from the over scroll caused by momentum events. | 191 // snap back from the over scroll caused by momentum events. |
| 191 if (!m_snapRubberbandTimerIsActive && m_startTime == 0) | 192 if (!m_snapRubberbandTimerIsActive && m_startTime == 0) |
| 192 snapRubberBand(); | 193 snapRubberBand(); |
| 193 } | 194 } |
| 194 | 195 |
| 195 CFTimeInterval timeDelta = wheelEvent.timestamp() - m_lastMomentumScrollTime stamp; | 196 CFTimeInterval timeDelta = wheelEvent.timestamp() - m_lastMomentumScrollTime stamp; |
| 196 if (m_inScrollGesture || m_momentumScrollInProgress) { | 197 if (m_inScrollGesture || m_momentumScrollInProgress) { |
| 197 if (m_lastMomentumScrollTimestamp && timeDelta > 0 && timeDelta < scroll VelocityZeroingTimeout) { | 198 if (m_lastMomentumScrollTimestamp && timeDelta > 0 && timeDelta < scroll VelocityZeroingTimeout) { |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 406 m_startTime = 0; | 407 m_startTime = 0; |
| 407 m_stretchScrollForce = FloatSize(); | 408 m_stretchScrollForce = FloatSize(); |
| 408 return; | 409 return; |
| 409 } | 410 } |
| 410 | 411 |
| 411 m_startTime = [NSDate timeIntervalSinceReferenceDate]; | 412 m_startTime = [NSDate timeIntervalSinceReferenceDate]; |
| 412 m_client->startSnapRubberbandTimer(); | 413 m_client->startSnapRubberbandTimer(); |
| 413 m_snapRubberbandTimerIsActive = true; | 414 m_snapRubberbandTimerIsActive = true; |
| 414 } | 415 } |
| 415 | 416 |
| 416 bool ScrollElasticityController::shouldRubberBandInHorizontalDirection(const Pla tformWheelEvent& wheelEvent) | 417 bool ScrollElasticityController::shouldStartRubberBanding(const PlatformWheelEve nt& wheelEvent) |
| 417 { | 418 { |
| 418 if (wheelEvent.deltaX() > 0) | 419 if (wheelEvent.deltaX() > 0) { |
| 419 return m_client->shouldRubberBandInDirection(ScrollLeft); | 420 if (!wheelEvent.canRubberbandLeft()) |
| 420 if (wheelEvent.deltaX() < 0) | 421 return false; |
| 421 return m_client->shouldRubberBandInDirection(ScrollRight); | 422 if (m_client->pinnedInDirection(FloatSize(-wheelEvent.deltaX(), 0)) && ! m_client->shouldRubberBandInDirection(ScrollLeft)) |
|
Alexei Svitkine (slow)
2014/03/20 18:38:09
Could the pinnedInDirection() check be made inside
erikchen
2014/03/24 22:12:04
I've reworked the logic of this method to be much
| |
| 423 return false; | |
| 424 return true; | |
| 425 } | |
| 426 if (wheelEvent.deltaX() < 0) { | |
| 427 if (!wheelEvent.canRubberbandRight()) | |
| 428 return false; | |
| 429 if (m_client->pinnedInDirection(FloatSize(-wheelEvent.deltaX(), 0)) && ! m_client->shouldRubberBandInDirection(ScrollRight)) | |
| 430 return false; | |
| 431 return true; | |
| 432 } | |
| 422 | 433 |
| 423 return true; | 434 return true; |
| 424 } | 435 } |
| 425 | 436 |
| 426 } // namespace WebCore | 437 } // namespace WebCore |
| 427 | 438 |
| 428 #endif // USE(RUBBER_BANDING) | 439 #endif // USE(RUBBER_BANDING) |
| OLD | NEW |