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 9b449c347b97a45570c5fdd5c5f113afc134a2b6..4f079fd6822a8ff2ad20b707349a6ae3c2d58113 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| @@ -92,6 +92,13 @@ enum SriResourceIntegrityMismatchEvent { |
| DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ |
| } |
| +bool IsCrossOrigin(const KURL& a, const KURL& b) |
| +{ |
| + RefPtr<SecurityOrigin> originA = SecurityOrigin::create(a); |
| + RefPtr<SecurityOrigin> originB = SecurityOrigin::create(b); |
| + return !originB->isSameSchemeHostPort(originA.get()); |
| +} |
| + |
| } // namespace |
| static void RecordSriResourceIntegrityMismatchEvent(SriResourceIntegrityMismatchEvent event) |
| @@ -608,7 +615,14 @@ void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource |
| return; |
| bool isMainResource = resource->getType() == Resource::MainResource; |
| - std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create(fetchInitiator, monotonicallyIncreasingTime(), isMainResource); |
| + double startTime = monotonicallyIncreasingTime(); |
| + |
| + // The request can already be fetched in a previous navigation. Thus |
| + // startTime must be set accordingly. |
| + if (resource->resourceRequest().previousNavigationStart()) |
| + startTime = resource->resourceRequest().previousNavigationStart(); |
| + |
| + std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); |
| if (resource->isCacheValidator()) { |
| const AtomicString& timingAllowOrigin = resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); |
| @@ -620,6 +634,23 @@ void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource |
| m_resourceTimingInfoMap.add(resource, std::move(info)); |
| } |
| +void ResourceFetcher::storeResourceTimingPreviousRedirects(Resource* resource) |
| +{ |
| + ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
| + if (it == m_resourceTimingInfoMap.end()) |
| + return; |
| + |
| + const WebVector<WebURLResponse>& responses = resource->resourceRequest().previousResponses(); |
| + for (size_t i = 0; i < responses.size(); ++i) { |
| + const ResourceResponse& response = responses[i].toResourceResponse(); |
| + const KURL& newURL = i + 1 < responses.size() ? KURL(responses[i + 1].url()) : resource->resourceRequest().url(); |
| + // long long encodedDataLength = response.resourceLoadInfo()->encodedDataLength; |
| + long long encodedDataLength = 0; |
|
arthursonzogni
2016/09/06 10:00:48
Oops, I didn't see that I forgot to transmit the e
|
| + bool crossOrigin = IsCrossOrigin(response.url(), newURL); |
| + it->value->addRedirect(response, encodedDataLength, crossOrigin); |
| + } |
| +} |
| + |
| ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResource, bool isStaticData) const |
| { |
| const ResourceRequest& request = fetchRequest.resourceRequest(); |
| @@ -1040,6 +1071,7 @@ bool ResourceFetcher::startLoad(Resource* resource) |
| m_nonBlockingLoaders.add(loader); |
| storeResourceTimingInitiatorInformation(resource); |
| + storeResourceTimingPreviousRedirects(resource); |
| resource->setFetcherSecurityOrigin(context().getSecurityOrigin()); |
| loader->start(request, context().loadingTaskRunner(), context().defersLoading()); |
| return true; |
| @@ -1106,9 +1138,7 @@ bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& ne |
| ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
| if (it != m_resourceTimingInfoMap.end()) { |
| - RefPtr<SecurityOrigin> originalSecurityOrigin = SecurityOrigin::create(redirectResponse.url()); |
| - RefPtr<SecurityOrigin> redirectedSecurityOrigin = SecurityOrigin::create(newRequest.url()); |
| - bool crossOrigin = !redirectedSecurityOrigin->isSameSchemeHostPort(originalSecurityOrigin.get()); |
| + bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url()); |
| it->value->addRedirect(redirectResponse, encodedDataLength, crossOrigin); |
| } |
| newRequest.setAllowStoredCredentials(resource->options().allowCredentials == AllowStoredCredentials); |