7d7468c0e4b47b1fde99d5f3cc139b2a9d8625ff
[WebKit-https.git] / Source / WebCore / loader / cache / CachedRawResource.h
1 /*
2     Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3     Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
4     Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
5     Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20     Boston, MA 02110-1301, USA.
21 */
22
23 #pragma once
24
25 #include "CachedResource.h"
26
27 namespace WebCore {
28
29 class CachedResourceClient;
30 class ResourceTiming;
31 class SubresourceLoader;
32
33 class CachedRawResource final : public CachedResource {
34 public:
35     CachedRawResource(CachedResourceRequest&&, Type, SessionID);
36
37     // FIXME: AssociatedURLLoader shouldn't be a DocumentThreadableLoader and therefore shouldn't
38     // use CachedRawResource. However, it is, and it needs to be able to defer loading.
39     // This can be fixed by splitting CORS preflighting out of DocumentThreacableLoader.
40     virtual void setDefersLoading(bool);
41
42     virtual void setDataBufferingPolicy(DataBufferingPolicy);
43
44     // FIXME: This is exposed for the InspectorInstrumentation for preflights in DocumentThreadableLoader. It's also really lame.
45     unsigned long identifier() const { return m_identifier; }
46
47     void clear();
48
49     bool canReuse(const ResourceRequest&) const;
50
51     bool wasRedirected() const { return !m_redirectChain.isEmpty(); };
52
53     void finishedTimingForWorkerLoad(ResourceTiming&&);
54
55 private:
56     void didAddClient(CachedResourceClient&) final;
57     void addDataBuffer(SharedBuffer&) final;
58     void addData(const char* data, unsigned length) final;
59     void finishLoading(SharedBuffer*) final;
60
61     bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; }
62     void allClientsRemoved() override;
63
64     void redirectReceived(ResourceRequest&, const ResourceResponse&) override;
65     void responseReceived(const ResourceResponse&) override;
66     bool shouldCacheResponse(const ResourceResponse&) override;
67     void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
68
69     void switchClientsToRevalidatedResource() override;
70     bool mayTryReplaceEncodedData() const override { return m_allowEncodedDataReplacement; }
71
72     const char* calculateIncrementalDataChunk(SharedBuffer*, unsigned& incrementalDataLength);
73     void notifyClientsDataWasReceived(const char* data, unsigned length);
74
75 #if USE(SOUP)
76     char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) override;
77 #endif
78
79     unsigned long m_identifier;
80     bool m_allowEncodedDataReplacement;
81
82     struct RedirectPair {
83     public:
84         explicit RedirectPair(const ResourceRequest& request, const ResourceResponse& redirectResponse)
85             : m_request(request)
86             , m_redirectResponse(redirectResponse)
87         {
88         }
89
90         const ResourceRequest m_request;
91         const ResourceResponse m_redirectResponse;
92     };
93
94     Vector<RedirectPair> m_redirectChain;
95 };
96
97 } // namespace WebCore
98
99 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::CachedRawResource)
100     static bool isType(const WebCore::CachedResource& resource) { return resource.isMainOrMediaOrRawResource(); }
101 SPECIALIZE_TYPE_TRAITS_END()