Changeset 117129 in webkit


Ignore:
Timestamp:
May 15, 2012 1:02:47 PM (12 years ago)
Author:
andersca@apple.com
Message:

Use unaccelerated scrolling deltas when rubber-banding
https://bugs.webkit.org/show_bug.cgi?id=86503
<rdar://problem/11378742>

Reviewed by Sam Weinig.

Source/WebCore:

  • WebCore.exp.in:
  • platform/PlatformWheelEvent.h:

(WebCore::PlatformWheelEvent::PlatformWheelEvent):
(PlatformWheelEvent):
(WebCore::PlatformWheelEvent::scrollCount):
(WebCore::PlatformWheelEvent::unacceleratedScrollingDeltaX):
(WebCore::PlatformWheelEvent::unacceleratedScrollingDeltaY):
Add scroll count and unaccelerated scrolling deltas.

  • platform/mac/ScrollElasticityController.mm:

(WebCore::elasticDeltaForTimeDelta):
(WebCore::elasticDeltaForReboundDelta):
(WebCore::reboundDeltaForElasticDelta):
Call the new WKSI functions.

(WebCore::ScrollElasticityController::handleWheelEvent):
Use the unaccelerated scrolling deltas when needed.

  • platform/mac/WebCoreSystemInterface.h:
  • platform/mac/WebCoreSystemInterface.mm:

Add new WKSI functions.

Source/WebKit/mac:

  • WebCoreSupport/WebSystemInterface.mm:

(InitWebCoreSystemInterface):
Init new WKSI functions.

Source/WebKit2:

  • Shared/WebEvent.h:

(WebWheelEvent):
(WebKit::WebWheelEvent::scrollCount):
(WebKit::WebWheelEvent::unacceleratedScrollingDelta):
Add scroll count and unaccelerated scrolling delta.

  • Shared/WebEventConversion.cpp:

(WebKit::WebKit2PlatformWheelEvent::WebKit2PlatformWheelEvent):
Initialize scroll count and unaccelerated scrolling deltas.

  • Shared/WebWheelEvent.cpp:

(WebKit::WebWheelEvent::WebWheelEvent):
Initialize scroll count and unaccelerated scrolling deltas.

(WebKit::WebWheelEvent::encode):
(WebKit::WebWheelEvent::decode):
Encode and decode scroll count and unaccelerated scrolling deltas.

  • Shared/mac/WebEventFactory.mm:

(WebKit::WebEventFactory::createWebWheelEvent):
Initialize the scroll count and unaccelerated scrolling deltas from the underlying NSEvent.

  • UIProcess/WebPageProxy.cpp:

(WebKit::coalesce):
Coalesce unaccelerated scrolling deltas as well.

  • WebProcess/WebCoreSupport/mac/WebSystemInterface.mm:

(InitWebCoreSystemInterface):
Init new WKSI functions.

