| 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 8c5fbea3b7acbaf24b5ff48310298d3fbbfb94ed..deac43c1c1cf815f5cd52c4cdb25639e996f79f1 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| @@ -777,6 +777,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
|
| @@ -1118,6 +1120,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,
|
| @@ -1136,6 +1148,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.
|
| + 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.
|
| @@ -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,
|
|
|