Index: Source/core/fetch/Resource.cpp |
diff --git a/Source/core/fetch/Resource.cpp b/Source/core/fetch/Resource.cpp |
index 34d307d1c78f046a2526726fa3fa9ba79dd47ebb..6352a96d177fb45b7ab218bc80394938992cae2c 100644 |
--- a/Source/core/fetch/Resource.cpp |
+++ b/Source/core/fetch/Resource.cpp |
@@ -96,6 +96,48 @@ static inline bool shouldUpdateHeaderAfterRevalidation(const AtomicString& heade |
DEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, cachedResourceLeakCounter, ("Resource")); |
unsigned Resource::s_instanceCount = 0; |
+class Resource::CacheHandler : public CachedMetadataHandler { |
+public: |
+ static PassOwnPtr<CacheHandler> create(Resource* resource) |
+ { |
+ return adoptPtr(new CacheHandler(resource)); |
+ } |
+ ~CacheHandler() override { } |
+ void setCachedMetadata(unsigned, const char*, size_t, CacheType) override; |
+ void clearCachedMetadata(CacheType) override; |
+ CachedMetadata* cachedMetadata(unsigned) const override; |
+ String encoding() const override; |
+ |
+private: |
+ explicit CacheHandler(Resource*); |
+ Resource* m_resource; |
+}; |
+ |
+Resource::CacheHandler::CacheHandler(Resource* resource) |
+ : m_resource(resource) |
+{ |
+} |
+ |
+void Resource::CacheHandler::setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, CacheType type) |
+{ |
+ m_resource->setCachedMetadata(dataTypeID, data, size, type); |
+} |
+ |
+void Resource::CacheHandler::clearCachedMetadata(CacheType type) |
+{ |
+ m_resource->clearCachedMetadata(type); |
+} |
+ |
+CachedMetadata* Resource::CacheHandler::cachedMetadata(unsigned dataTypeID) const |
+{ |
+ return m_resource->cachedMetadata(dataTypeID); |
+} |
+ |
+String Resource::CacheHandler::encoding() const |
+{ |
+ return m_resource->encoding(); |
+} |
+ |
Resource::Resource(const ResourceRequest& request, Type type) |
: m_resourceRequest(request) |
, m_responseTimestamp(currentTime()) |
@@ -129,6 +171,10 @@ Resource::Resource(const ResourceRequest& request, Type type) |
#endif |
memoryCache()->registerLiveResource(*this); |
+ // Currently we support the metadata caching only for HTTP family. |
+ if (m_resourceRequest.url().protocolIsInHTTPFamily()) |
+ m_cacheHandler = CacheHandler::create(this); |
+ |
if (!m_resourceRequest.url().hasFragmentIdentifier()) |
return; |
KURL urlForCache = MemoryCache::removeFragmentIdentifierIfNeeded(m_resourceRequest.url()); |
@@ -420,7 +466,12 @@ void Resource::setSerializedCachedMetadata(const char* data, size_t size) |
m_cachedMetadata = CachedMetadata::deserialize(data, size); |
} |
-void Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, MetadataCacheType cacheType) |
+CachedMetadataHandler* Resource::cacheHandler() |
+{ |
+ return m_cacheHandler.get(); |
+} |
+ |
+void Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, CachedMetadataHandler::CacheType cacheType) |
{ |
// Currently, only one type of cached metadata per resource is supported. |
// If the need arises for multiple types of metadata per resource this could |
@@ -434,17 +485,17 @@ void Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t s |
// from poisoning the metadata cache. |
// FIXME: Support sending the metadata even if the response was fetched via |
// a ServiceWorker. https://crbug.com/448706 |
- if (cacheType == SendToPlatform && !m_response.wasFetchedViaServiceWorker()) { |
+ if (cacheType == CachedMetadataHandler::SendToPlatform && !m_response.wasFetchedViaServiceWorker()) { |
const Vector<char>& serializedData = m_cachedMetadata->serialize(); |
blink::Platform::current()->cacheMetadata(m_response.url(), m_response.responseTime(), serializedData.data(), serializedData.size()); |
} |
} |
-void Resource::clearCachedMetadata(MetadataCacheType cacheType) |
+void Resource::clearCachedMetadata(CachedMetadataHandler::CacheType cacheType) |
{ |
m_cachedMetadata.clear(); |
- if (cacheType == SendToPlatform) |
+ if (cacheType == CachedMetadataHandler::SendToPlatform) |
blink::Platform::current()->cacheMetadata(m_response.url(), m_response.responseTime(), 0, 0); |
} |