Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index 4619b687ae461a952b4de2b2ef6aeb8b65001e7c..773a5b0f90a9600973748682ae5a18925fe8b7c2 100644 |
--- a/Source/core/fetch/ResourceFetcher.cpp |
+++ b/Source/core/fetch/ResourceFetcher.cpp |
@@ -165,6 +165,22 @@ static Resource* resourceFromDataURIRequest(const ResourceRequest& request, cons |
return resource; |
} |
+static void reportResourceTiming(ResourceTimingInfo* info, Resource* resource, double finishTime, Document* initiatorDocument, bool clearLoadTimings) |
+{ |
+ if (resource->type() == Resource::MainResource) |
+ initiatorDocument = initiatorDocument->parentDocument(); |
+ ASSERT(initiatorDocument); |
+ info->setInitialRequest(resource->resourceRequest()); |
+ info->setFinalResponse(resource->response()); |
+ if (clearLoadTimings) |
+ info->clearLoadTimings(); |
+ info->setLoadFinishTime(finishTime); |
+ if (DOMWindow* initiatorWindow = initiatorDocument->domWindow()) { |
+ if (Performance* performance = initiatorWindow->performance()) |
+ performance->addResourceTiming(*info, initiatorDocument); |
+ } |
+} |
+ |
ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) |
: m_document(0) |
, m_documentLoader(documentLoader) |
@@ -618,8 +634,15 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc |
return 0; |
} |
- if (!request.resourceRequest().url().protocolIsData()) |
+ if (!request.resourceRequest().url().protocolIsData()) { |
+ if (policy == Use && !m_validatedURLs.contains(request.resourceRequest().url())) { |
+ // Resources loaded from memory cache should be reported the first time they're used. |
+ RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(request.options().initiatorInfo.name, monotonicallyIncreasingTime()); |
+ reportResourceTiming(info.get(), resource.get(), monotonicallyIncreasingTime(), document(), true); |
+ } |
+ |
m_validatedURLs.add(request.resourceRequest().url()); |
+ } |
ASSERT(resource->url() == url.string()); |
m_documentResources.set(resource->url(), resource); |
@@ -963,19 +986,9 @@ void ResourceFetcher::didLoadResource(Resource* resource) |
if (resource && resource->response().isHTTP() && ((!resource->errorOccurred() && !resource->wasCanceled()) || resource->response().httpStatusCode() == 304) && document()) { |
ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
if (it != m_resourceTimingInfoMap.end()) { |
- Document* initiatorDocument = document(); |
- if (resource->type() == Resource::MainResource) |
- initiatorDocument = document()->parentDocument(); |
- ASSERT(initiatorDocument); |
RefPtr<ResourceTimingInfo> info = it->value; |
m_resourceTimingInfoMap.remove(it); |
- info->setInitialRequest(resource->resourceRequest()); |
- info->setFinalResponse(resource->response()); |
- info->setLoadFinishTime(resource->loadFinishTime()); |
- if (DOMWindow* initiatorWindow = initiatorDocument->domWindow()) { |
- if (Performance* performance = initiatorWindow->performance()) |
- performance->addResourceTiming(*info, initiatorDocument); |
- } |
+ reportResourceTiming(info.get(), resource, resource->loadFinishTime(), document(), false); |
} |
} |