1
2/*
3 * Copyright (C) 2017 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#pragma once
28
29#include "FetchHeaders.h"
30#include "FetchOptions.h"
31#include "ResourceRequest.h"
32#include "ResourceResponse.h"
33#include "ScriptExecutionContext.h"
34#include "SharedBuffer.h"
35
36namespace WebCore {
37
38struct CacheQueryOptions;
39
40namespace DOMCacheEngine {
41
42enum class Error {
43 NotImplemented,
44 ReadDisk,
45 WriteDisk,
46 QuotaExceeded,
47 Internal,
48 Stopped
49};
50
51Exception convertToExceptionAndLog(ScriptExecutionContext*, Error);
52
53WEBCORE_EXPORT bool queryCacheMatch(const ResourceRequest& request, const ResourceRequest& cachedRequest, const ResourceResponse&, const CacheQueryOptions&);
54WEBCORE_EXPORT bool queryCacheMatch(const ResourceRequest& request, const URL& url, bool hasVaryStar, const HashMap<String, String>& varyHeaders, const CacheQueryOptions&);
55
56using ResponseBody = Variant<std::nullptr_t, Ref<FormData>, Ref<SharedBuffer>>;
57ResponseBody isolatedResponseBody(const ResponseBody&);
58WEBCORE_EXPORT ResponseBody copyResponseBody(const ResponseBody&);
59
60struct Record {
61 WEBCORE_EXPORT Record copy() const;
62
63 uint64_t identifier;
64 uint64_t updateResponseCounter;
65
66 FetchHeaders::Guard requestHeadersGuard;
67 ResourceRequest request;
68 FetchOptions options;
69 String referrer;
70
71 FetchHeaders::Guard responseHeadersGuard;
72 ResourceResponse response;
73 ResponseBody responseBody;
74 uint64_t responseBodySize;
75};
76
77struct CacheInfo {
78 uint64_t identifier;
79 String name;
80};
81
82struct CacheInfos {
83 CacheInfos isolatedCopy();
84
85 template<class Encoder> void encode(Encoder&) const;
86 template<class Decoder> static Optional<CacheInfos> decode(Decoder&);
87
88 Vector<CacheInfo> infos;
89 uint64_t updateCounter;
90};
91
92struct CacheIdentifierOperationResult {
93 template<class Encoder> void encode(Encoder&) const;
94 template<class Decoder> static Optional<CacheIdentifierOperationResult> decode(Decoder&);
95
96 uint64_t identifier { 0 };
97 // True in case storing cache list on the filesystem failed.
98 bool hadStorageError { false };
99};
100
101using CacheIdentifierOrError = Expected<CacheIdentifierOperationResult, Error>;
102using CacheIdentifierCallback = WTF::Function<void(const CacheIdentifierOrError&)>;
103
104using RecordIdentifiersOrError = Expected<Vector<uint64_t>, Error>;
105using RecordIdentifiersCallback = WTF::Function<void(RecordIdentifiersOrError&&)>;
106
107
108using CacheInfosOrError = Expected<CacheInfos, Error>;
109using CacheInfosCallback = WTF::Function<void(CacheInfosOrError&&)>;
110
111using RecordsOrError = Expected<Vector<Record>, Error>;
112using RecordsCallback = WTF::Function<void(RecordsOrError&&)>;
113
114using CompletionCallback = WTF::Function<void(Optional<Error>&&)>;
115
116template<class Encoder> inline void CacheInfos::encode(Encoder& encoder) const
117{
118 encoder << infos;
119 encoder << updateCounter;
120}
121
122template<class Decoder> inline Optional<CacheInfos> CacheInfos::decode(Decoder& decoder)
123{
124 Optional<Vector<CacheInfo>> infos;
125 decoder >> infos;
126 if (!infos)
127 return WTF::nullopt;
128
129 Optional<uint64_t> updateCounter;
130 decoder >> updateCounter;
131 if (!updateCounter)
132 return WTF::nullopt;
133
134 return {{ WTFMove(*infos), WTFMove(*updateCounter) }};
135}
136
137template<class Encoder> inline void CacheIdentifierOperationResult::encode(Encoder& encoder) const
138{
139 encoder << identifier;
140 encoder << hadStorageError;
141}
142
143template<class Decoder> inline Optional<CacheIdentifierOperationResult> CacheIdentifierOperationResult::decode(Decoder& decoder)
144{
145 Optional<uint64_t> identifier;
146 decoder >> identifier;
147 if (!identifier)
148 return WTF::nullopt;
149
150 Optional<bool> hadStorageError;
151 decoder >> hadStorageError;
152 if (!hadStorageError)
153 return WTF::nullopt;
154 return {{ WTFMove(*identifier), WTFMove(*hadStorageError) }};
155}
156
157} // namespace DOMCacheEngine
158
159} // namespace WebCore
160
161namespace WTF {
162template<> struct EnumTraits<WebCore::DOMCacheEngine::Error> {
163 using values = EnumValues<
164 WebCore::DOMCacheEngine::Error,
165 WebCore::DOMCacheEngine::Error::NotImplemented,
166 WebCore::DOMCacheEngine::Error::ReadDisk,
167 WebCore::DOMCacheEngine::Error::WriteDisk,
168 WebCore::DOMCacheEngine::Error::QuotaExceeded,
169 WebCore::DOMCacheEngine::Error::Internal
170 >;
171};
172}
173