Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Unified Diff: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp

Issue 2316573002: PlzNavigate: Support ResourceTiming API (Closed)
Patch Set: Move redirect response inside the final response. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..c7fd3a2f6ea0659eaa96da1758992e5671834b7f 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();
Nate Chapin 2016/09/08 18:41:13 Any reason not to use: double startTime = resourc
arthursonzogni 2016/09/09 12:45:33 There is no particular reasons. I will update it.
+
+ // The request can already be fetched in a previous navigation. Thus
+ // startTime must be set accordingly.
+ if (resource->resourceRequest().navigationStartTime())
+ startTime = resource->resourceRequest().navigationStartTime();
+
+ std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
if (resource->isCacheValidator()) {
const AtomicString& timingAllowOrigin = resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
@@ -931,6 +945,15 @@ void ResourceFetcher::didFinishLoading(Resource* resource, double finishTime, in
DCHECK(finishReason == DidFinishFirstPartInMultipart || !m_nonBlockingLoaders.contains(resource->loader()));
if (std::unique_ptr<ResourceTimingInfo> info = m_resourceTimingInfoMap.take(resource)) {
+
+ // Store redirect responses that were packed inside the final response.
+ const std::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);
+ info->addRedirect(responses[i], crossOrigin);
+ }
+
if (resource->response().isHTTP() && resource->response().httpStatusCode() < 400) {
populateResourceTiming(info.get(), resource);
info->setLoadFinishTime(finishTime);
@@ -1082,7 +1105,7 @@ static bool isManualRedirectFetchRequest(const ResourceRequest& request)
return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual && request.requestContext() == WebURLRequest::RequestContextFetch;
}
-bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& newRequest, const ResourceResponse& redirectResponse, int64_t encodedDataLength)
+bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
{
if (!isManualRedirectFetchRequest(resource->resourceRequest())) {
if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), resource->options(), resource->isUnusedPreload(), FetchRequest::UseDefaultOriginRestrictionForType))
@@ -1106,10 +1129,8 @@ 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());
- it->value->addRedirect(redirectResponse, encodedDataLength, crossOrigin);
+ bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
+ it->value->addRedirect(redirectResponse, crossOrigin);
}
newRequest.setAllowStoredCredentials(resource->options().allowCredentials == AllowStoredCredentials);
willSendRequest(resource->identifier(), newRequest, redirectResponse, resource->options());

Powered by Google App Engine
This is Rietveld 408576698