c2d5da8b13cb2e463d6a0c3003f7b578826eb672
[WebKit.git] / Source / WebKit / NetworkProcess / cache / NetworkCacheSubresourcesEntry.h
1 /*
2  * Copyright (C) 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. 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 NetworkCacheSubresourcesEntry_h
27 #define NetworkCacheSubresourcesEntry_h
28
29 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
30
31 #include "NetworkCacheStorage.h"
32 #include <WebCore/ResourceRequest.h>
33 #include <WebCore/URL.h>
34 #include <wtf/HashMap.h>
35
36 namespace WebKit {
37 namespace NetworkCache {
38
39 class SubresourceInfo {
40     WTF_MAKE_FAST_ALLOCATED;
41 public:
42     void encode(WTF::Persistence::Encoder&) const;
43     static bool decode(WTF::Persistence::Decoder&, SubresourceInfo&);
44
45     SubresourceInfo() = default;
46     SubresourceInfo(const Key&, const WebCore::ResourceRequest&, const SubresourceInfo* previousInfo);
47
48     const Key& key() const { return m_key; }
49     std::chrono::system_clock::time_point lastSeen() const { return m_lastSeen; }
50     std::chrono::system_clock::time_point firstSeen() const { return m_firstSeen; }
51
52     bool isTransient() const { return m_isTransient; }
53     const WebCore::URL& firstPartyForCookies() const { ASSERT(!m_isTransient); return m_firstPartyForCookies; }
54     const WebCore::HTTPHeaderMap& requestHeaders() const { ASSERT(!m_isTransient); return m_requestHeaders; }
55     WebCore::ResourceLoadPriority priority() const { ASSERT(!m_isTransient); return m_priority; }
56     
57     void setNonTransient() { m_isTransient = false; }
58
59 private:
60     Key m_key;
61     std::chrono::system_clock::time_point m_lastSeen;
62     std::chrono::system_clock::time_point m_firstSeen;
63     bool m_isTransient { false };
64     WebCore::URL m_firstPartyForCookies;
65     WebCore::HTTPHeaderMap m_requestHeaders;
66     WebCore::ResourceLoadPriority m_priority;
67 };
68
69 struct SubresourceLoad {
70     WTF_MAKE_NONCOPYABLE(SubresourceLoad); WTF_MAKE_FAST_ALLOCATED;
71 public:
72     SubresourceLoad(const WebCore::ResourceRequest& request, const Key& key)
73         : request(request)
74         , key(key)
75     { }
76
77     WebCore::ResourceRequest request;
78     Key key;
79 };
80
81 class SubresourcesEntry {
82     WTF_MAKE_NONCOPYABLE(SubresourcesEntry); WTF_MAKE_FAST_ALLOCATED;
83 public:
84     SubresourcesEntry(Key&&, const Vector<std::unique_ptr<SubresourceLoad>>&);
85     explicit SubresourcesEntry(const Storage::Record&);
86
87     Storage::Record encodeAsStorageRecord() const;
88     static std::unique_ptr<SubresourcesEntry> decodeStorageRecord(const Storage::Record&);
89
90     const Key& key() const { return m_key; }
91     std::chrono::system_clock::time_point timeStamp() const { return m_timeStamp; }
92     const Vector<SubresourceInfo>& subresources() const { return m_subresources; }
93
94     void updateSubresourceLoads(const Vector<std::unique_ptr<SubresourceLoad>>&);
95
96 private:
97     Key m_key;
98     std::chrono::system_clock::time_point m_timeStamp;
99     Vector<SubresourceInfo> m_subresources;
100 };
101
102 } // namespace WebKit
103 } // namespace NetworkCache
104
105 #endif // ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
106 #endif // NetworkCacheSubresourcesEntry_h