View scale changes are temporarily lost after restoring a page from the page cache
[WebKit-https.git] / Source / WebCore / history / PageCache.h
1 /*
2  * Copyright (C) 2007, 2015 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef PageCache_h
27 #define PageCache_h
28
29 #include "HistoryItem.h"
30 #include "Timer.h"
31 #include <wtf/Forward.h>
32 #include <wtf/ListHashSet.h>
33 #include <wtf/Noncopyable.h>
34
35 namespace WebCore {
36
37 class CachedPage;
38 class Frame;
39 class Page;
40
41 enum class PruningReason { None, ProcessSuspended, MemoryPressure, ReachedMaxSize };
42
43 class PageCache {
44     WTF_MAKE_NONCOPYABLE(PageCache); WTF_MAKE_FAST_ALLOCATED;
45 public:
46     // Function to obtain the global page cache.
47     WEBCORE_EXPORT static PageCache& singleton();
48
49     bool canCache(Page*) const;
50
51     // Used when memory is low to prune some cached pages.
52     WEBCORE_EXPORT void pruneToSizeNow(unsigned maxSize, PruningReason);
53     WEBCORE_EXPORT void setMaxSize(unsigned); // number of pages to cache.
54     unsigned maxSize() const { return m_maxSize; }
55
56     void add(HistoryItem&, Page&); // Prunes if maxSize() is exceeded.
57     WEBCORE_EXPORT void remove(HistoryItem&);
58     CachedPage* get(HistoryItem&, Page*);
59     std::unique_ptr<CachedPage> take(HistoryItem&, Page*);
60
61     unsigned pageCount() const { return m_items.size(); }
62     WEBCORE_EXPORT unsigned frameCount() const;
63
64     WEBCORE_EXPORT void markPagesForVisitedLinkStyleRecalc();
65     // Will mark all cached pages associated with the given page as needing style recalc.
66     void markPagesForFullStyleRecalc(Page&);
67     void markPagesForDeviceOrPageScaleChanged(Page&);
68 #if ENABLE(VIDEO_TRACK)
69     void markPagesForCaptionPreferencesChanged();
70 #endif
71
72     bool shouldClearBackingStores() const { return m_shouldClearBackingStores; }
73     void setShouldClearBackingStores(bool flag) { m_shouldClearBackingStores = flag; }
74
75 private:
76     PageCache() = default; // Use singleton() instead.
77     ~PageCache() = delete; // Make sure nobody accidentally calls delete -- WebCore does not delete singletons.
78
79     static bool canCachePageContainingThisFrame(Frame&);
80
81     void prune(PruningReason);
82
83     ListHashSet<RefPtr<HistoryItem>> m_items;
84     unsigned m_maxSize {0};
85     bool m_shouldClearBackingStores {false};
86
87     friend class WTF::NeverDestroyed<PageCache>;
88 };
89
90 } // namespace WebCore
91
92 #endif // PageCache_h