| 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);
|
| }
|
|
|
|
|