| Index: Source/core/loader/cache/CachedResourceLoader.cpp
|
| diff --git a/Source/core/loader/cache/CachedResourceLoader.cpp b/Source/core/loader/cache/CachedResourceLoader.cpp
|
| index 1b0681bb57e0b98232e05c9448ba41cd3d209005..f04e2df3716748f0f63b8b2aadecc2f648326eb7 100644
|
| --- a/Source/core/loader/cache/CachedResourceLoader.cpp
|
| +++ b/Source/core/loader/cache/CachedResourceLoader.cpp
|
| @@ -58,6 +58,7 @@
|
| #include "core/page/DOMWindow.h"
|
| #include "core/page/Frame.h"
|
| #include "core/page/Performance.h"
|
| +#include "core/page/ResourceTimingInfo.h"
|
| #include "core/page/Settings.h"
|
| #include "core/platform/Logging.h"
|
| #include "public/platform/Platform.h"
|
| @@ -675,18 +676,17 @@ CachedResourceHandle<CachedResource> CachedResourceLoader::loadResource(CachedRe
|
|
|
| void CachedResourceLoader::storeResourceTimingInitiatorInformation(const CachedResourceHandle<CachedResource>& resource, const CachedResourceRequest& request)
|
| {
|
| - CachedResourceInitiatorInfo info = request.options().initiatorInfo;
|
| - info.startTime = monotonicallyIncreasingTime();
|
| + RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(request.options().initiatorInfo.name, monotonicallyIncreasingTime());
|
|
|
| if (resource->type() == CachedResource::MainResource) {
|
| // <iframe>s should report the initial navigation requested by the parent document, but not subsequent navigations.
|
| if (frame()->ownerElement() && !frame()->ownerElement()->loadedNonEmptyDocument()) {
|
| - info.name = frame()->ownerElement()->localName();
|
| - m_initiatorMap.add(resource.get(), info);
|
| + info->setInitiatorType(frame()->ownerElement()->localName());
|
| + m_resourceTimingInfoMap.add(resource.get(), info);
|
| frame()->ownerElement()->didLoadNonEmptyDocument();
|
| }
|
| } else {
|
| - m_initiatorMap.add(resource.get(), info);
|
| + m_resourceTimingInfoMap.add(resource.get(), info);
|
| }
|
| }
|
|
|
| @@ -858,22 +858,32 @@ CachePolicy CachedResourceLoader::cachePolicy(CachedResource::Type type) const
|
| return CachePolicyVerify;
|
| }
|
|
|
| +void CachedResourceLoader::redirectReceived(CachedResource* resource, const ResourceResponse& redirectResponse)
|
| +{
|
| + ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
|
| + if (it != m_resourceTimingInfoMap.end())
|
| + it->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*, CachedResourceInitiatorInfo>::iterator initiatorIt = m_initiatorMap.find(resource);
|
| - if (initiatorIt != m_initiatorMap.end()) {
|
| + ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
|
| + if (it != m_resourceTimingInfoMap.end()) {
|
| ASSERT(document());
|
| Document* initiatorDocument = document();
|
| if (resource->type() == CachedResource::MainResource)
|
| initiatorDocument = document()->parentDocument();
|
| ASSERT(initiatorDocument);
|
| - const CachedResourceInitiatorInfo& info = initiatorIt->value;
|
| - initiatorDocument->domWindow()->performance()->addResourceTiming(info.name, initiatorDocument, resource->resourceRequest(), resource->response(), info.startTime, resource->loadFinishTime());
|
| - m_initiatorMap.remove(initiatorIt);
|
| + RefPtr<ResourceTimingInfo> info = it->value;
|
| + info->setInitialRequest(resource->resourceRequest());
|
| + info->setFinalResponse(resource->response());
|
| + info->setLoadFinishTime(resource->loadFinishTime());
|
| + initiatorDocument->domWindow()->performance()->addResourceTiming(*info, initiatorDocument);
|
| + m_resourceTimingInfoMap.remove(it);
|
| }
|
| }
|
|
|
|
|