Chromium Code Reviews| Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| index 801b324af00ce6304fd1890de44a39028a7fe8d5..69f26f6c0064ff74c646ba7ee215473eaa9096e6 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| @@ -752,7 +752,7 @@ Resource* ResourceFetcher::createResourceForLoading( |
| return resource; |
| } |
| -void ResourceFetcher::storeResourceTimingInitiatorInformation( |
| +void ResourceFetcher::storePerformanceTimingInitiatorInformation( |
| Resource* resource) { |
| const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; |
| if (fetchInitiator == FetchInitiatorTypeNames::internal) |
| @@ -779,6 +779,8 @@ void ResourceFetcher::storeResourceTimingInitiatorInformation( |
| if (!isMainResource || |
| context().updateTimingInfoForIFrameNavigation(info.get())) |
| m_resourceTimingInfoMap.add(resource, std::move(info)); |
| + else |
| + m_mainResourceTimingInfoMap.add(resource->identifier(), std::move(info)); |
| } |
| ResourceFetcher::RevalidationPolicy |
| @@ -1120,6 +1122,16 @@ ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { |
| return m_archive ? m_archive->mainResource() : nullptr; |
| } |
| +ResourceTimingInfo* ResourceFetcher::getMainResourceTimingInfo( |
| + unsigned long identifier) { |
| + MainResourceTimingInfoMap::iterator it = |
| + m_mainResourceTimingInfoMap.find(identifier); |
| + if (it != m_mainResourceTimingInfoMap.end()) { |
| + return it->value.get(); |
| + } |
| + return nullptr; |
| +} |
| + |
| void ResourceFetcher::didFinishLoading(Resource* resource, |
| double finishTime, |
| int64_t encodedDataLength, |
| @@ -1138,6 +1150,22 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
| DCHECK(finishReason == DidFinishFirstPartInMultipart || |
| !m_nonBlockingLoaders.contains(resource->loader())); |
| + MainResourceTimingInfoMap::iterator it = |
| + m_mainResourceTimingInfoMap.find(resource->identifier()); |
| + if (it != m_mainResourceTimingInfoMap.end()) { |
| + // Store redirect responses that were packed inside the final response. |
|
kinuko
2016/11/30 07:34:54
We seem to be duplicating the almost same code her
sunjian
2016/12/01 21:21:59
Done.
|
| + const Vector<ResourceResponse>& responses = |
| + resource->response().redirectResponses(); |
| + for (size_t i = 0; i < responses.size(); ++i) { |
| + const KURL& newURL = i + 1 < responses.size() |
| + ? KURL(responses[i + 1].url()) |
| + : resource->resourceRequest().url(); |
| + bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL); |
| + it->value->addRedirect(responses[i], crossOrigin); |
| + } |
| + it->value->addFinalTransferSize( |
| + encodedDataLength == -1 ? 0 : encodedDataLength); |
| + } |
| if (std::unique_ptr<ResourceTimingInfo> info = |
| m_resourceTimingInfoMap.take(resource)) { |
| // Store redirect responses that were packed inside the final response. |
| @@ -1314,7 +1342,7 @@ bool ResourceFetcher::startLoad(Resource* resource) { |
| else |
| m_nonBlockingLoaders.add(loader); |
| - storeResourceTimingInitiatorInformation(resource); |
| + storePerformanceTimingInitiatorInformation(resource); |
| resource->setFetcherSecurityOrigin(sourceOrigin); |
| loader->activateCacheAwareLoadingIfNeeded(request); |
| @@ -1403,6 +1431,13 @@ bool ResourceFetcher::willFollowRedirect( |
| bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url()); |
| it->value->addRedirect(redirectResponse, crossOrigin); |
| } |
| + MainResourceTimingInfoMap::iterator itt = |
| + m_mainResourceTimingInfoMap.find(resource->identifier()); |
| + if (itt != m_mainResourceTimingInfoMap.end()) { |
| + bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url()); |
| + itt->value->addRedirect(redirectResponse, crossOrigin); |
| + } |
| + |
| newRequest.setAllowStoredCredentials(resource->options().allowCredentials == |
| AllowStoredCredentials); |
| willSendRequest(resource->identifier(), newRequest, redirectResponse, |