Location:
trunk/Source
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r117128 r117129  
     12012-05-15  Anders Carlsson  <andersca@apple.com>
     2
     3        Use unaccelerated scrolling deltas when rubber-banding
     4        https://bugs.webkit.org/show_bug.cgi?id=86503
     5        <rdar://problem/11378742>
     6
     7        Reviewed by Sam Weinig.
     8
     9        * WebCore.exp.in:
     10        * platform/PlatformWheelEvent.h:
     11        (WebCore::PlatformWheelEvent::PlatformWheelEvent):
     12        (PlatformWheelEvent):
     13        (WebCore::PlatformWheelEvent::scrollCount):
     14        (WebCore::PlatformWheelEvent::unacceleratedScrollingDeltaX):
     15        (WebCore::PlatformWheelEvent::unacceleratedScrollingDeltaY):
     16        Add scroll count and unaccelerated scrolling deltas.
     17
     18        * platform/mac/ScrollElasticityController.mm:
     19        (WebCore::elasticDeltaForTimeDelta):
     20        (WebCore::elasticDeltaForReboundDelta):
     21        (WebCore::reboundDeltaForElasticDelta):
     22        Call the new WKSI functions.
     23
     24        (WebCore::ScrollElasticityController::handleWheelEvent):
     25        Use the unaccelerated scrolling deltas when needed.
     26
     27        * platform/mac/WebCoreSystemInterface.h:
     28        * platform/mac/WebCoreSystemInterface.mm:
     29        Add new WKSI functions.
     30
    1312012-05-15  Terry Anderson  <tdanderson@chromium.org>
    232
  • trunk/Source/WebCore/WebCore.exp.in

    r117041 r117129  
    16941694_wkFilterAddData
    16951695_wkFilterDataComplete
     1696_wkNSElasticDeltaForTimeDelta
     1697_wkNSElasticDeltaForReboundDelta
     1698_wkNSReboundDeltaForElasticDelta
    16961699#endif
    16971700
  • trunk/Source/WebCore/platform/PlatformWheelEvent.h

    r110371 r117129  
    9595            , m_phase(PlatformWheelEventPhaseNone)
    9696            , m_momentumPhase(PlatformWheelEventPhaseNone)
     97            , m_scrollCount(0)
     98            , m_unacceleratedScrollingDeltaX(0)
     99            , m_unacceleratedScrollingDeltaY(0)
    97100#endif
    98101        {
     
    113116            , m_phase(PlatformWheelEventPhaseNone)
    114117            , m_momentumPhase(PlatformWheelEventPhaseNone)
     118            , m_scrollCount(0)
     119            , m_unacceleratedScrollingDeltaX(0)
     120            , m_unacceleratedScrollingDeltaY(0)
    115121#endif
    116122        {
     
    154160        PlatformWheelEventPhase momentumPhase() const { return m_momentumPhase; }
    155161        bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; }
     162
     163        unsigned scrollCount() const { return m_scrollCount; }
     164        float unacceleratedScrollingDeltaX() const { return m_unacceleratedScrollingDeltaX; }
     165        float unacceleratedScrollingDeltaY() const { return m_unacceleratedScrollingDeltaY; }
    156166#endif
    157167
     
    182192        PlatformWheelEventPhase m_phase;
    183193        PlatformWheelEventPhase m_momentumPhase;
     194        unsigned m_scrollCount;
     195        float m_unacceleratedScrollingDeltaX;
     196        float m_unacceleratedScrollingDeltaY;
    184197#endif
    185198    };
  • trunk/Source/WebCore/platform/mac/ScrollElasticityController.mm

    r111102 r117129  
    2828
    2929#include "PlatformWheelEvent.h"
     30#include "WebCoreSystemInterface.h"
    3031#include <sys/time.h>
    3132#include <sys/sysctl.h>
     
    6869
    6970static const float scrollVelocityZeroingTimeout = 0.10f;
    70 static const float rubberbandStiffness = 20;
    7171static const float rubberbandDirectionLockStretchRatio = 1;
    7272static const float rubberbandMinimumRequiredDeltaBeforeStretch = 10;
     73
     74#if defined(BUILDING_ON_LEOPARD) || defined(BULDING_ON_SNOW_LEOPARD) || defined(BUILDING_ON_LION)
     75static const float rubberbandStiffness = 20;
    7376static const float rubberbandAmplitude = 0.31f;
    7477static const float rubberbandPeriod = 1.6f;
     
    9396    return delta * rubberbandStiffness;
    9497}
     98#else
     99static float elasticDeltaForTimeDelta(float initialPosition, float initialVelocity, float elapsedTime)
     100{
     101    return wkNSElasticDeltaForTimeDelta(initialPosition, initialVelocity, elapsedTime);
     102}
     103
     104static float elasticDeltaForReboundDelta(float delta)
     105{
     106    return wkNSElasticDeltaForReboundDelta(delta);
     107}
     108
     109static float reboundDeltaForElasticDelta(float delta)
     110{
     111    return wkNSReboundDeltaForElasticDelta(delta);
     112}
     113#endif
    95114
    96115static float scrollWheelMultiplier()
     
    160179    m_overflowScrollDelta = FloatSize();
    161180
    162     float eventCoalescedDeltaX = -wheelEvent.deltaX();
    163     float eventCoalescedDeltaY = -wheelEvent.deltaY();
     181    IntSize stretchAmount = m_client->stretchAmount();
     182    bool isVerticallyStretched = stretchAmount.height();
     183    bool isHorizontallyStretched = stretchAmount.width();
     184
     185    float eventCoalescedDeltaX;
     186    float eventCoalescedDeltaY;
     187
     188    if (isVerticallyStretched || isHorizontallyStretched) {
     189        eventCoalescedDeltaX = -wheelEvent.unacceleratedScrollingDeltaX();
     190        eventCoalescedDeltaY = -wheelEvent.unacceleratedScrollingDeltaY();
     191    } else {
     192        eventCoalescedDeltaX = -wheelEvent.deltaX();
     193        eventCoalescedDeltaY = -wheelEvent.deltaY();
     194    }
    164195
    165196    deltaX += eventCoalescedDeltaX;
     
    172203        deltaY = 0;
    173204
    174     bool isVerticallyStretched = false;
    175     bool isHorizontallyStretched = false;
    176205    bool shouldStretch = false;
    177 
    178     IntSize stretchAmount = m_client->stretchAmount();
    179 
    180     isHorizontallyStretched = stretchAmount.width();
    181     isVerticallyStretched = stretchAmount.height();
    182206
    183207    PlatformWheelEventPhase momentumPhase = wheelEvent.momentumPhase();
  • trunk/Source/WebCore/platform/mac/WebCoreSystemInterface.h

    r116493 r117129  
    324324extern const char* (*wkFilterAddData)(WebFilterEvaluator *, const char* data, int* length);
    325325extern const char* (*wkFilterDataComplete)(WebFilterEvaluator *, int* length);
     326
     327extern CGFloat (*wkNSElasticDeltaForTimeDelta)(CGFloat initialPosition, CGFloat initialVelocity, CGFloat elapsedTime);
     328extern CGFloat (*wkNSElasticDeltaForReboundDelta)(CGFloat delta);
     329extern CGFloat (*wkNSReboundDeltaForElasticDelta)(CGFloat delta);
    326330#endif
    327331
  • trunk/Source/WebCore/platform/mac/WebCoreSystemInterface.mm

    r116473 r117129  
    203203const char* (*wkFilterAddData)(WebFilterEvaluator *, const char* data, int* length);
    204204const char* (*wkFilterDataComplete)(WebFilterEvaluator *, int* length);
    205 #endif
     205
     206CGFloat (*wkNSElasticDeltaForTimeDelta)(CGFloat initialPosition, CGFloat initialVelocity, CGFloat elapsedTime);
     207CGFloat (*wkNSElasticDeltaForReboundDelta)(CGFloat delta);
     208CGFloat (*wkNSReboundDeltaForElasticDelta)(CGFloat delta);
     209#endif
     210
  • trunk/Source/WebKit/mac/ChangeLog

    r117028 r117129  
     12012-05-15  Anders Carlsson  <andersca@apple.com>
     2
     3        Use unaccelerated scrolling deltas when rubber-banding
     4        https://bugs.webkit.org/show_bug.cgi?id=86503
     5        <rdar://problem/11378742>
     6
     7        Reviewed by Sam Weinig.
     8
     9        * WebCoreSupport/WebSystemInterface.mm:
     10        (InitWebCoreSystemInterface):
     11        Init new WKSI functions.
     12
    1132012-05-14  Luke Macpherson  <macpherson@chromium.org>
    214
  • trunk/Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm

    r116479 r117129  
    199199    INIT(FilterAddData);
    200200    INIT(FilterDataComplete);
    201 #endif
     201
     202    INIT(NSElasticDeltaForTimeDelta);
     203    INIT(NSElasticDeltaForReboundDelta);
     204    INIT(NSReboundDeltaForElasticDelta);
     205#endif
     206
    202207#endif
    203208    didInit = true;
  • trunk/Source/WebKit2/ChangeLog

    r117125 r117129  
     12012-05-15  Anders Carlsson  <andersca@apple.com>
     2
     3        Use unaccelerated scrolling deltas when rubber-banding
     4        https://bugs.webkit.org/show_bug.cgi?id=86503
     5        <rdar://problem/11378742>
     6
     7        Reviewed by Sam Weinig.
     8
     9        * Shared/WebEvent.h:
     10        (WebWheelEvent):
     11        (WebKit::WebWheelEvent::scrollCount):
     12        (WebKit::WebWheelEvent::unacceleratedScrollingDelta):
     13        Add scroll count and unaccelerated scrolling delta.
     14
     15        * Shared/WebEventConversion.cpp:
     16        (WebKit::WebKit2PlatformWheelEvent::WebKit2PlatformWheelEvent):
     17        Initialize scroll count and unaccelerated scrolling deltas.
     18
     19        * Shared/WebWheelEvent.cpp:
     20        (WebKit::WebWheelEvent::WebWheelEvent):
     21        Initialize scroll count and unaccelerated scrolling deltas.
     22
     23        (WebKit::WebWheelEvent::encode):
     24        (WebKit::WebWheelEvent::decode):
     25        Encode and decode scroll count and unaccelerated scrolling deltas.
     26
     27        * Shared/mac/WebEventFactory.mm:
     28        (WebKit::WebEventFactory::createWebWheelEvent):
     29        Initialize the scroll count and unaccelerated scrolling deltas from the underlying NSEvent.
     30
     31        * UIProcess/WebPageProxy.cpp:
     32        (WebKit::coalesce):
     33        Coalesce unaccelerated scrolling deltas as well.
     34
     35        * WebProcess/WebCoreSupport/mac/WebSystemInterface.mm:
     36        (InitWebCoreSystemInterface):
     37        Init new WKSI functions.
     38
    1392012-05-15  Sheriff Bot  <webkit.review.bot@gmail.com>
    240
  • trunk/Source/WebKit2/Shared/WebEvent.h

    r106949 r117129  
    183183    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Modifiers, double timestamp);
    184184#if PLATFORM(MAC)
    185     WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, Modifiers, double timestamp, bool directionInvertedFromDevice);
     185    WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, bool directionInvertedFromDevice, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers, double timestamp);
    186186#endif
    187187
     
    196196    Phase momentumPhase() const { return static_cast<Phase>(m_momentumPhase); }
    197197    bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; }
     198    uint32_t scrollCount() const { return m_scrollCount; }
     199    const WebCore::FloatSize& unacceleratedScrollingDelta() const { return m_unacceleratedScrollingDelta; }
    198200#endif
    199201
     
    214216    uint32_t m_momentumPhase; // Phase
    215217    bool m_hasPreciseScrollingDeltas;
     218    uint32_t m_scrollCount;
     219    WebCore::FloatSize m_unacceleratedScrollingDelta;
    216220#endif
    217221};
  • trunk/Source/WebKit2/Shared/WebEventConversion.cpp

    r106949 r117129  
    137137        m_momentumPhase = static_cast<WebCore::PlatformWheelEventPhase>(webEvent.momentumPhase());
    138138        m_hasPreciseScrollingDeltas = webEvent.hasPreciseScrollingDeltas();
     139        m_scrollCount = webEvent.scrollCount();
     140        m_unacceleratedScrollingDeltaX = webEvent.unacceleratedScrollingDelta().width();
     141        m_unacceleratedScrollingDeltaY = webEvent.unacceleratedScrollingDelta().height();
    139142#endif
    140143    }
  • trunk/Source/WebKit2/Shared/WebWheelEvent.cpp

    r96613 r117129  
    4545    , m_phase(PhaseNone)
    4646    , m_hasPreciseScrollingDeltas(false)
     47    , m_scrollCount(0)
    4748#endif
    4849{
     
    5152
    5253#if PLATFORM(MAC)
    53 WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, Phase phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, Modifiers modifiers, double timestamp, bool directionInvertedFromDevice)
     54WebWheelEvent::WebWheelEvent(Type type, const IntPoint& position, const IntPoint& globalPosition, const FloatSize& delta, const FloatSize& wheelTicks, Granularity granularity, bool directionInvertedFromDevice, Phase phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers modifiers, double timestamp)
    5455    : WebEvent(type, modifiers, timestamp)
    5556    , m_position(position)
     
    6263    , m_momentumPhase(momentumPhase)
    6364    , m_hasPreciseScrollingDeltas(hasPreciseScrollingDeltas)
     65    , m_scrollCount(scrollCount)
     66    , m_unacceleratedScrollingDelta(unacceleratedScrollingDelta)
    6467{
    6568    ASSERT(isWheelEventType(type));
     
    8184    encoder->encode(m_momentumPhase);
    8285    encoder->encode(m_hasPreciseScrollingDeltas);
     86    encoder->encode(m_scrollCount);
     87    encoder->encode(m_unacceleratedScrollingDelta);
    8388#endif
    8489}
     
    107112    if (!decoder->decode(t.m_hasPreciseScrollingDeltas))
    108113        return false;
     114    if (!decoder->decode(t.m_scrollCount))
     115        return false;
     116    if (!decoder->decode(t.m_unacceleratedScrollingDelta))
     117        return false;
    109118#endif
    110119    return true;
  • trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm

    r117085 r117129  
    3636
    3737using namespace WebCore;
     38
     39@interface NSEvent (WebNSEventDetails)
     40- (NSInteger)_scrollCount;
     41- (CGFloat)_unacceleratedScrollingDeltaX;
     42- (CGFloat)_unacceleratedScrollingDeltaY;
     43@end
    3844
    3945namespace WebKit {
     
    388394    NSPoint globalPosition = globalPointForEvent(event);
    389395
    390     WebWheelEvent::Granularity granularity  = WebWheelEvent::ScrollByPixelWheelEvent;
    391 
    392396    BOOL continuous;
    393397    float deltaX = 0;
     
    410414    }
    411415
    412     WebWheelEvent::Phase phase              = phaseForEvent(event);
    413     WebWheelEvent::Phase momentumPhase      = momentumPhaseForEvent(event);
    414     bool hasPreciseScrollingDeltas          = continuous;
    415     WebEvent::Modifiers modifiers           = modifiersForEvent(event);
    416     double timestamp                        = [event timestamp];
     416    WebWheelEvent::Granularity granularity  = WebWheelEvent::ScrollByPixelWheelEvent;
     417
    417418#if HAVE(INVERTED_WHEEL_EVENTS)
    418419    bool directionInvertedFromDevice        = [event isDirectionInvertedFromDevice];
     
    420421    bool directionInvertedFromDevice        = false;
    421422#endif
    422     return WebWheelEvent(WebEvent::Wheel, IntPoint(position), IntPoint(globalPosition), FloatSize(deltaX, deltaY), FloatSize(wheelTicksX, wheelTicksY), granularity, phase, momentumPhase, hasPreciseScrollingDeltas, modifiers, timestamp, directionInvertedFromDevice);
     423
     424    WebWheelEvent::Phase phase              = phaseForEvent(event);
     425    WebWheelEvent::Phase momentumPhase      = momentumPhaseForEvent(event);
     426    bool hasPreciseScrollingDeltas          = continuous;
     427
     428    uint32_t scrollCount;
     429    FloatSize unacceleratedScrollingDelta;
     430
     431    static bool nsEventSupportsScrollCount = [NSEvent instancesRespondToSelector:@selector(_scrollCount)];
     432    if (nsEventSupportsScrollCount) {
     433        scrollCount = [event _scrollCount];
     434        unacceleratedScrollingDelta = FloatSize([event _unacceleratedScrollingDeltaX], [event _unacceleratedScrollingDeltaY]);
     435    } else {
     436        scrollCount = 0;
     437        unacceleratedScrollingDelta = FloatSize(deltaX, deltaY);
     438    }
     439
     440    WebEvent::Modifiers modifiers           = modifiersForEvent(event);
     441    double timestamp                        = [event timestamp];
     442   
     443    return WebWheelEvent(WebEvent::Wheel, IntPoint(position), IntPoint(globalPosition), FloatSize(deltaX, deltaY), FloatSize(wheelTicksX, wheelTicksY), granularity, directionInvertedFromDevice, phase, momentumPhase, hasPreciseScrollingDeltas, scrollCount, unacceleratedScrollingDelta, modifiers, timestamp);
    423444}
    424445
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r116993 r117129  
    10221022
    10231023#if PLATFORM(MAC)
    1024     return WebWheelEvent(WebEvent::Wheel, b.position(), b.globalPosition(), mergedDelta, mergedWheelTicks, b.granularity(), b.phase(), b.momentumPhase(), b.hasPreciseScrollingDeltas(), b.modifiers(), b.timestamp(), b.directionInvertedFromDevice());
     1024    FloatSize mergedUnacceleratedScrollingDelta = a.unacceleratedScrollingDelta() + b.unacceleratedScrollingDelta();
     1025
     1026    return WebWheelEvent(WebEvent::Wheel, b.position(), b.globalPosition(), mergedDelta, mergedWheelTicks, b.granularity(), b.directionInvertedFromDevice(), b.phase(), b.momentumPhase(), b.hasPreciseScrollingDeltas(), b.scrollCount(), mergedUnacceleratedScrollingDelta, b.modifiers(), b.timestamp());
    10251027#else
    10261028    return WebWheelEvent(WebEvent::Wheel, b.position(), b.globalPosition(), mergedDelta, mergedWheelTicks, b.granularity(), b.modifiers(), b.timestamp());
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebSystemInterface.mm

    r116473 r117129  
    182182        INIT(FilterAddData);
    183183        INIT(FilterDataComplete);
     184
     185        INIT(NSElasticDeltaForTimeDelta);
     186        INIT(NSElasticDeltaForReboundDelta);
     187        INIT(NSReboundDeltaForElasticDelta);
    184188#endif
    185189
Note: See TracChangeset for help on using the changeset viewer.