afed33238cc86510dc2570f0f53fe21d2245f77d
[WebKit-https.git] / Source / WebKit / UIProcess / mac / ViewSnapshotStore.h
1 /*
2  * Copyright (C) 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 ViewSnapshotStore_h
27 #define ViewSnapshotStore_h
28
29 #include <WebCore/Color.h>
30 #include <WebCore/IntPoint.h>
31 #include <WebCore/IntSize.h>
32 #include <WebCore/IOSurface.h>
33 #include <wtf/ListHashSet.h>
34 #include <wtf/Noncopyable.h>
35 #include <wtf/RefCounted.h>
36 #include <wtf/text/WTFString.h>
37
38 #if !defined(__OBJC__)
39 typedef struct objc_object *id;
40 #endif
41
42 OBJC_CLASS CAContext;
43
44 namespace WebCore {
45 class IOSurface;
46 }
47
48 namespace WebKit {
49
50 class ViewSnapshotStore;
51 class WebBackForwardListItem;
52 class WebPageProxy;
53
54 class ViewSnapshot : public RefCounted<ViewSnapshot> {
55 public:
56 #if HAVE(IOSURFACE)
57     static Ref<ViewSnapshot> create(std::unique_ptr<WebCore::IOSurface>);
58 #else
59     static Ref<ViewSnapshot> create(uint32_t slotID, WebCore::IntSize, size_t imageSizeInBytes);
60 #endif
61
62     ~ViewSnapshot();
63
64     void clearImage();
65     bool hasImage() const;
66     id asLayerContents();
67     RetainPtr<CGImageRef> asImageForTesting();
68
69     void setRenderTreeSize(uint64_t renderTreeSize) { m_renderTreeSize = renderTreeSize; }
70     uint64_t renderTreeSize() const { return m_renderTreeSize; }
71
72     void setBackgroundColor(WebCore::Color color) { m_backgroundColor = color; }
73     WebCore::Color backgroundColor() const { return m_backgroundColor; }
74     
75     void setViewScrollPosition(WebCore::IntPoint scrollPosition) { m_viewScrollPosition = scrollPosition; }
76     WebCore::IntPoint viewScrollPosition() const { return m_viewScrollPosition; }
77
78     void setDeviceScaleFactor(float deviceScaleFactor) { m_deviceScaleFactor = deviceScaleFactor; }
79     float deviceScaleFactor() const { return m_deviceScaleFactor; }
80
81 #if HAVE(IOSURFACE)
82     WebCore::IOSurface* surface() const { return m_surface.get(); }
83
84     size_t imageSizeInBytes() const { return m_surface ? m_surface->totalBytes() : 0; }
85     WebCore::IntSize size() const { return m_surface ? m_surface->size() : WebCore::IntSize(); }
86
87     void setSurface(std::unique_ptr<WebCore::IOSurface>);
88
89     WebCore::IOSurface::SurfaceState setVolatile(bool);
90 #else
91     WebCore::IntSize size() const { return m_size; }
92     size_t imageSizeInBytes() const { return m_imageSizeInBytes; }
93 #endif
94
95 private:
96 #if HAVE(IOSURFACE)
97     explicit ViewSnapshot(std::unique_ptr<WebCore::IOSurface>);
98
99     std::unique_ptr<WebCore::IOSurface> m_surface;
100 #else
101     explicit ViewSnapshot(uint32_t slotID, WebCore::IntSize, size_t imageSizeInBytes);
102
103     uint32_t m_slotID;
104     size_t m_imageSizeInBytes;
105     WebCore::IntSize m_size;
106 #endif
107
108     uint64_t m_renderTreeSize;
109     float m_deviceScaleFactor;
110     WebCore::Color m_backgroundColor;
111     WebCore::IntPoint m_viewScrollPosition; // Scroll position at snapshot time. Integral to make comparison reliable.
112 };
113
114 class ViewSnapshotStore {
115     WTF_MAKE_NONCOPYABLE(ViewSnapshotStore);
116     friend class ViewSnapshot;
117 public:
118     ViewSnapshotStore();
119     ~ViewSnapshotStore();
120
121     static ViewSnapshotStore& singleton();
122
123     void recordSnapshot(WebPageProxy&, WebBackForwardListItem&);
124
125     void discardSnapshotImages();
126
127     void setDisableSnapshotVolatilityForTesting(bool disable) { m_disableSnapshotVolatility = disable; }
128     bool disableSnapshotVolatilityForTesting() const { return m_disableSnapshotVolatility; }
129
130 #if !HAVE(IOSURFACE)
131     static CAContext *snapshottingContext();
132 #endif
133
134 private:
135     void didAddImageToSnapshot(ViewSnapshot&);
136     void willRemoveImageFromSnapshot(ViewSnapshot&);
137     void pruneSnapshots(WebPageProxy&);
138
139     size_t m_snapshotCacheSize { 0 };
140
141     ListHashSet<ViewSnapshot*> m_snapshotsWithImages;
142     bool m_disableSnapshotVolatility { false };
143 };
144
145 } // namespace WebKit
146
147 #endif // ViewSnapshotStore_h