[iOS] Keyups for non-modifier keys identified as "Dead" when not focused in a content...
[WebKit-https.git] / Source / WebCore / platform / ios / LegacyTileCache.h
1 /*
2  * Copyright (C) 2009, 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 LegacyTileCache_h
27 #define LegacyTileCache_h
28
29 #if PLATFORM(IOS_FAMILY)
30
31 #include "Color.h"
32 #include "FloatRect.h"
33 #include "IntRect.h"
34 #include "IntSize.h"
35 #include "Timer.h"
36 #include <wtf/Lock.h>
37 #include <wtf/Noncopyable.h>
38 #include <wtf/Optional.h>
39 #include <wtf/RetainPtr.h>
40 #include <wtf/Threading.h>
41 #include <wtf/Vector.h>
42
43 #ifdef __OBJC__
44 @class CALayer;
45 @class LegacyTileCacheTombstone;
46 @class LegacyTileLayer;
47 @class WAKWindow;
48 #else
49 class CALayer;
50 class LegacyTileCacheTombstone;
51 class LegacyTileLayer;
52 class WAKWindow;
53 #endif
54
55 namespace WebCore {
56
57 class LegacyTileGrid;
58
59 class LegacyTileCache {
60     WTF_MAKE_NONCOPYABLE(LegacyTileCache);
61 public:
62     LegacyTileCache(WAKWindow*);
63     ~LegacyTileCache();
64
65     CGFloat screenScale() const;
66
67     void setNeedsDisplay();
68     void setNeedsDisplayInRect(const IntRect&);
69     
70     void layoutTiles();
71     void layoutTilesNow();
72     void layoutTilesNowForRect(const IntRect&);
73     void removeAllNonVisibleTiles();
74     void removeAllTiles();
75     void removeForegroundTiles();
76
77     // If 'contentReplacementImage' is not NULL, drawLayer() draws
78     // contentReplacementImage instead of the page content. We assume the
79     // image is to be drawn at the origin and scaled to match device pixels.
80     void setContentReplacementImage(RetainPtr<CGImageRef>);
81     RetainPtr<CGImageRef> contentReplacementImage() const;
82
83     void setTileBordersVisible(bool);
84     bool tileBordersVisible() const { return m_tileBordersVisible; }
85
86     void setTilePaintCountersVisible(bool);
87     bool tilePaintCountersVisible() const { return m_tilePaintCountersVisible; }
88
89     void setAcceleratedDrawingEnabled(bool enabled) { m_acceleratedDrawingEnabled = enabled; }
90     bool acceleratedDrawingEnabled() const { return m_acceleratedDrawingEnabled; }
91
92     void setKeepsZoomedOutTiles(bool);
93     bool keepsZoomedOutTiles() const { return m_keepsZoomedOutTiles; }
94
95     void setZoomedOutScale(float);
96     float zoomedOutScale() const;
97     
98     void setCurrentScale(float);
99     float currentScale() const;
100     
101     bool tilesOpaque() const;
102     void setTilesOpaque(bool);
103     
104     enum TilingMode {
105         Normal,
106         Minimal,
107         Panning,
108         Zooming,
109         Disabled,
110         ScrollToTop
111     };
112     TilingMode tilingMode() const { return m_tilingMode; }
113     void setTilingMode(TilingMode);
114
115     typedef enum {
116         TilingDirectionUp,
117         TilingDirectionDown,
118         TilingDirectionLeft,
119         TilingDirectionRight,
120     } TilingDirection;
121     void setTilingDirection(TilingDirection);
122     TilingDirection tilingDirection() const;
123
124     bool hasPendingDraw() const;
125
126     void hostLayerSizeChanged();
127
128     WEBCORE_EXPORT static void setLayerPoolCapacity(unsigned);
129     WEBCORE_EXPORT static void drainLayerPool();
130
131     // Logging
132     void dumpTiles();
133
134     // Internal
135     void doLayoutTiles();
136     
137     enum class DrawingFlags { None, Snapshotting };
138     void drawLayer(LegacyTileLayer*, CGContextRef, DrawingFlags);
139     void prepareToDraw();
140     void finishedCreatingTiles(bool didCreateTiles, bool createMore);
141     FloatRect visibleRectInLayer(CALayer *) const;
142     CALayer* hostLayer() const;
143     unsigned tileCapacityForGrid(LegacyTileGrid*);
144     Color colorForGridTileBorder(LegacyTileGrid*) const;
145     bool setOverrideVisibleRect(const FloatRect&);
146     void clearOverrideVisibleRect() { m_overrideVisibleRect = WTF::nullopt; }
147
148     void doPendingRepaints();
149
150     bool isSpeculativeTileCreationEnabled() const { return m_isSpeculativeTileCreationEnabled; }
151     void setSpeculativeTileCreationEnabled(bool);
152     
153     enum SynchronousTileCreationMode { CoverVisibleOnly, CoverSpeculative };
154
155     bool tileControllerShouldUseLowScaleTiles() const { return m_tileControllerShouldUseLowScaleTiles; } 
156     void setTileControllerShouldUseLowScaleTiles(bool flag) { m_tileControllerShouldUseLowScaleTiles = flag; } 
157
158 private:
159     LegacyTileGrid* activeTileGrid() const;
160     LegacyTileGrid* inactiveTileGrid() const;
161
162     void updateTilingMode();
163     bool isTileInvalidationSuspended() const;
164     bool isTileCreationSuspended() const;
165     void flushSavedDisplayRects();
166     void invalidateTiles(const IntRect& dirtyRect);
167     void setZoomedOutScaleInternal(float);
168     void commitScaleChange();
169     void bringActiveTileGridToFront();
170     void adjustTileGridTransforms();
171     void removeAllNonVisibleTilesInternal();
172     void createTilesInActiveGrid(SynchronousTileCreationMode);
173     void scheduleLayerFlushForPendingRepaint();
174
175     void tileCreationTimerFired();
176
177     void drawReplacementImage(LegacyTileLayer*, CGContextRef, CGImageRef);
178     void drawWindowContent(LegacyTileLayer*, CGContextRef, CGRect dirtyRect, DrawingFlags);
179
180     WAKWindow* m_window { nullptr };
181
182     RetainPtr<CGImageRef> m_contentReplacementImage;
183
184     // Ensure there are no async calls on a dead tile cache.
185     RetainPtr<LegacyTileCacheTombstone> m_tombstone;
186
187     Optional<FloatRect> m_overrideVisibleRect;
188
189     IntSize m_tileSize { 512, 512 };
190     
191     TilingMode m_tilingMode { Normal };
192     TilingDirection m_tilingDirection { TilingDirectionDown };
193     
194     bool m_keepsZoomedOutTiles { false };
195     bool m_hasPendingLayoutTiles { false };
196     bool m_hasPendingUpdateTilingMode { false };
197     bool m_tilesOpaque { true };
198     bool m_tileBordersVisible { false };
199     bool m_tilePaintCountersVisible { false };
200     bool m_acceleratedDrawingEnabled { false };
201     bool m_isSpeculativeTileCreationEnabled { true };
202     bool m_tileControllerShouldUseLowScaleTiles { false };
203     bool m_didCallWillStartScrollingOrZooming { false };
204     
205     std::unique_ptr<LegacyTileGrid> m_zoomedOutTileGrid;
206     std::unique_ptr<LegacyTileGrid> m_zoomedInTileGrid;
207
208     Timer m_tileCreationTimer;
209
210     Vector<IntRect> m_savedDisplayRects;
211
212     float m_currentScale { 1 };
213
214     float m_pendingScale { 0 };
215     float m_pendingZoomedOutScale { 0 };
216
217     mutable Lock m_tileMutex;
218     mutable Lock m_savedDisplayRectMutex;
219     mutable Lock m_contentReplacementImageMutex;
220 };
221
222 } // namespace WebCore
223
224 #endif // PLATFORM(IOS_FAMILY)
225
226 #endif // TileCache_h