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