Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index 5b56f90aefb2732d0711b3ef66ea9b06634e8958..95158a23e22b6aafc316d3055dad7bfeeccc8fe4 100644 |
--- a/Source/core/fetch/ResourceFetcher.cpp |
+++ b/Source/core/fetch/ResourceFetcher.cpp |
@@ -156,7 +156,7 @@ static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest |
return ResourceLoadPriorityUnresolved; |
} |
-static Resource* resourceFromDataURIRequest(const ResourceRequest& request, const ResourceLoaderOptions& resourceOptions) |
+static Resource* resourceFromDataURIRequest(const ResourceRequest& request, const ResourceLoaderOptions& resourceOptions, const String& cacheIdentifier) |
{ |
const KURL& url = request.url(); |
ASSERT(url.protocolIsData()); |
@@ -173,6 +173,7 @@ static Resource* resourceFromDataURIRequest(const ResourceRequest& request, cons |
resource->responseReceived(response); |
if (data->size()) |
resource->setResourceBuffer(data); |
+ resource->setCacheIdentifier(cacheIdentifier); |
resource->finish(); |
return resource; |
} |
@@ -330,10 +331,11 @@ void ResourceFetcher::preCacheDataURIImage(const FetchRequest& request) |
const KURL& url = request.resourceRequest().url(); |
ASSERT(url.protocolIsData()); |
- if (memoryCache()->resourceForURL(url)) |
+ const String cacheIdentifier = getCacheIdentifier(); |
+ if (memoryCache()->resourceForURL(url, cacheIdentifier)) |
return; |
- if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(), request.options())) { |
+ if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(), request.options(), cacheIdentifier)) { |
memoryCache()->add(resource); |
scheduleDocumentResourcesGC(); |
} |
@@ -424,8 +426,9 @@ ResourcePtr<RawResource> ResourceFetcher::fetchTextTrack(FetchRequest& request) |
void ResourceFetcher::preCacheSubstituteDataForMainResource(const FetchRequest& request, const SubstituteData& substituteData) |
{ |
+ const String cacheIdentifier = getCacheIdentifier(); |
const KURL& url = request.url(); |
- if (Resource* oldResource = memoryCache()->resourceForURL(url)) |
+ if (Resource* oldResource = memoryCache()->resourceForURL(url, cacheIdentifier)) |
memoryCache()->remove(oldResource); |
ResourceResponse response(url, substituteData.mimeType(), substituteData.content()->size(), substituteData.textEncoding(), emptyString()); |
@@ -436,6 +439,7 @@ void ResourceFetcher::preCacheSubstituteDataForMainResource(const FetchRequest& |
resource->responseReceived(response); |
if (substituteData.content()->size()) |
resource->setResourceBuffer(substituteData.content()); |
+ resource->setCacheIdentifier(cacheIdentifier); |
resource->finish(); |
memoryCache()->add(resource.get()); |
} |
@@ -730,7 +734,7 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc |
} |
// See if we can use an existing resource from the cache. |
- ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); |
+ ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url, getCacheIdentifier()); |
const RevalidationPolicy policy = determineRevalidationPolicy(type, request, resource.get()); |
switch (policy) { |
@@ -802,17 +806,6 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc |
ASSERT(policy != Use || m_documentLoader->substituteData().isValid()); |
ASSERT(policy != Revalidate); |
memoryCache()->remove(resource.get()); |
- } else { |
- // Remove a resource to be handled by Service Worker from the cache to |
- // prevent reuse because Service Worker can serve an arbitrary resource |
- // for an URL and pollute a memory cache entry. |
- // FIXME: isControlledByServiceWorker() always returns false on main |
- // resource request, but main resource is always removed from the cache |
- // as the above comment (http://crbug.com/388375). |
- if (isControlledByServiceWorker()) { |
- ASSERT(policy == Load || policy == Reload); |
- memoryCache()->remove(resource.get()); |
- } |
} |
requestLoadStarted(resource.get(), request, policy == Use ? ResourceLoadingFromCache : ResourceLoadingFromNetwork); |
@@ -915,6 +908,7 @@ ResourcePtr<Resource> ResourceFetcher::createResourceForRevalidation(const Fetch |
WTF_LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource.get(), resource); |
newResource->setResourceToRevalidate(resource); |
+ newResource->setCacheIdentifier(resource->cacheIdentifier()); |
memoryCache()->remove(resource); |
memoryCache()->add(newResource.get()); |
@@ -923,12 +917,14 @@ ResourcePtr<Resource> ResourceFetcher::createResourceForRevalidation(const Fetch |
ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(Resource::Type type, FetchRequest& request, const String& charset) |
{ |
- ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url())); |
+ const String cacheIdentifier = getCacheIdentifier(); |
+ ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cacheIdentifier)); |
WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceRequest().url().elidedString().latin1().data()); |
addAdditionalRequestHeaders(request.mutableResourceRequest(), type); |
ResourcePtr<Resource> resource = createResource(type, request.resourceRequest(), charset); |
+ resource->setCacheIdentifier(cacheIdentifier); |
memoryCache()->add(resource.get()); |
return resource; |
@@ -967,11 +963,6 @@ ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy |
if (!existingResource) |
return Load; |
- // FIXME: Currently caching for a resource to be handled by Service Worker |
- // is disabled (http://crbug.com/388375). |
- if (isControlledByServiceWorker()) |
- return Reload; |
- |
// We already have a preload going for this URL. |
if (fetchRequest.forPreload() && existingResource->isPreloaded()) |
return Use; |
@@ -1527,6 +1518,13 @@ const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() |
return options; |
} |
+String ResourceFetcher::getCacheIdentifier() const |
+{ |
+ if (isControlledByServiceWorker()) |
+ return String::number(serviceWorkerID()); |
+ return MemoryCache::defaultCacheIdentifier(); |
+} |
+ |
ResourceFetcher::DeadResourceStatsRecorder::DeadResourceStatsRecorder() |
: m_useCount(0) |
, m_revalidateCount(0) |