Use OptionSet for layout milestones
[WebKit-https.git] / Source / WebKit / WebProcess / WebPage / DrawingArea.h
1 /*
2  * Copyright (C) 2010-2018 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 #pragma once
27
28 #include "CallbackID.h"
29 #include "DrawingAreaInfo.h"
30 #include "LayerTreeContext.h"
31 #include "MessageReceiver.h"
32 #include <WebCore/ActivityState.h>
33 #include <WebCore/FloatRect.h>
34 #include <WebCore/IntRect.h>
35 #include <WebCore/LayerFlushThrottleState.h>
36 #include <WebCore/LayoutMilestone.h>
37 #include <WebCore/PlatformScreen.h>
38 #include <wtf/Forward.h>
39 #include <wtf/Noncopyable.h>
40 #include <wtf/TypeCasts.h>
41
42 namespace WTF {
43 class MachSendRight;
44 }
45
46 namespace IPC {
47 class Connection;
48 class Decoder;
49 }
50
51 namespace WebCore {
52 class DisplayRefreshMonitor;
53 class Frame;
54 class FrameView;
55 class GraphicsLayer;
56 class GraphicsLayerFactory;
57 struct ViewportAttributes;
58 }
59
60 namespace WebKit {
61
62 struct ColorSpaceData;
63 class LayerTreeHost;
64 class WebPage;
65 struct WebPageCreationParameters;
66 struct WebPreferencesStore;
67
68 class DrawingArea : public IPC::MessageReceiver {
69     WTF_MAKE_NONCOPYABLE(DrawingArea);
70
71 public:
72     static std::unique_ptr<DrawingArea> create(WebPage&, const WebPageCreationParameters&);
73     virtual ~DrawingArea();
74     
75     DrawingAreaType type() const { return m_type; }
76
77     virtual void setNeedsDisplay() = 0;
78     virtual void setNeedsDisplayInRect(const WebCore::IntRect&) = 0;
79     virtual void scroll(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollDelta) = 0;
80
81     // FIXME: These should be pure virtual.
82     virtual void pageBackgroundTransparencyChanged() { }
83     virtual void forceRepaint() { }
84     virtual bool forceRepaintAsync(CallbackID) { return false; }
85     virtual void setLayerTreeStateIsFrozen(bool) { }
86     virtual bool layerTreeStateIsFrozen() const { return false; }
87     virtual LayerTreeHost* layerTreeHost() const { return 0; }
88
89     virtual void setPaintingEnabled(bool) { }
90     virtual void updatePreferences(const WebPreferencesStore&) { }
91     virtual void mainFrameContentSizeChanged(const WebCore::IntSize&) { }
92
93 #if PLATFORM(COCOA)
94     virtual void setViewExposedRect(std::optional<WebCore::FloatRect>) = 0;
95     virtual std::optional<WebCore::FloatRect> viewExposedRect() const = 0;
96
97     virtual void acceleratedAnimationDidStart(uint64_t /*layerID*/, const String& /*key*/, MonotonicTime /*startTime*/) { }
98     virtual void acceleratedAnimationDidEnd(uint64_t /*layerID*/, const String& /*key*/) { }
99     virtual void addFence(const WTF::MachSendRight&) { }
100 #endif
101 #if PLATFORM(IOS_FAMILY)
102     virtual WebCore::FloatRect exposedContentRect() const = 0;
103     virtual void setExposedContentRect(const WebCore::FloatRect&) = 0;
104 #endif
105     virtual void mainFrameScrollabilityChanged(bool) { }
106
107     virtual bool supportsAsyncScrolling() { return false; }
108
109     virtual bool shouldUseTiledBackingForFrameView(const WebCore::FrameView&) { return false; }
110
111     virtual WebCore::GraphicsLayerFactory* graphicsLayerFactory() { return nullptr; }
112     virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0;
113     virtual void scheduleCompositingLayerFlush() = 0;
114     virtual void scheduleCompositingLayerFlushImmediately() = 0;
115
116 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
117     virtual RefPtr<WebCore::DisplayRefreshMonitor> createDisplayRefreshMonitor(WebCore::PlatformDisplayID);
118 #endif
119
120     virtual void dispatchAfterEnsuringUpdatedScrollPosition(WTF::Function<void ()>&&);
121
122     virtual void activityStateDidChange(OptionSet<WebCore::ActivityState::Flag>, ActivityStateChangeID, const Vector<CallbackID>&) { }
123     virtual void setLayerHostingMode(LayerHostingMode) { }
124
125     virtual bool markLayersVolatileImmediatelyIfPossible() { return true; }
126
127     virtual bool adjustLayerFlushThrottling(WebCore::LayerFlushThrottleState::Flags) { return false; }
128
129     virtual void attachViewOverlayGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) { }
130
131     virtual void setShouldScaleViewToFitDocument(bool) { }
132
133     virtual bool dispatchDidReachLayoutMilestone(OptionSet<WebCore::LayoutMilestone>) { return false; }
134
135 #if PLATFORM(COCOA)
136     // Used by TiledCoreAnimationDrawingArea.
137     virtual void updateGeometry(const WebCore::IntSize& viewSize, bool flushSynchronously, const WTF::MachSendRight& fencePort) { }
138 #endif
139
140     virtual void layerHostDidFlushLayers() { };
141
142 #if USE(COORDINATED_GRAPHICS)
143     virtual void didChangeViewportAttributes(WebCore::ViewportAttributes&&) = 0;
144 #endif
145
146 #if USE(COORDINATED_GRAPHICS) || USE(TEXTURE_MAPPER)
147     virtual void deviceOrPageScaleFactorChanged() = 0;
148 #endif
149
150 #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
151     void displayWasRefreshed();
152 #endif
153
154     virtual void attach() { };
155
156 protected:
157     DrawingArea(DrawingAreaType, WebPage&);
158
159     DrawingAreaType m_type;
160     WebPage& m_webPage;
161
162 #if USE(TEXTURE_MAPPER_GL) && PLATFORM(GTK) && PLATFORM(X11) && !USE(REDIRECTED_XCOMPOSITE_WINDOW)
163     uint64_t m_nativeSurfaceHandleForCompositing { 0 };
164 #endif
165
166 private:
167     // IPC::MessageReceiver.
168     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
169     void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
170
171     // Message handlers.
172     // FIXME: These should be pure virtual.
173     virtual void updateBackingStoreState(uint64_t /*backingStoreStateID*/, bool /*respondImmediately*/, float /*deviceScaleFactor*/, const WebCore::IntSize& /*size*/, 
174                                          const WebCore::IntSize& /*scrollOffset*/) { }
175     virtual void didUpdate() { }
176
177 #if PLATFORM(COCOA)
178     // Used by TiledCoreAnimationDrawingArea.
179     virtual void setDeviceScaleFactor(float) { }
180     virtual void setColorSpace(const ColorSpaceData&) { }
181
182     virtual void adjustTransientZoom(double scale, WebCore::FloatPoint origin) { }
183     virtual void commitTransientZoom(double scale, WebCore::FloatPoint origin) { }
184
185     virtual void addTransactionCallbackID(WebKit::CallbackID) { ASSERT_NOT_REACHED(); }
186 #endif
187
188 #if USE(TEXTURE_MAPPER_GL) && PLATFORM(GTK) && PLATFORM(X11) && !USE(REDIRECTED_XCOMPOSITE_WINDOW)
189     virtual void setNativeSurfaceHandleForCompositing(uint64_t) = 0;
190     virtual void destroyNativeSurfaceHandleForCompositing(bool&) = 0;
191 #endif
192 };
193
194 } // namespace WebKit
195
196 #define SPECIALIZE_TYPE_TRAITS_DRAWING_AREA(ToValueTypeName, AreaType) \
197 SPECIALIZE_TYPE_TRAITS_BEGIN(WebKit::ToValueTypeName) \
198     static bool isType(const WebKit::DrawingArea& area) { return area.type() == WebKit::AreaType; } \
199 SPECIALIZE_TYPE_TRAITS_END()