Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKit / NetworkProcess / cache / NetworkCache.h
1 /*
2  * Copyright (C) 2014-2017 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 "NetworkCacheEntry.h"
29 #include "NetworkCacheStorage.h"
30 #include "ShareableResource.h"
31 #include <WebCore/ResourceResponse.h>
32 #include <wtf/Function.h>
33 #include <wtf/OptionSet.h>
34 #include <wtf/Seconds.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38 class LowPowerModeNotifier;
39 class ResourceRequest;
40 class SharedBuffer;
41 }
42
43 namespace WebKit {
44 namespace NetworkCache {
45
46 class Cache;
47 class SpeculativeLoadManager;
48 class Statistics;
49
50 struct MappedBody {
51 #if ENABLE(SHAREABLE_RESOURCE)
52     RefPtr<ShareableResource> shareableResource;
53     ShareableResource::Handle shareableResourceHandle;
54 #endif
55 };
56
57 enum class RetrieveDecision {
58     Yes,
59     NoDueToHTTPMethod,
60     NoDueToConditionalRequest,
61     NoDueToReloadIgnoringCache,
62     NoDueToStreamingMedia,
63 };
64
65 // FIXME: This enum is used in the Statistics code in a way that prevents removing or reordering anything.
66 enum class StoreDecision {
67     Yes,
68     NoDueToProtocol,
69     NoDueToHTTPMethod,
70     NoDueToAttachmentResponse, // Unused.
71     NoDueToNoStoreResponse,
72     NoDueToHTTPStatusCode,
73     NoDueToNoStoreRequest,
74     NoDueToUnlikelyToReuse,
75     NoDueToStreamingMedia,
76 };
77
78 enum class UseDecision {
79     Use,
80     Validate,
81     NoDueToVaryingHeaderMismatch,
82     NoDueToMissingValidatorFields,
83     NoDueToDecodeFailure,
84     NoDueToExpiredRedirect
85 };
86
87 using GlobalFrameID = std::pair<uint64_t /*webPageID*/, uint64_t /*webFrameID*/>;
88
89 class Cache : public RefCounted<Cache> {
90 public:
91     enum class Option {
92         EfficacyLogging = 1 << 0,
93         // In testing mode we try to eliminate sources of randomness. Cache does not shrink and there are no read timeouts.
94         TestingMode = 1 << 1,
95         RegisterNotify = 1 << 2,
96 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
97         SpeculativeRevalidation = 1 << 3,
98 #endif
99     };
100     static RefPtr<Cache> open(const String& cachePath, OptionSet<Option>);
101
102     void setCapacity(size_t);
103
104     // Completion handler may get called back synchronously on failure.
105     struct RetrieveInfo {
106         MonotonicTime startTime;
107         MonotonicTime completionTime;
108         unsigned priority;
109         Storage::Timings storageTimings;
110         bool wasSpeculativeLoad { false };
111
112         WTF_MAKE_FAST_ALLOCATED;
113     };
114     using RetrieveCompletionHandler = Function<void (std::unique_ptr<Entry>, const RetrieveInfo&)>;
115     void retrieve(const WebCore::ResourceRequest&, const GlobalFrameID&, RetrieveCompletionHandler&&);
116     std::unique_ptr<Entry> store(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&, Function<void (MappedBody&)>&&);
117     std::unique_ptr<Entry> storeRedirect(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest& redirectRequest, std::optional<Seconds> maxAgeCap);
118     std::unique_ptr<Entry> update(const WebCore::ResourceRequest&, const GlobalFrameID&, const Entry&, const WebCore::ResourceResponse& validatingResponse);
119
120     struct TraversalEntry {
121         const Entry& entry;
122         const Storage::RecordInfo& recordInfo;
123     };
124     void traverse(Function<void (const TraversalEntry*)>&&);
125     void remove(const Key&);
126     void remove(const WebCore::ResourceRequest&);
127     void remove(const Vector<Key>&, Function<void ()>&&);
128
129     void clear();
130     void clear(WallTime modifiedSince, Function<void ()>&& completionHandler);
131
132     void retrieveData(const DataKey&, Function<void (const uint8_t* data, size_t size)>);
133     void storeData(const DataKey&,  const uint8_t* data, size_t);
134     
135     std::unique_ptr<Entry> makeEntry(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&);
136     std::unique_ptr<Entry> makeRedirectEntry(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest& redirectRequest);
137
138     void dumpContentsToFile();
139
140     String recordsPath() const;
141
142 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
143     SpeculativeLoadManager* speculativeLoadManager() { return m_speculativeLoadManager.get(); }
144 #endif
145
146     ~Cache();
147
148 private:
149     Cache(Ref<Storage>&&, OptionSet<Option> options);
150
151     Key makeCacheKey(const WebCore::ResourceRequest&);
152
153     static void completeRetrieve(RetrieveCompletionHandler&&, std::unique_ptr<Entry>, RetrieveInfo&);
154
155     String dumpFilePath() const;
156     void deleteDumpFile();
157
158     std::optional<Seconds> maxAgeCap(Entry&, const WebCore::ResourceRequest&, PAL::SessionID);
159
160     Ref<Storage> m_storage;
161
162 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
163     std::unique_ptr<WebCore::LowPowerModeNotifier> m_lowPowerModeNotifier;
164     std::unique_ptr<SpeculativeLoadManager> m_speculativeLoadManager;
165 #endif
166     std::unique_ptr<Statistics> m_statistics;
167
168     unsigned m_traverseCount { 0 };
169 };
170
171 }
172 }