1/*
2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef ScrollingTreeFrameScrollingNodeMac_h
27#define ScrollingTreeFrameScrollingNodeMac_h
28
29#if ENABLE(ASYNC_SCROLLING) && PLATFORM(MAC)
30
31#include "ScrollElasticityController.h"
32#include "ScrollbarThemeMac.h"
33#include "ScrollingTreeFrameScrollingNode.h"
34#include <wtf/RetainPtr.h>
35
36OBJC_CLASS CALayer;
37
38namespace WebCore {
39
40class ScrollingTreeFrameScrollingNodeMac : public ScrollingTreeFrameScrollingNode, private ScrollElasticityControllerClient {
41public:
42    static PassRefPtr<ScrollingTreeFrameScrollingNode> create(ScrollingTree&, ScrollingNodeID);
43    virtual ~ScrollingTreeFrameScrollingNodeMac();
44
45private:
46    ScrollingTreeFrameScrollingNodeMac(ScrollingTree&, ScrollingNodeID);
47
48    // ScrollingTreeNode member functions.
49    virtual void updateBeforeChildren(const ScrollingStateNode&) override;
50    virtual void updateAfterChildren(const ScrollingStateNode&) override;
51    virtual void handleWheelEvent(const PlatformWheelEvent&) override;
52
53    // ScrollElasticityController member functions.
54    virtual bool allowsHorizontalStretching() override;
55    virtual bool allowsVerticalStretching() override;
56    virtual IntSize stretchAmount() override;
57    virtual bool pinnedInDirection(const FloatSize&) override;
58    virtual bool canScrollHorizontally() override;
59    virtual bool canScrollVertically() override;
60    virtual bool shouldRubberBandInDirection(ScrollDirection) override;
61    virtual IntPoint absoluteScrollPosition() override;
62    virtual void immediateScrollBy(const FloatSize&) override;
63    virtual void immediateScrollByWithoutContentEdgeConstraints(const FloatSize&) override;
64    virtual void startSnapRubberbandTimer() override;
65    virtual void stopSnapRubberbandTimer() override;
66    virtual void adjustScrollPositionToBoundsIfNecessary() override;
67
68    virtual FloatPoint scrollPosition() const override;
69    virtual void setScrollPosition(const FloatPoint&) override;
70    virtual void setScrollPositionWithoutContentEdgeConstraints(const FloatPoint&) override;
71
72    virtual void updateLayersAfterViewportChange(const FloatRect& fixedPositionRect, double scale) override;
73
74    virtual void setScrollLayerPosition(const FloatPoint&) override;
75
76    virtual FloatPoint minimumScrollPosition() const override;
77    virtual FloatPoint maximumScrollPosition() const override;
78
79    void updateMainFramePinState(const FloatPoint& scrollPosition);
80
81    void logExposedUnfilledArea();
82
83    ScrollElasticityController m_scrollElasticityController;
84    RetainPtr<CFRunLoopTimerRef> m_snapRubberbandTimer;
85
86    RetainPtr<CALayer> m_scrollLayer;
87    RetainPtr<CALayer> m_scrolledContentsLayer;
88    RetainPtr<CALayer> m_counterScrollingLayer;
89    RetainPtr<CALayer> m_insetClipLayer;
90    RetainPtr<CALayer> m_contentShadowLayer;
91    RetainPtr<CALayer> m_headerLayer;
92    RetainPtr<CALayer> m_footerLayer;
93    RetainPtr<ScrollbarPainter> m_verticalScrollbarPainter;
94    RetainPtr<ScrollbarPainter> m_horizontalScrollbarPainter;
95    FloatPoint m_probableMainThreadScrollPosition;
96    bool m_lastScrollHadUnfilledPixels;
97};
98
99} // namespace WebCore
100
101#endif // ENABLE(ASYNC_SCROLLING) && PLATFORM(MAC)
102
103#endif // ScrollingTreeFrameScrollingNodeMac_h
104