Index: Source/core/loader/cache/CachedResourceLoader.cpp |
diff --git a/Source/core/loader/cache/CachedResourceLoader.cpp b/Source/core/loader/cache/CachedResourceLoader.cpp |
index eb85f1d227758b739e3e6e7b5c2a3eefaf8cf76d..429a34b57b75b78dbed8d95410798d2609239a25 100644 |
--- a/Source/core/loader/cache/CachedResourceLoader.cpp |
+++ b/Source/core/loader/cache/CachedResourceLoader.cpp |
@@ -50,6 +50,7 @@ |
#include "MemoryCache.h" |
#include "Performance.h" |
#include "PingLoader.h" |
+#include "ResourceTimingInfo.h" |
#include "SecurityOrigin.h" |
#include "Settings.h" |
#include <wtf/MemoryInstrumentationHashMap.h> |
@@ -487,12 +488,12 @@ void CachedResourceLoader::storeResourceTimingInitiatorInformation(const CachedR |
if (resource->type() == CachedResource::MainResource) { |
// <iframe>s should report the initial navigation requested by the parent document, but not subsequent navigations. |
Pan
2013/04/23 15:27:38
I don't quite understand here, and seems it affect
Pan
2013/04/25 12:40:51
The problem is m_documentLoader->frameLoader()->st
|
if (frame()->ownerElement() && m_documentLoader->frameLoader()->stateMachine()->committingFirstRealLoad()) { |
- InitiatorInfo info = { frame()->ownerElement()->localName(), monotonicallyIncreasingTime() }; |
- m_initiatorMap.add(resource.get(), info); |
+ ResourceTimingInfo info(frame()->ownerElement()->localName(), monotonicallyIncreasingTime()); |
+ m_resourceTimingInfoMap.add(resource.get(), info); |
} |
} else { |
- InitiatorInfo info = { request.initiatorName(), monotonicallyIncreasingTime() }; |
- m_initiatorMap.add(resource.get(), info); |
+ ResourceTimingInfo info(request.initiatorName(), monotonicallyIncreasingTime()); |
+ m_resourceTimingInfoMap.add(resource.get(), info); |
} |
} |
@@ -674,22 +675,32 @@ void CachedResourceLoader::removeCachedResource(CachedResource* resource) const |
m_documentResources.remove(resource->url()); |
} |
+void CachedResourceLoader::redirectReceived(CachedResource* resource, const ResourceResponse& redirectResponse) |
+{ |
+ HashMap<CachedResource*, ResourceTimingInfo>::iterator infoIter = m_resourceTimingInfoMap.find(resource); |
+ if (infoIter != m_resourceTimingInfoMap.end()) |
+ infoIter->value.addRedirect(redirectResponse); |
+} |
+ |
void CachedResourceLoader::loadDone(CachedResource* resource) |
{ |
RefPtr<DocumentLoader> protectDocumentLoader(m_documentLoader); |
RefPtr<Document> protectDocument(m_document); |
if (resource && resource->response().isHTTP() && ((!resource->errorOccurred() && !resource->wasCanceled()) || resource->response().httpStatusCode() == 304)) { |
- HashMap<CachedResource*, InitiatorInfo>::iterator initiatorIt = m_initiatorMap.find(resource); |
- if (initiatorIt != m_initiatorMap.end()) { |
+ HashMap<CachedResource*, ResourceTimingInfo>::iterator infoIt = m_resourceTimingInfoMap.find(resource); |
+ if (infoIt != m_resourceTimingInfoMap.end()) { |
ASSERT(document()); |
Document* initiatorDocument = document(); |
if (resource->type() == CachedResource::MainResource) |
initiatorDocument = document()->parentDocument(); |
ASSERT(initiatorDocument); |
- const InitiatorInfo& info = initiatorIt->value; |
- initiatorDocument->domWindow()->performance()->addResourceTiming(info.name, initiatorDocument, resource->resourceRequest(), resource->response(), info.startTime, resource->loadFinishTime()); |
- m_initiatorMap.remove(initiatorIt); |
+ ResourceTimingInfo& info = infoIt->value; |
+ info.setInitialRequest(resource->resourceRequest()); |
+ info.setFinalResponse(resource->response()); |
+ info.setLoadFinishTime(resource->loadFinishTime()); |
+ initiatorDocument->domWindow()->performance()->addResourceTiming(info, initiatorDocument); |
+ m_resourceTimingInfoMap.remove(infoIt); |
} |
} |
@@ -922,8 +933,8 @@ void CachedResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) |
info.addMember(m_preloads, "preloads"); |
info.addMember(m_pendingPreloads, "pendingPreloads"); |
info.addMember(m_garbageCollectDocumentResourcesTimer, "garbageCollectDocumentResourcesTimer"); |
- // FIXME: m_initiatorMap has pointers to already deleted CachedResources |
- info.ignoreMember(m_initiatorMap); |
+ // FIXME: m_resourceTimingInfoMap has pointers to already deleted CachedResources |
+ info.ignoreMember(m_resourceTimingInfoMap); |
} |
const ResourceLoaderOptions& CachedResourceLoader::defaultCachedResourceOptions() |