948753836b9aa4ff2b8419ac80668de6be14e2b8
[WebKit-https.git] / Source / WebKit2 / UIProcess / mac / RemoteLayerTreeDrawingAreaProxy.h
1 /*
2  * Copyright (C) 2012-2014 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 RemoteLayerTreeDrawingAreaProxy_h
27 #define RemoteLayerTreeDrawingAreaProxy_h
28
29 #include "DrawingAreaProxy.h"
30 #include "RemoteLayerTreeHost.h"
31 #include <WebCore/FloatPoint.h>
32 #include <WebCore/IntPoint.h>
33 #include <WebCore/IntSize.h>
34 #include <WebCore/RunLoopObserver.h>
35
36 namespace WebKit {
37
38 class RemoteLayerTreeTransaction;
39 class RemoteScrollingCoordinatorTransaction;
40
41 class RemoteLayerTreeDrawingAreaProxy : public DrawingAreaProxy {
42 public:
43     explicit RemoteLayerTreeDrawingAreaProxy(WebPageProxy*);
44     virtual ~RemoteLayerTreeDrawingAreaProxy();
45
46     const RemoteLayerTreeHost& remoteLayerTreeHost() const { return m_remoteLayerTreeHost; }
47
48     void acceleratedAnimationDidStart(uint64_t layerID, const String& key, double startTime);
49
50     void coreAnimationDidCommitLayers();
51
52     uint64_t nextLayerTreeTransactionID() const { return m_pendingLayerTreeTransactionID + 1; }
53     uint64_t lastCommittedLayerTreeTransactionID() const { return m_transactionIDForPendingCACommit; }
54
55 private:
56     virtual void sizeDidChange() override;
57     virtual void deviceScaleFactorDidChange() override;
58     virtual void didUpdateGeometry() override;
59     
60     // For now, all callbacks are called before committing changes, because that's what the only client requires.
61     // Once we have other callbacks, it may make sense to have a before-commit/after-commit option.
62     virtual void dispatchAfterEnsuringDrawing(std::function<void (CallbackBase::Error)>) override;
63
64     WebCore::FloatRect scaledExposedRect() const;
65
66 #if PLATFORM(MAC)
67     virtual void setExposedRect(const WebCore::FloatRect&) override;
68 #endif
69
70     float indicatorScale(WebCore::IntSize contentsSize) const;
71     virtual void updateDebugIndicator() override;
72     void updateDebugIndicator(WebCore::IntSize contentsSize, bool rootLayerChanged, float scale);
73     void updateDebugIndicatorPosition();
74     void initializeDebugIndicator();
75
76     virtual void waitForDidUpdateViewState() override;
77     
78     WebCore::FloatPoint indicatorLocation() const;
79
80     // IPC::MessageReceiver
81     virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override;
82
83     // Message handlers
84     void willCommitLayerTree(uint64_t transactionID);
85     void commitLayerTree(const RemoteLayerTreeTransaction&, const RemoteScrollingCoordinatorTransaction&);
86     
87     void sendUpdateGeometry();
88
89     RemoteLayerTreeHost m_remoteLayerTreeHost;
90     bool m_isWaitingForDidUpdateGeometry;
91
92     WebCore::IntSize m_lastSentSize;
93     WebCore::IntSize m_lastSentLayerPosition;
94
95     std::unique_ptr<RemoteLayerTreeHost> m_debugIndicatorLayerTreeHost;
96     RetainPtr<CALayer> m_tileMapHostLayer;
97     RetainPtr<CALayer> m_exposedRectIndicatorLayer;
98
99     std::unique_ptr<WebCore::RunLoopObserver> m_layerCommitObserver;
100
101     uint64_t m_pendingLayerTreeTransactionID;
102     uint64_t m_lastVisibleTransactionID;
103     uint64_t m_transactionIDForPendingCACommit;
104
105     CallbackMap m_callbacks;
106 };
107
108 DRAWING_AREA_PROXY_TYPE_CASTS(RemoteLayerTreeDrawingAreaProxy, type() == DrawingAreaTypeRemoteLayerTree);
109
110 } // namespace WebKit
111
112 #endif // RemoteLayerTreeDrawingAreaProxy_h