Make WebCore::IOSurface have single ownership instead of refcounting
[WebKit-https.git] / Source / WebKit2 / 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/IntSize.h>
31 #include <WebCore/IOSurface.h>
32 #include <wtf/ListHashSet.h>
33 #include <wtf/Noncopyable.h>
34 #include <wtf/RefCounted.h>
35 #include <wtf/RetainPtr.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 #if PLATFORM(MAC)
45 #define USE_IOSURFACE_VIEW_SNAPSHOTS 1
46 #define USE_RENDER_SERVER_VIEW_SNAPSHOTS 0
47 #else
48 #define USE_IOSURFACE_VIEW_SNAPSHOTS 0
49 #define USE_RENDER_SERVER_VIEW_SNAPSHOTS 1
50 #endif
51
52 namespace WebCore {
53 class IOSurface;
54 }
55
56 namespace WebKit {
57
58 class ViewSnapshotStore;
59 class WebBackForwardListItem;
60 class WebPageProxy;
61
62 class ViewSnapshot : public RefCounted<ViewSnapshot> {
63 public:
64 #if USE_IOSURFACE_VIEW_SNAPSHOTS
65     static PassRefPtr<ViewSnapshot> create(std::unique_ptr<WebCore::IOSurface>);
66 #elif USE_RENDER_SERVER_VIEW_SNAPSHOTS
67     static PassRefPtr<ViewSnapshot> create(uint32_t slotID, WebCore::IntSize, size_t imageSizeInBytes);
68 #endif
69
70     ~ViewSnapshot();
71
72     void clearImage();
73     bool hasImage() const;
74     id asLayerContents();
75
76     void setRenderTreeSize(uint64_t renderTreeSize) { m_renderTreeSize = renderTreeSize; }
77     uint64_t renderTreeSize() const { return m_renderTreeSize; }
78
79     void setBackgroundColor(WebCore::Color color) { m_backgroundColor = color; }
80     WebCore::Color backgroundColor() const { return m_backgroundColor; }
81
82     void setDeviceScaleFactor(float deviceScaleFactor) { m_deviceScaleFactor = deviceScaleFactor; }
83     float deviceScaleFactor() const { return m_deviceScaleFactor; }
84
85     size_t imageSizeInBytes() const { return m_imageSizeInBytes; }
86 #if USE_IOSURFACE_VIEW_SNAPSHOTS
87     WebCore::IOSurface* surface() const { return m_surface.get(); }
88 #endif
89     WebCore::IntSize size() const { return m_size; }
90
91 private:
92 #if USE_IOSURFACE_VIEW_SNAPSHOTS
93     explicit ViewSnapshot(std::unique_ptr<WebCore::IOSurface>);
94 #elif USE_RENDER_SERVER_VIEW_SNAPSHOTS
95     explicit ViewSnapshot(uint32_t slotID, WebCore::IntSize, size_t imageSizeInBytes);
96 #endif
97
98 #if USE_IOSURFACE_VIEW_SNAPSHOTS
99     std::unique_ptr<WebCore::IOSurface> m_surface;
100 #elif USE_RENDER_SERVER_VIEW_SNAPSHOTS
101     uint32_t m_slotID;
102 #endif
103
104     size_t m_imageSizeInBytes;
105     uint64_t m_renderTreeSize;
106     float m_deviceScaleFactor;
107     WebCore::IntSize m_size;
108     WebCore::Color m_backgroundColor;
109 };
110
111 class ViewSnapshotStore {
112     WTF_MAKE_NONCOPYABLE(ViewSnapshotStore);
113     friend class ViewSnapshot;
114 public:
115     ViewSnapshotStore();
116     ~ViewSnapshotStore();
117
118     static ViewSnapshotStore& singleton();
119
120     void recordSnapshot(WebPageProxy&, WebBackForwardListItem&);
121
122     void discardSnapshotImages();
123
124 #if USE_RENDER_SERVER_VIEW_SNAPSHOTS
125     static CAContext *snapshottingContext();
126 #endif
127
128 private:
129     void didAddImageToSnapshot(ViewSnapshot&);
130     void willRemoveImageFromSnapshot(ViewSnapshot&);
131     void pruneSnapshots(WebPageProxy&);
132
133     size_t m_snapshotCacheSize;
134
135     ListHashSet<ViewSnapshot*> m_snapshotsWithImages;
136 };
137
138 } // namespace WebKit
139
140 #endif // ViewSnapshotStore_h