| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
| 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
| 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
| 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. | 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. |
| 7 | 7 |
| 8 This library is free software; you can redistribute it and/or | 8 This library is free software; you can redistribute it and/or |
| 9 modify it under the terms of the GNU Library General Public | 9 modify it under the terms of the GNU Library General Public |
| 10 License as published by the Free Software Foundation; either | 10 License as published by the Free Software Foundation; either |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "public/platform/WebScheduler.h" | 42 #include "public/platform/WebScheduler.h" |
| 43 #include "public/platform/WebSecurityOrigin.h" | 43 #include "public/platform/WebSecurityOrigin.h" |
| 44 #include "wtf/CurrentTime.h" | 44 #include "wtf/CurrentTime.h" |
| 45 #include "wtf/MathExtras.h" | 45 #include "wtf/MathExtras.h" |
| 46 #include "wtf/StdLibExtras.h" | 46 #include "wtf/StdLibExtras.h" |
| 47 #include "wtf/Vector.h" | 47 #include "wtf/Vector.h" |
| 48 #include "wtf/text/CString.h" | 48 #include "wtf/text/CString.h" |
| 49 #include "wtf/text/StringBuilder.h" | 49 #include "wtf/text/StringBuilder.h" |
| 50 #include <algorithm> | 50 #include <algorithm> |
| 51 #include <memory> | 51 #include <memory> |
| 52 #include <stdint.h> |
| 52 | 53 |
| 53 namespace blink { | 54 namespace blink { |
| 54 | 55 |
| 55 // These response headers are not copied from a revalidated response to the | 56 // These response headers are not copied from a revalidated response to the |
| 56 // cached response headers. For compatibility, this list is based on Chromium's | 57 // cached response headers. For compatibility, this list is based on Chromium's |
| 57 // net/http/http_response_headers.cc. | 58 // net/http/http_response_headers.cc. |
| 58 const char* const headersToIgnoreAfterRevalidation[] = { | 59 const char* const headersToIgnoreAfterRevalidation[] = { |
| 59 "allow", | 60 "allow", |
| 60 "connection", | 61 "connection", |
| 61 "etag", | 62 "etag", |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 96 } |
| 96 | 97 |
| 97 class Resource::CachedMetadataHandlerImpl : public CachedMetadataHandler { | 98 class Resource::CachedMetadataHandlerImpl : public CachedMetadataHandler { |
| 98 public: | 99 public: |
| 99 static Resource::CachedMetadataHandlerImpl* create(Resource* resource) | 100 static Resource::CachedMetadataHandlerImpl* create(Resource* resource) |
| 100 { | 101 { |
| 101 return new CachedMetadataHandlerImpl(resource); | 102 return new CachedMetadataHandlerImpl(resource); |
| 102 } | 103 } |
| 103 ~CachedMetadataHandlerImpl() override {} | 104 ~CachedMetadataHandlerImpl() override {} |
| 104 DECLARE_VIRTUAL_TRACE(); | 105 DECLARE_VIRTUAL_TRACE(); |
| 105 void setCachedMetadata(unsigned, const char*, size_t, CacheType) override; | 106 void setCachedMetadata(uint32_t, const char*, size_t, CacheType) override; |
| 106 void clearCachedMetadata(CacheType) override; | 107 void clearCachedMetadata(CacheType) override; |
| 107 PassRefPtr<CachedMetadata> cachedMetadata(unsigned) const override; | 108 PassRefPtr<CachedMetadata> cachedMetadata(uint32_t) const override; |
| 108 String encoding() const override; | 109 String encoding() const override; |
| 109 // Sets the serialized metadata retrieved from the platform's cache. | 110 // Sets the serialized metadata retrieved from the platform's cache. |
| 110 void setSerializedCachedMetadata(const char*, size_t); | 111 void setSerializedCachedMetadata(const char*, size_t); |
| 111 | 112 |
| 112 protected: | 113 protected: |
| 113 explicit CachedMetadataHandlerImpl(Resource*); | 114 explicit CachedMetadataHandlerImpl(Resource*); |
| 114 virtual void sendToPlatform(); | 115 virtual void sendToPlatform(); |
| 115 const ResourceResponse& response() const { return m_resource->response(); } | 116 const ResourceResponse& response() const { return m_resource->response(); } |
| 116 | 117 |
| 117 RefPtr<CachedMetadata> m_cachedMetadata; | 118 RefPtr<CachedMetadata> m_cachedMetadata; |
| 118 | 119 |
| 119 private: | 120 private: |
| 120 Member<Resource> m_resource; | 121 Member<Resource> m_resource; |
| 121 }; | 122 }; |
| 122 | 123 |
| 123 Resource::CachedMetadataHandlerImpl::CachedMetadataHandlerImpl(Resource* resourc
e) | 124 Resource::CachedMetadataHandlerImpl::CachedMetadataHandlerImpl(Resource* resourc
e) |
| 124 : m_resource(resource) | 125 : m_resource(resource) |
| 125 { | 126 { |
| 126 } | 127 } |
| 127 | 128 |
| 128 DEFINE_TRACE(Resource::CachedMetadataHandlerImpl) | 129 DEFINE_TRACE(Resource::CachedMetadataHandlerImpl) |
| 129 { | 130 { |
| 130 visitor->trace(m_resource); | 131 visitor->trace(m_resource); |
| 131 CachedMetadataHandler::trace(visitor); | 132 CachedMetadataHandler::trace(visitor); |
| 132 } | 133 } |
| 133 | 134 |
| 134 void Resource::CachedMetadataHandlerImpl::setCachedMetadata(unsigned dataTypeID,
const char* data, size_t size, CachedMetadataHandler::CacheType cacheType) | 135 void Resource::CachedMetadataHandlerImpl::setCachedMetadata(uint32_t dataTypeID,
const char* data, size_t size, CachedMetadataHandler::CacheType cacheType) |
| 135 { | 136 { |
| 136 // Currently, only one type of cached metadata per resource is supported. | 137 // Currently, only one type of cached metadata per resource is supported. |
| 137 // If the need arises for multiple types of metadata per resource this could | 138 // If the need arises for multiple types of metadata per resource this could |
| 138 // be enhanced to store types of metadata in a map. | 139 // be enhanced to store types of metadata in a map. |
| 139 ASSERT(!m_cachedMetadata); | 140 ASSERT(!m_cachedMetadata); |
| 140 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); | 141 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); |
| 141 if (cacheType == CachedMetadataHandler::SendToPlatform) | 142 if (cacheType == CachedMetadataHandler::SendToPlatform) |
| 142 sendToPlatform(); | 143 sendToPlatform(); |
| 143 } | 144 } |
| 144 | 145 |
| 145 void Resource::CachedMetadataHandlerImpl::clearCachedMetadata(CachedMetadataHand
ler::CacheType cacheType) | 146 void Resource::CachedMetadataHandlerImpl::clearCachedMetadata(CachedMetadataHand
ler::CacheType cacheType) |
| 146 { | 147 { |
| 147 m_cachedMetadata.clear(); | 148 m_cachedMetadata.clear(); |
| 148 if (cacheType == CachedMetadataHandler::SendToPlatform) | 149 if (cacheType == CachedMetadataHandler::SendToPlatform) |
| 149 sendToPlatform(); | 150 sendToPlatform(); |
| 150 } | 151 } |
| 151 | 152 |
| 152 PassRefPtr<CachedMetadata> Resource::CachedMetadataHandlerImpl::cachedMetadata(u
nsigned dataTypeID) const | 153 PassRefPtr<CachedMetadata> Resource::CachedMetadataHandlerImpl::cachedMetadata(u
int32_t dataTypeID) const |
| 153 { | 154 { |
| 154 if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID) | 155 if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID) |
| 155 return nullptr; | 156 return nullptr; |
| 156 return m_cachedMetadata.get(); | 157 return m_cachedMetadata.get(); |
| 157 } | 158 } |
| 158 | 159 |
| 159 String Resource::CachedMetadataHandlerImpl::encoding() const | 160 String Resource::CachedMetadataHandlerImpl::encoding() const |
| 160 { | 161 { |
| 161 return m_resource->encoding(); | 162 return m_resource->encoding(); |
| 162 } | 163 } |
| 163 | 164 |
| 164 void Resource::CachedMetadataHandlerImpl::setSerializedCachedMetadata(const char
* data, size_t size) | 165 void Resource::CachedMetadataHandlerImpl::setSerializedCachedMetadata(const char
* data, size_t size) |
| 165 { | 166 { |
| 166 // We only expect to receive cached metadata from the platform once. | 167 // We only expect to receive cached metadata from the platform once. |
| 167 // If this triggers, it indicates an efficiency problem which is most | 168 // If this triggers, it indicates an efficiency problem which is most |
| 168 // likely unexpected in code designed to improve performance. | 169 // likely unexpected in code designed to improve performance. |
| 169 ASSERT(!m_cachedMetadata); | 170 ASSERT(!m_cachedMetadata); |
| 170 m_cachedMetadata = CachedMetadata::deserialize(data, size); | 171 m_cachedMetadata = CachedMetadata::createFromSerializedData(data, size); |
| 171 } | 172 } |
| 172 | 173 |
| 173 void Resource::CachedMetadataHandlerImpl::sendToPlatform() | 174 void Resource::CachedMetadataHandlerImpl::sendToPlatform() |
| 174 { | 175 { |
| 175 if (m_cachedMetadata) { | 176 if (m_cachedMetadata) { |
| 176 const Vector<char>& serializedData = m_cachedMetadata->serialize(); | 177 const Vector<char>& serializedData = m_cachedMetadata->serializedData(); |
| 177 Platform::current()->cacheMetadata(response().url(), response().response
Time(), serializedData.data(), serializedData.size()); | 178 Platform::current()->cacheMetadata(response().url(), response().response
Time(), serializedData.data(), serializedData.size()); |
| 178 } else { | 179 } else { |
| 179 Platform::current()->cacheMetadata(response().url(), response().response
Time(), nullptr, 0); | 180 Platform::current()->cacheMetadata(response().url(), response().response
Time(), nullptr, 0); |
| 180 } | 181 } |
| 181 } | 182 } |
| 182 | 183 |
| 183 class Resource::ServiceWorkerResponseCachedMetadataHandler : public Resource::Ca
chedMetadataHandlerImpl { | 184 class Resource::ServiceWorkerResponseCachedMetadataHandler : public Resource::Ca
chedMetadataHandlerImpl { |
| 184 public: | 185 public: |
| 185 static Resource::CachedMetadataHandlerImpl* create(Resource* resource, Secur
ityOrigin* securityOrigin) | 186 static Resource::CachedMetadataHandlerImpl* create(Resource* resource, Secur
ityOrigin* securityOrigin) |
| 186 { | 187 { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 212 void Resource::ServiceWorkerResponseCachedMetadataHandler::sendToPlatform() | 213 void Resource::ServiceWorkerResponseCachedMetadataHandler::sendToPlatform() |
| 213 { | 214 { |
| 214 // We don't support sending the metadata to the platform when the response | 215 // We don't support sending the metadata to the platform when the response |
| 215 // was directly fetched via a ServiceWorker | 216 // was directly fetched via a ServiceWorker |
| 216 // (eg: FetchEvent.respondWith(fetch(FetchEvent.request))) to prevent an | 217 // (eg: FetchEvent.respondWith(fetch(FetchEvent.request))) to prevent an |
| 217 // attacker's Service Worker from poisoning the metadata cache of HTTPCache. | 218 // attacker's Service Worker from poisoning the metadata cache of HTTPCache. |
| 218 if (response().cacheStorageCacheName().isNull()) | 219 if (response().cacheStorageCacheName().isNull()) |
| 219 return; | 220 return; |
| 220 | 221 |
| 221 if (m_cachedMetadata) { | 222 if (m_cachedMetadata) { |
| 222 const Vector<char>& serializedData = m_cachedMetadata->serialize(); | 223 const Vector<char>& serializedData = m_cachedMetadata->serializedData(); |
| 223 Platform::current()->cacheMetadataInCacheStorage(response().url(), respo
nse().responseTime(), serializedData.data(), serializedData.size(), WebSecurityO
rigin(m_securityOrigin), response().cacheStorageCacheName()); | 224 Platform::current()->cacheMetadataInCacheStorage(response().url(), respo
nse().responseTime(), serializedData.data(), serializedData.size(), WebSecurityO
rigin(m_securityOrigin), response().cacheStorageCacheName()); |
| 224 } else { | 225 } else { |
| 225 Platform::current()->cacheMetadataInCacheStorage(response().url(), respo
nse().responseTime(), nullptr, 0, WebSecurityOrigin(m_securityOrigin), response(
).cacheStorageCacheName()); | 226 Platform::current()->cacheMetadataInCacheStorage(response().url(), respo
nse().responseTime(), nullptr, 0, WebSecurityOrigin(m_securityOrigin), response(
).cacheStorageCacheName()); |
| 226 } | 227 } |
| 227 } | 228 } |
| 228 | 229 |
| 229 class Resource::ResourceCallback final : public GarbageCollectedFinalized<Resour
ceCallback> { | 230 class Resource::ResourceCallback final : public GarbageCollectedFinalized<Resour
ceCallback> { |
| 230 public: | 231 public: |
| 231 static ResourceCallback& callbackHandler(); | 232 static ResourceCallback& callbackHandler(); |
| 232 DECLARE_TRACE(); | 233 DECLARE_TRACE(); |
| (...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 case Resource::TextTrack: | 1066 case Resource::TextTrack: |
| 1066 case Resource::Media: | 1067 case Resource::Media: |
| 1067 case Resource::Manifest: | 1068 case Resource::Manifest: |
| 1068 return false; | 1069 return false; |
| 1069 } | 1070 } |
| 1070 ASSERT_NOT_REACHED(); | 1071 ASSERT_NOT_REACHED(); |
| 1071 return false; | 1072 return false; |
| 1072 } | 1073 } |
| 1073 | 1074 |
| 1074 } // namespace blink | 1075 } // namespace blink |
| OLD | NEW |