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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp

Issue 2316573002: PlzNavigate: Support ResourceTiming API (Closed)
Patch Set: Rebase Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
6 rights reserved. 6 rights reserved.
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
8 8
9 This library is free software; you can redistribute it and/or 9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public 10 modify it under the terms of the GNU Library General Public
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, MainResource) \ 88 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, MainResource) \
89 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Manifest) \ 89 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Manifest) \
90 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Media) \ 90 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Media) \
91 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Raw) \ 91 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Raw) \
92 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Script) \ 92 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Script) \
93 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, SVGDocument) \ 93 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, SVGDocument) \
94 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \ 94 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \
95 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ 95 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \
96 } 96 }
97 97
98 bool IsCrossOrigin(const KURL& a, const KURL& b) {
99 RefPtr<SecurityOrigin> originA = SecurityOrigin::create(a);
100 RefPtr<SecurityOrigin> originB = SecurityOrigin::create(b);
101 return !originB->isSameSchemeHostPort(originA.get());
102 }
103
98 } // namespace 104 } // namespace
99 105
100 static void RecordSriResourceIntegrityMismatchEvent( 106 static void RecordSriResourceIntegrityMismatchEvent(
101 SriResourceIntegrityMismatchEvent event) { 107 SriResourceIntegrityMismatchEvent event) {
102 DEFINE_THREAD_SAFE_STATIC_LOCAL( 108 DEFINE_THREAD_SAFE_STATIC_LOCAL(
103 EnumerationHistogram, integrityHistogram, 109 EnumerationHistogram, integrityHistogram,
104 new EnumerationHistogram("sri.resource_integrity_mismatch_event", 110 new EnumerationHistogram("sri.resource_integrity_mismatch_event",
105 SriResourceIntegrityMismatchEventCount)); 111 SriResourceIntegrityMismatchEventCount));
106 integrityHistogram.count(event); 112 integrityHistogram.count(event);
107 } 113 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 // synchronous requests are always given the highest possible priority, as 182 // synchronous requests are always given the highest possible priority, as
177 // well as to ensure that there isn't priority churn if images move in and out 183 // well as to ensure that there isn't priority churn if images move in and out
178 // of the viewport, or is displayed more than once, both in and out of the 184 // of the viewport, or is displayed more than once, both in and out of the
179 // viewport. 185 // viewport.
180 return std::max(context().modifyPriorityForExperiments(priority), 186 return std::max(context().modifyPriorityForExperiments(priority),
181 request.resourceRequest().priority()); 187 request.resourceRequest().priority());
182 } 188 }
183 189
184 static void populateResourceTiming(ResourceTimingInfo* info, 190 static void populateResourceTiming(ResourceTimingInfo* info,
185 Resource* resource) { 191 Resource* resource) {
186 info->setInitialRequest(resource->resourceRequest()); 192 KURL initialURL = resource->response().redirectResponses().isEmpty()
193 ? resource->resourceRequest().url()
194 : resource->response().redirectResponses()[0].url();
195 info->setInitialURL(initialURL);
187 info->setFinalResponse(resource->response()); 196 info->setFinalResponse(resource->response());
188 } 197 }
189 198
190 static WebURLRequest::RequestContext requestContextFromType( 199 static WebURLRequest::RequestContext requestContextFromType(
191 bool isMainFrame, 200 bool isMainFrame,
192 Resource::Type type) { 201 Resource::Type type) {
193 switch (type) { 202 switch (type) {
194 case Resource::MainResource: 203 case Resource::MainResource:
195 if (!isMainFrame) 204 if (!isMainFrame)
196 return WebURLRequest::RequestContextIframe; 205 return WebURLRequest::RequestContextIframe;
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 return resource; 724 return resource;
716 } 725 }
717 726
718 void ResourceFetcher::storeResourceTimingInitiatorInformation( 727 void ResourceFetcher::storeResourceTimingInitiatorInformation(
719 Resource* resource) { 728 Resource* resource) {
720 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; 729 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name;
721 if (fetchInitiator == FetchInitiatorTypeNames::internal) 730 if (fetchInitiator == FetchInitiatorTypeNames::internal)
722 return; 731 return;
723 732
724 bool isMainResource = resource->getType() == Resource::MainResource; 733 bool isMainResource = resource->getType() == Resource::MainResource;
725 std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create( 734
726 fetchInitiator, monotonicallyIncreasingTime(), isMainResource); 735 // The request can already be fetched in a previous navigation. Thus
736 // startTime must be set accordingly.
737 double startTime = resource->resourceRequest().navigationStartTime()
738 ? resource->resourceRequest().navigationStartTime()
739 : monotonicallyIncreasingTime();
740
741 std::unique_ptr<ResourceTimingInfo> info =
742 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
727 743
728 if (resource->isCacheValidator()) { 744 if (resource->isCacheValidator()) {
729 const AtomicString& timingAllowOrigin = 745 const AtomicString& timingAllowOrigin =
730 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 746 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
731 if (!timingAllowOrigin.isEmpty()) 747 if (!timingAllowOrigin.isEmpty())
732 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 748 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
733 } 749 }
734 750
735 if (!isMainResource || 751 if (!isMainResource ||
736 context().updateTimingInfoForIFrameNavigation(info.get())) 752 context().updateTimingInfoForIFrameNavigation(info.get()))
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 if (finishReason == DidFinishFirstPartInMultipart) 1107 if (finishReason == DidFinishFirstPartInMultipart)
1092 moveResourceLoaderToNonBlocking(resource->loader()); 1108 moveResourceLoaderToNonBlocking(resource->loader());
1093 else 1109 else
1094 removeResourceLoader(resource->loader()); 1110 removeResourceLoader(resource->loader());
1095 DCHECK(!m_loaders.contains(resource->loader())); 1111 DCHECK(!m_loaders.contains(resource->loader()));
1096 DCHECK(finishReason == DidFinishFirstPartInMultipart || 1112 DCHECK(finishReason == DidFinishFirstPartInMultipart ||
1097 !m_nonBlockingLoaders.contains(resource->loader())); 1113 !m_nonBlockingLoaders.contains(resource->loader()));
1098 1114
1099 if (std::unique_ptr<ResourceTimingInfo> info = 1115 if (std::unique_ptr<ResourceTimingInfo> info =
1100 m_resourceTimingInfoMap.take(resource)) { 1116 m_resourceTimingInfoMap.take(resource)) {
1117 // Store redirect responses that were packed inside the final response.
1118 const Vector<ResourceResponse>& responses =
1119 resource->response().redirectResponses();
1120 for (size_t i = 0; i < responses.size(); ++i) {
1121 const KURL& newURL = i + 1 < responses.size()
1122 ? KURL(responses[i + 1].url())
1123 : resource->resourceRequest().url();
1124 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
1125 info->addRedirect(responses[i], crossOrigin);
1126 }
1127
1101 if (resource->response().isHTTP() && 1128 if (resource->response().isHTTP() &&
1102 resource->response().httpStatusCode() < 400) { 1129 resource->response().httpStatusCode() < 400) {
1103 populateResourceTiming(info.get(), resource); 1130 populateResourceTiming(info.get(), resource);
1104 info->setLoadFinishTime(finishTime); 1131 info->setLoadFinishTime(finishTime);
1105 // encodedDataLength == -1 means "not available". 1132 // encodedDataLength == -1 means "not available".
1106 // TODO(ricea): Find cases where it is not available but the 1133 // TODO(ricea): Find cases where it is not available but the
1107 // PerformanceResourceTiming spec requires it to be available and fix 1134 // PerformanceResourceTiming spec requires it to be available and fix
1108 // them. 1135 // them.
1109 info->addFinalTransferSize(encodedDataLength == -1 ? 0 1136 info->addFinalTransferSize(encodedDataLength == -1 ? 0
1110 : encodedDataLength); 1137 : encodedDataLength);
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 1314
1288 static bool isManualRedirectFetchRequest(const ResourceRequest& request) { 1315 static bool isManualRedirectFetchRequest(const ResourceRequest& request) {
1289 return request.fetchRedirectMode() == 1316 return request.fetchRedirectMode() ==
1290 WebURLRequest::FetchRedirectModeManual && 1317 WebURLRequest::FetchRedirectModeManual &&
1291 request.requestContext() == WebURLRequest::RequestContextFetch; 1318 request.requestContext() == WebURLRequest::RequestContextFetch;
1292 } 1319 }
1293 1320
1294 bool ResourceFetcher::willFollowRedirect( 1321 bool ResourceFetcher::willFollowRedirect(
1295 Resource* resource, 1322 Resource* resource,
1296 ResourceRequest& newRequest, 1323 ResourceRequest& newRequest,
1297 const ResourceResponse& redirectResponse, 1324 const ResourceResponse& redirectResponse) {
1298 int64_t encodedDataLength) {
1299 if (!isManualRedirectFetchRequest(resource->resourceRequest())) { 1325 if (!isManualRedirectFetchRequest(resource->resourceRequest())) {
1300 if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), 1326 if (!context().canRequest(resource->getType(), newRequest, newRequest.url(),
1301 resource->options(), resource->isUnusedPreload(), 1327 resource->options(), resource->isUnusedPreload(),
1302 FetchRequest::UseDefaultOriginRestrictionForType)) 1328 FetchRequest::UseDefaultOriginRestrictionForType))
1303 return false; 1329 return false;
1304 if (resource->options().corsEnabled == IsCORSEnabled) { 1330 if (resource->options().corsEnabled == IsCORSEnabled) {
1305 RefPtr<SecurityOrigin> sourceOrigin = resource->options().securityOrigin; 1331 RefPtr<SecurityOrigin> sourceOrigin = resource->options().securityOrigin;
1306 if (!sourceOrigin.get()) 1332 if (!sourceOrigin.get())
1307 sourceOrigin = context().getSecurityOrigin(); 1333 sourceOrigin = context().getSecurityOrigin();
1308 1334
(...skipping 10 matching lines...) Expand all
1319 return false; 1345 return false;
1320 } 1346 }
1321 } 1347 }
1322 if (resource->getType() == Resource::Image && 1348 if (resource->getType() == Resource::Image &&
1323 shouldDeferImageLoad(newRequest.url())) 1349 shouldDeferImageLoad(newRequest.url()))
1324 return false; 1350 return false;
1325 } 1351 }
1326 1352
1327 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 1353 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
1328 if (it != m_resourceTimingInfoMap.end()) { 1354 if (it != m_resourceTimingInfoMap.end()) {
1329 RefPtr<SecurityOrigin> originalSecurityOrigin = 1355 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1330 SecurityOrigin::create(redirectResponse.url()); 1356 it->value->addRedirect(redirectResponse, crossOrigin);
1331 RefPtr<SecurityOrigin> redirectedSecurityOrigin =
1332 SecurityOrigin::create(newRequest.url());
1333 bool crossOrigin = !redirectedSecurityOrigin->isSameSchemeHostPort(
1334 originalSecurityOrigin.get());
1335 it->value->addRedirect(redirectResponse, encodedDataLength, crossOrigin);
1336 } 1357 }
1337 newRequest.setAllowStoredCredentials(resource->options().allowCredentials == 1358 newRequest.setAllowStoredCredentials(resource->options().allowCredentials ==
1338 AllowStoredCredentials); 1359 AllowStoredCredentials);
1339 willSendRequest(resource->identifier(), newRequest, redirectResponse, 1360 willSendRequest(resource->identifier(), newRequest, redirectResponse,
1340 resource->options()); 1361 resource->options());
1341 return true; 1362 return true;
1342 } 1363 }
1343 1364
1344 void ResourceFetcher::willSendRequest(unsigned long identifier, 1365 void ResourceFetcher::willSendRequest(unsigned long identifier,
1345 ResourceRequest& newRequest, 1366 ResourceRequest& newRequest,
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 visitor->trace(m_context); 1592 visitor->trace(m_context);
1572 visitor->trace(m_archive); 1593 visitor->trace(m_archive);
1573 visitor->trace(m_loaders); 1594 visitor->trace(m_loaders);
1574 visitor->trace(m_nonBlockingLoaders); 1595 visitor->trace(m_nonBlockingLoaders);
1575 visitor->trace(m_documentResources); 1596 visitor->trace(m_documentResources);
1576 visitor->trace(m_preloads); 1597 visitor->trace(m_preloads);
1577 visitor->trace(m_resourceTimingInfoMap); 1598 visitor->trace(m_resourceTimingInfoMap);
1578 } 1599 }
1579 1600
1580 } // namespace blink 1601 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ResourceFetcher.h ('k') | third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698