Diff
Modified: trunk/Source/WebCore/ChangeLog (96643 => 96644)
--- trunk/Source/WebCore/ChangeLog 2011-10-04 21:16:56 UTC (rev 96643)
+++ trunk/Source/WebCore/ChangeLog 2011-10-04 21:18:53 UTC (rev 96644)
@@ -1,3 +1,26 @@
+2011-10-04 Anders Carlsson <[email protected]>
+
+ Add a ScrollElasticityController class and move some members over from ScrollAnimatorMac
+ https://bugs.webkit.org/show_bug.cgi?id=69373
+
+ Reviewed by David Hyatt.
+
+ ScrollElasticityController is a new class that will handle the rubber-banding when handling scroll events.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/mac/ScrollAnimatorMac.h:
+ * platform/mac/ScrollAnimatorMac.mm:
+ (WebCore::ScrollAnimatorMac::ScrollAnimatorMac):
+ (WebCore::ScrollAnimatorMac::handleWheelEvent):
+ (WebCore::ScrollAnimatorMac::smoothScrollWithEvent):
+ (WebCore::ScrollAnimatorMac::beginScrollGesture):
+ (WebCore::ScrollAnimatorMac::snapRubberBand):
+ (WebCore::ScrollAnimatorMac::snapRubberBandTimerFired):
+ * platform/mac/ScrollElasticityController.h: Added.
+ (WebCore::ScrollElasticityControllerClient::~ScrollElasticityControllerClient):
+ * platform/mac/ScrollElasticityController.mm: Added.
+ (WebCore::ScrollElasticityController::ScrollElasticityController):
+
2011-10-04 David Hyatt <[email protected]>
https://bugs.webkit.org/show_bug.cgi?id=69372
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (96643 => 96644)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2011-10-04 21:16:56 UTC (rev 96643)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2011-10-04 21:18:53 UTC (rev 96644)
@@ -443,6 +443,8 @@
1A927FD31416A15B003A83C8 /* npruntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A927FD01416A15B003A83C8 /* npruntime.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A927FD41416A15B003A83C8 /* nptypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A927FD11416A15B003A83C8 /* nptypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A98956B0AA78F80005EF5EF /* KURLCFNet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A98956A0AA78F80005EF5EF /* KURLCFNet.cpp */; };
+ 1AA84F04143BA7BD0051D153 /* ScrollElasticityController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1AA84F02143BA7BD0051D153 /* ScrollElasticityController.mm */; };
+ 1AA84F05143BA7BD0051D153 /* ScrollElasticityController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AA84F03143BA7BD0051D153 /* ScrollElasticityController.h */; };
1AA8799011CBE846003C664F /* PluginStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AA8798F11CBE846003C664F /* PluginStrategy.h */; settings = {ATTRIBUTES = (Private, ); }; };
1AB1AE7A0C051FDE00139F4F /* zoomInCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 1AB1AE780C051FDE00139F4F /* zoomInCursor.png */; };
1AB1AE7B0C051FDE00139F4F /* zoomOutCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 1AB1AE790C051FDE00139F4F /* zoomOutCursor.png */; };
@@ -6985,6 +6987,8 @@
1A927FD01416A15B003A83C8 /* npruntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = npruntime.h; sourceTree = "<group>"; };
1A927FD11416A15B003A83C8 /* nptypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nptypes.h; sourceTree = "<group>"; };
1A98956A0AA78F80005EF5EF /* KURLCFNet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = KURLCFNet.cpp; sourceTree = "<group>"; };
+ 1AA84F02143BA7BD0051D153 /* ScrollElasticityController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollElasticityController.mm; sourceTree = "<group>"; };
+ 1AA84F03143BA7BD0051D153 /* ScrollElasticityController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollElasticityController.h; sourceTree = "<group>"; };
1AA8798F11CBE846003C664F /* PluginStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginStrategy.h; sourceTree = "<group>"; };
1AB1AE780C051FDE00139F4F /* zoomInCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zoomInCursor.png; sourceTree = "<group>"; };
1AB1AE790C051FDE00139F4F /* zoomOutCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zoomOutCursor.png; sourceTree = "<group>"; };
@@ -14601,6 +14605,8 @@
1CE24F960D7CAF0E007E04C2 /* SchedulePairMac.mm */,
BCAE1FA512939DB7004CB026 /* ScrollAnimatorMac.h */,
BC51156D12B1749C00C96754 /* ScrollAnimatorMac.mm */,
+ 1AA84F03143BA7BD0051D153 /* ScrollElasticityController.h */,
+ 1AA84F02143BA7BD0051D153 /* ScrollElasticityController.mm */,
BC8B853C0E7C7F1100AB6984 /* ScrollbarThemeMac.h */,
BCEF869E0E844E9D00A85CD5 /* ScrollbarThemeMac.mm */,
9353676A09AED88B00D35CD6 /* ScrollViewMac.mm */,
@@ -23548,6 +23554,7 @@
0FE71406142170B800DB33BA /* ScrollbarThemeMock.h in Headers */,
BCEB179C143379F50052EAE9 /* RenderBoxRegionInfo.h in Headers */,
59102FBC14327D3B003C9D04 /* ContentSearchUtils.h in Headers */,
+ 1AA84F05143BA7BD0051D153 /* ScrollElasticityController.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -26388,6 +26395,7 @@
319AE063142D6B24006563A1 /* StyleFilterData.cpp in Sources */,
319AE069142D78DD006563A1 /* FilterOperations.cpp in Sources */,
59102FBB14327D3B003C9D04 /* ContentSearchUtils.cpp in Sources */,
+ 1AA84F04143BA7BD0051D153 /* ScrollElasticityController.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.h (96643 => 96644)
--- trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.h 2011-10-04 21:16:56 UTC (rev 96643)
+++ trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.h 2011-10-04 21:18:53 UTC (rev 96644)
@@ -32,6 +32,7 @@
#include "FloatPoint.h"
#include "FloatSize.h"
#include "ScrollAnimator.h"
+#include "ScrollElasticityController.h"
#include "Timer.h"
#include <wtf/RetainPtr.h>
@@ -49,11 +50,16 @@
typedef id ScrollbarPainterController;
#endif
+#if !ENABLE(RUBBER_BANDING)
+class ScrollElasticityControllerClient { };
+#endif
+
namespace WebCore {
class Scrollbar;
-class ScrollAnimatorMac : public ScrollAnimator {
+class ScrollAnimatorMac : public ScrollAnimator, private ScrollElasticityControllerClient {
+
public:
ScrollAnimatorMac(ScrollableArea*);
virtual ~ScrollAnimatorMac();
@@ -141,11 +147,8 @@
void beginScrollGesture();
void endScrollGesture();
- bool m_inScrollGesture;
- bool m_momentumScrollInProgress;
- bool m_ignoreMomentumScrolls;
- bool m_scrollerInitiallyPinnedOnLeft;
- bool m_scrollerInitiallyPinnedOnRight;
+ ScrollElasticityController m_scrollElasticityController;
+
int m_cumulativeHorizontalScroll;
bool m_didCumulativeHorizontalScrollEverSwitchToOppositeDirectionOfPin;
Modified: trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm (96643 => 96644)
--- trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm 2011-10-04 21:16:56 UTC (rev 96643)
+++ trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm 2011-10-04 21:18:53 UTC (rev 96644)
@@ -458,9 +458,7 @@
, m_initialScrollbarPaintTimer(this, &ScrollAnimatorMac::initialScrollbarPaintTimerFired)
#endif
#if ENABLE(RUBBER_BANDING)
- , m_inScrollGesture(false)
- , m_momentumScrollInProgress(false)
- , m_ignoreMomentumScrolls(false)
+ , m_scrollElasticityController(this)
, m_lastMomentumScrollTimestamp(0)
, m_startTime(0)
, m_snapRubberBandTimer(this, &ScrollAnimatorMac::snapRubberBandTimerFired)
@@ -818,9 +816,9 @@
// boolean, and rubber band. That is, if we were pinned to the left,
// and we ended up scrolling to the right, we rubber band.
m_cumulativeHorizontalScroll += wheelEvent.deltaX();
- if (m_scrollerInitiallyPinnedOnLeft && m_cumulativeHorizontalScroll < 0)
+ if (m_scrollElasticityController.m_scrollerInitiallyPinnedOnLeft && m_cumulativeHorizontalScroll < 0)
m_didCumulativeHorizontalScrollEverSwitchToOppositeDirectionOfPin = true;
- if (m_scrollerInitiallyPinnedOnRight && m_cumulativeHorizontalScroll > 0)
+ if (m_scrollElasticityController.m_scrollerInitiallyPinnedOnRight && m_cumulativeHorizontalScroll > 0)
m_didCumulativeHorizontalScrollEverSwitchToOppositeDirectionOfPin = true;
}
@@ -830,10 +828,10 @@
// 1 PlatformWheelEventPhaseEnded if there was at least one changed event
if (wheelEvent.momentumPhase() == PlatformWheelEventPhaseNone && !m_didCumulativeHorizontalScrollEverSwitchToOppositeDirectionOfPin) {
if ((isScrollingLeftAndShouldNotRubberBand(wheelEvent, m_scrollableArea) &&
- m_scrollerInitiallyPinnedOnLeft &&
+ m_scrollElasticityController.m_scrollerInitiallyPinnedOnLeft &&
m_scrollableArea->isHorizontalScrollerPinnedToMinimumPosition()) ||
(isScrollingRightAndShouldNotRubberBand(wheelEvent, m_scrollableArea) &&
- m_scrollerInitiallyPinnedOnRight &&
+ m_scrollElasticityController.m_scrollerInitiallyPinnedOnRight &&
m_scrollableArea->isHorizontalScrollerPinnedToMaximumPosition())) {
return ScrollAnimator::handleWheelEvent(wheelEvent);
}
@@ -841,9 +839,9 @@
}
bool isMomentumScrollEvent = (wheelEvent.momentumPhase() != PlatformWheelEventPhaseNone);
- if (m_ignoreMomentumScrolls && (isMomentumScrollEvent || m_snapRubberBandTimer.isActive())) {
+ if (m_scrollElasticityController.m_ignoreMomentumScrolls && (isMomentumScrollEvent || m_snapRubberBandTimer.isActive())) {
if (wheelEvent.momentumPhase() == PlatformWheelEventPhaseEnded) {
- m_ignoreMomentumScrolls = false;
+ m_scrollElasticityController.m_ignoreMomentumScrolls = false;
return true;
}
return false;
@@ -957,11 +955,11 @@
PlatformWheelEventPhase phase = wheelEvent.momentumPhase();
// If we are starting momentum scrolling then do some setup.
- if (!m_momentumScrollInProgress && (phase == PlatformWheelEventPhaseBegan || phase == PlatformWheelEventPhaseChanged))
- m_momentumScrollInProgress = true;
+ if (!m_scrollElasticityController.m_momentumScrollInProgress && (phase == PlatformWheelEventPhaseBegan || phase == PlatformWheelEventPhaseChanged))
+ m_scrollElasticityController.m_momentumScrollInProgress = true;
CFTimeInterval timeDelta = wheelEvent.timestamp() - m_lastMomentumScrollTimestamp;
- if (m_inScrollGesture || m_momentumScrollInProgress) {
+ if (m_scrollElasticityController.m_inScrollGesture || m_scrollElasticityController.m_momentumScrollInProgress) {
if (m_lastMomentumScrollTimestamp && timeDelta > 0 && timeDelta < scrollVelocityZeroingTimeout) {
m_momentumVelocity.setWidth(eventCoalescedDeltaX / (float)timeDelta);
m_momentumVelocity.setHeight(eventCoalescedDeltaY / (float)timeDelta);
@@ -1047,10 +1045,10 @@
IntSize stretchAmount = m_scrollableArea->overhangAmount();
- if (m_momentumScrollInProgress) {
+ if (m_scrollElasticityController.m_momentumScrollInProgress) {
if ((pinnedInDirection(eventCoalescedDeltaX, eventCoalescedDeltaY) || (fabsf(eventCoalescedDeltaX) + fabsf(eventCoalescedDeltaY) <= 0)) && m_lastMomentumScrollTimestamp) {
- m_ignoreMomentumScrolls = true;
- m_momentumScrollInProgress = false;
+ m_scrollElasticityController.m_ignoreMomentumScrolls = true;
+ m_scrollElasticityController.m_momentumScrollInProgress = false;
snapRubberBand();
}
}
@@ -1070,9 +1068,9 @@
}
}
- if (m_momentumScrollInProgress && phase == PlatformWheelEventPhaseEnded) {
- m_momentumScrollInProgress = false;
- m_ignoreMomentumScrolls = false;
+ if (m_scrollElasticityController.m_momentumScrollInProgress && phase == PlatformWheelEventPhaseEnded) {
+ m_scrollElasticityController.m_momentumScrollInProgress = false;
+ m_scrollElasticityController.m_ignoreMomentumScrolls = false;
m_lastMomentumScrollTimestamp = 0;
}
}
@@ -1082,13 +1080,13 @@
didBeginScrollGesture();
m_haveScrolledSincePageLoad = true;
- m_inScrollGesture = true;
- m_momentumScrollInProgress = false;
- m_ignoreMomentumScrolls = false;
+ m_scrollElasticityController.m_inScrollGesture = true;
+ m_scrollElasticityController.m_momentumScrollInProgress = false;
+ m_scrollElasticityController.m_ignoreMomentumScrolls = false;
m_lastMomentumScrollTimestamp = 0;
m_momentumVelocity = FloatSize();
- m_scrollerInitiallyPinnedOnLeft = m_scrollableArea->isHorizontalScrollerPinnedToMinimumPosition();
- m_scrollerInitiallyPinnedOnRight = m_scrollableArea->isHorizontalScrollerPinnedToMaximumPosition();
+ m_scrollElasticityController.m_scrollerInitiallyPinnedOnLeft = m_scrollableArea->isHorizontalScrollerPinnedToMinimumPosition();
+ m_scrollElasticityController.m_scrollerInitiallyPinnedOnRight = m_scrollableArea->isHorizontalScrollerPinnedToMaximumPosition();
m_cumulativeHorizontalScroll = 0;
m_didCumulativeHorizontalScrollEverSwitchToOppositeDirectionOfPin = false;
@@ -1115,7 +1113,7 @@
if (m_lastMomentumScrollTimestamp && timeDelta >= scrollVelocityZeroingTimeout)
m_momentumVelocity = FloatSize();
- m_inScrollGesture = false;
+ m_scrollElasticityController.m_inScrollGesture = false;
if (m_snapRubberBandTimer.isActive())
return;
@@ -1144,7 +1142,7 @@
void ScrollAnimatorMac::snapRubberBandTimerFired(Timer<ScrollAnimatorMac>*)
{
- if (!m_momentumScrollInProgress || m_ignoreMomentumScrolls) {
+ if (!m_scrollElasticityController.m_momentumScrollInProgress || m_scrollElasticityController.m_ignoreMomentumScrolls) {
CFTimeInterval timeDelta = [NSDate timeIntervalSinceReferenceDate] - m_startTime;
if (m_startStretch == FloatSize()) {
Added: trunk/Source/WebCore/platform/mac/ScrollElasticityController.h (0 => 96644)
--- trunk/Source/WebCore/platform/mac/ScrollElasticityController.h (rev 0)
+++ trunk/Source/WebCore/platform/mac/ScrollElasticityController.h 2011-10-04 21:18:53 UTC (rev 96644)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ScrollElasticityController_h
+#define ScrollElasticityController_h
+
+#if ENABLE(RUBBER_BANDING)
+
+#include <wtf/Noncopyable.h>
+
+namespace WebCore {
+
+class ScrollElasticityControllerClient {
+public:
+ virtual ~ScrollElasticityControllerClient() { }
+};
+
+class ScrollElasticityController {
+ WTF_MAKE_NONCOPYABLE(ScrollElasticityController);
+
+public:
+ explicit ScrollElasticityController(ScrollElasticityControllerClient*);
+
+private:
+ ScrollElasticityControllerClient* m_client;
+
+ // FIXME: These member variables should be private. They are currently public as a stop-gap measure, while
+ // the rubber-band related code from ScrollAnimatorMac is being moved over.
+public:
+ bool m_inScrollGesture;
+ bool m_momentumScrollInProgress;
+ bool m_ignoreMomentumScrolls;
+ bool m_scrollerInitiallyPinnedOnLeft;
+ bool m_scrollerInitiallyPinnedOnRight;
+
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(RUBBER_BANDING)
+
+#endif // ScrollElasticityController_h
Added: trunk/Source/WebCore/platform/mac/ScrollElasticityController.mm (0 => 96644)
--- trunk/Source/WebCore/platform/mac/ScrollElasticityController.mm (rev 0)
+++ trunk/Source/WebCore/platform/mac/ScrollElasticityController.mm 2011-10-04 21:18:53 UTC (rev 96644)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ScrollElasticityController.h"
+
+#if ENABLE(RUBBER_BANDING)
+
+namespace WebCore {
+
+ScrollElasticityController::ScrollElasticityController(ScrollElasticityControllerClient* client)
+ : m_client(client)
+ , m_inScrollGesture(false)
+ , m_momentumScrollInProgress(false)
+ , m_ignoreMomentumScrolls(false)
+ , m_scrollerInitiallyPinnedOnLeft(false)
+ , m_scrollerInitiallyPinnedOnRight(false)
+{
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(RUBBER_BANDING)