Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index 3e51a7f819274f12beb1d2867d3c70d59086c5b3..4161341dbb711a0ab8f51e379a8050102cbb26d0 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 = createCacheIdentifier(); |
+ if (memoryCache()->resourceForURL(cacheIdentifier, url)) |
return; |
- if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(), request.options())) { |
+ if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(), request.options(), cacheIdentifier)) { |
Mike West
2014/10/24 12:43:00
cacheIdentifier should always be either first or l
nhiroki
2014/10/27 14:30:13
Done. I made "resourceForURL" receive "cacheIdenti
|
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 = createCacheIdentifier(); |
const KURL& url = request.url(); |
- if (Resource* oldResource = memoryCache()->resourceForURL(url)) |
+ if (Resource* oldResource = memoryCache()->resourceForURL(cacheIdentifier, url)) |
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()); |
} |
@@ -722,7 +726,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(createCacheIdentifier(), url); |
const RevalidationPolicy policy = determineRevalidationPolicy(type, request, resource.get()); |
switch (policy) { |
@@ -794,17 +798,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); |
@@ -907,6 +900,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()); |
@@ -915,12 +909,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 = createCacheIdentifier(); |
+ ASSERT(!memoryCache()->resourceForURL(cacheIdentifier, request.resourceRequest().url())); |
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; |
@@ -959,11 +955,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; |
@@ -1519,6 +1510,13 @@ const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() |
return options; |
} |
+String ResourceFetcher::createCacheIdentifier() const |
Mike West
2014/10/24 12:43:00
"create" seems wrong here. "get"?
nhiroki
2014/10/27 14:30:13
Done.
|
+{ |
+ if (isControlledByServiceWorker()) |
+ return String::number(serviceWorkerID()); |
+ return MemoryCache::defaultCacheIdentifier(); |
+} |
+ |
ResourceFetcher::DeadResourceStatsRecorder::DeadResourceStatsRecorder() |
: m_useCount(0) |
, m_revalidateCount(0) |