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

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

Issue 2511313002: transferSize implementation (Closed)
Patch Set: addressed comments Created 4 years 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \ 96 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \
97 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ 97 DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \
98 } 98 }
99 99
100 bool IsCrossOrigin(const KURL& a, const KURL& b) { 100 bool IsCrossOrigin(const KURL& a, const KURL& b) {
101 RefPtr<SecurityOrigin> originA = SecurityOrigin::create(a); 101 RefPtr<SecurityOrigin> originA = SecurityOrigin::create(a);
102 RefPtr<SecurityOrigin> originB = SecurityOrigin::create(b); 102 RefPtr<SecurityOrigin> originB = SecurityOrigin::create(b);
103 return !originB->isSameSchemeHostPort(originA.get()); 103 return !originB->isSameSchemeHostPort(originA.get());
104 } 104 }
105 105
106 void addRedirectsToTimingInfo(Resource* resource, ResourceTimingInfo* info) {
107 // Store redirect responses that were packed inside the final response.
108 const Vector<ResourceResponse>& responses =
109 resource->response().redirectResponses();
110 for (size_t i = 0; i < responses.size(); ++i) {
111 const KURL& newURL = i + 1 < responses.size()
112 ? KURL(responses[i + 1].url())
113 : resource->resourceRequest().url();
114 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
115 info->addRedirect(responses[i], crossOrigin);
116 }
117 }
118
106 } // namespace 119 } // namespace
107 120
108 static void RecordSriResourceIntegrityMismatchEvent( 121 static void RecordSriResourceIntegrityMismatchEvent(
109 SriResourceIntegrityMismatchEvent event) { 122 SriResourceIntegrityMismatchEvent event) {
110 DEFINE_THREAD_SAFE_STATIC_LOCAL( 123 DEFINE_THREAD_SAFE_STATIC_LOCAL(
111 EnumerationHistogram, integrityHistogram, 124 EnumerationHistogram, integrityHistogram,
112 new EnumerationHistogram("sri.resource_integrity_mismatch_event", 125 new EnumerationHistogram("sri.resource_integrity_mismatch_event",
113 SriResourceIntegrityMismatchEventCount)); 126 SriResourceIntegrityMismatchEventCount));
114 integrityHistogram.count(event); 127 integrityHistogram.count(event);
115 } 128 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 NOTREACHED(); 249 NOTREACHED();
237 return WebURLRequest::RequestContextSubresource; 250 return WebURLRequest::RequestContextSubresource;
238 } 251 }
239 252
240 ResourceFetcher::ResourceFetcher(FetchContext* newContext) 253 ResourceFetcher::ResourceFetcher(FetchContext* newContext)
241 : m_context(newContext), 254 : m_context(newContext),
242 m_archive(context().isMainFrame() ? nullptr : context().archive()), 255 m_archive(context().isMainFrame() ? nullptr : context().archive()),
243 m_resourceTimingReportTimer( 256 m_resourceTimingReportTimer(
244 this, 257 this,
245 &ResourceFetcher::resourceTimingReportTimerFired), 258 &ResourceFetcher::resourceTimingReportTimerFired),
259 m_mainResourceIdentifier(0),
246 m_autoLoadImages(true), 260 m_autoLoadImages(true),
247 m_imagesEnabled(true), 261 m_imagesEnabled(true),
248 m_allowStaleResources(false), 262 m_allowStaleResources(false),
249 m_imageFetched(false) { 263 m_imageFetched(false) {
250 ThreadState::current()->registerPreFinalizer(this); 264 ThreadState::current()->registerPreFinalizer(this);
251 } 265 }
252 266
253 ResourceFetcher::~ResourceFetcher() {} 267 ResourceFetcher::~ResourceFetcher() {}
254 268
255 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const { 269 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const {
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 760
747 // - Don't add main resource to cache to prevent reuse. 761 // - Don't add main resource to cache to prevent reuse.
748 // - Don't add the resource if its body will not be stored. 762 // - Don't add the resource if its body will not be stored.
749 if (factory.type() != Resource::MainResource && 763 if (factory.type() != Resource::MainResource &&
750 request.options().dataBufferingPolicy != DoNotBufferData) { 764 request.options().dataBufferingPolicy != DoNotBufferData) {
751 memoryCache()->add(resource); 765 memoryCache()->add(resource);
752 } 766 }
753 return resource; 767 return resource;
754 } 768 }
755 769
756 void ResourceFetcher::storeResourceTimingInitiatorInformation( 770 void ResourceFetcher::storePerformanceTimingInitiatorInformation(
757 Resource* resource) { 771 Resource* resource) {
758 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; 772 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name;
759 if (fetchInitiator == FetchInitiatorTypeNames::internal) 773 if (fetchInitiator == FetchInitiatorTypeNames::internal)
760 return; 774 return;
761 775
762 bool isMainResource = resource->getType() == Resource::MainResource; 776 bool isMainResource = resource->getType() == Resource::MainResource;
763 777
764 // The request can already be fetched in a previous navigation. Thus 778 // The request can already be fetched in a previous navigation. Thus
765 // startTime must be set accordingly. 779 // startTime must be set accordingly.
766 double startTime = resource->resourceRequest().navigationStartTime() 780 double startTime = resource->resourceRequest().navigationStartTime()
767 ? resource->resourceRequest().navigationStartTime() 781 ? resource->resourceRequest().navigationStartTime()
768 : monotonicallyIncreasingTime(); 782 : monotonicallyIncreasingTime();
769 783
770 std::unique_ptr<ResourceTimingInfo> info = 784 std::unique_ptr<ResourceTimingInfo> info =
771 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 785 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
772 786
773 if (resource->isCacheValidator()) { 787 if (resource->isCacheValidator()) {
774 const AtomicString& timingAllowOrigin = 788 const AtomicString& timingAllowOrigin =
775 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 789 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
776 if (!timingAllowOrigin.isEmpty()) 790 if (!timingAllowOrigin.isEmpty())
777 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 791 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
778 } 792 }
779 793
780 if (!isMainResource || 794 if (!isMainResource ||
781 context().updateTimingInfoForIFrameNavigation(info.get())) 795 context().updateTimingInfoForIFrameNavigation(info.get())) {
782 m_resourceTimingInfoMap.add(resource, std::move(info)); 796 m_resourceTimingInfoMap.add(resource, std::move(info));
797 } else {
798 DCHECK(!m_mainResourceTimingInfo);
799 m_mainResourceTimingInfo = std::move(info);
800 m_mainResourceIdentifier = resource->identifier();
801 DCHECK(m_mainResourceIdentifier);
802 }
783 } 803 }
784 804
785 ResourceFetcher::RevalidationPolicy 805 ResourceFetcher::RevalidationPolicy
786 ResourceFetcher::determineRevalidationPolicy(Resource::Type type, 806 ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
787 const FetchRequest& fetchRequest, 807 const FetchRequest& fetchRequest,
788 Resource* existingResource, 808 Resource* existingResource,
789 bool isStaticData) const { 809 bool isStaticData) const {
790 const ResourceRequest& request = fetchRequest.resourceRequest(); 810 const ResourceRequest& request = fetchRequest.resourceRequest();
791 811
792 if (!existingResource) 812 if (!existingResource)
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 } 1134 }
1115 1135
1116 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { 1136 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) {
1117 // Only the top-frame can load MHTML. 1137 // Only the top-frame can load MHTML.
1118 if (!context().isMainFrame()) 1138 if (!context().isMainFrame())
1119 return nullptr; 1139 return nullptr;
1120 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer()); 1140 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer());
1121 return m_archive ? m_archive->mainResource() : nullptr; 1141 return m_archive ? m_archive->mainResource() : nullptr;
1122 } 1142 }
1123 1143
1144 // m_mainResourceTimingInfo can be null if it is an iframe navigation restored
1145 // from history.
1146 ResourceTimingInfo* ResourceFetcher::getMainResourceTimingInfo() {
1147 return m_mainResourceTimingInfo.get();
1148 }
1149
1124 void ResourceFetcher::didFinishLoading(Resource* resource, 1150 void ResourceFetcher::didFinishLoading(Resource* resource,
1125 double finishTime, 1151 double finishTime,
1126 DidFinishLoadingReason finishReason) { 1152 DidFinishLoadingReason finishReason) {
1127 network_instrumentation::endResourceLoad( 1153 network_instrumentation::endResourceLoad(
1128 resource->identifier(), network_instrumentation::RequestOutcome::Success); 1154 resource->identifier(), network_instrumentation::RequestOutcome::Success);
1129 DCHECK(resource); 1155 DCHECK(resource);
1130 const int64_t encodedDataLength = resource->response().encodedDataLength(); 1156 const int64_t encodedDataLength = resource->response().encodedDataLength();
1131 1157
1132 // When loading a multipart resource, make the loader non-block when finishing 1158 // When loading a multipart resource, make the loader non-block when finishing
1133 // loading the first part. 1159 // loading the first part.
1134 if (finishReason == DidFinishFirstPartInMultipart) 1160 if (finishReason == DidFinishFirstPartInMultipart)
1135 moveResourceLoaderToNonBlocking(resource->loader()); 1161 moveResourceLoaderToNonBlocking(resource->loader());
1136 else 1162 else
1137 removeResourceLoader(resource->loader()); 1163 removeResourceLoader(resource->loader());
1138 DCHECK(!m_loaders.contains(resource->loader())); 1164 DCHECK(!m_loaders.contains(resource->loader()));
1139 DCHECK(finishReason == DidFinishFirstPartInMultipart || 1165 DCHECK(finishReason == DidFinishFirstPartInMultipart ||
1140 !m_nonBlockingLoaders.contains(resource->loader())); 1166 !m_nonBlockingLoaders.contains(resource->loader()));
1141 1167
1168 if (resource->getType() == Resource::MainResource &&
1169 resource->identifier() == m_mainResourceIdentifier) {
Nate Chapin 2016/12/06 20:07:50 I didn't follow your explanation earlier: why isn'
panicker 2016/12/07 00:49:00 We weren't certain of that, therefore the identifi
Yoav Weiss 2016/12/07 01:26:37 An iframe resource loading here would have a MainR
sunjian 2016/12/07 19:09:50 I think you are correct about the fact that each R
1170 DCHECK(m_mainResourceTimingInfo);
1171 // Store redirect responses that were packed inside the final response.
1172 addRedirectsToTimingInfo(resource, m_mainResourceTimingInfo.get());
1173 m_mainResourceTimingInfo->addFinalTransferSize(
1174 encodedDataLength == -1 ? 0 : encodedDataLength);
1175 }
1142 if (std::unique_ptr<ResourceTimingInfo> info = 1176 if (std::unique_ptr<ResourceTimingInfo> info =
1143 m_resourceTimingInfoMap.take(resource)) { 1177 m_resourceTimingInfoMap.take(resource)) {
1144 // Store redirect responses that were packed inside the final response. 1178 // Store redirect responses that were packed inside the final response.
1145 const Vector<ResourceResponse>& responses = 1179 addRedirectsToTimingInfo(resource, info.get());
1146 resource->response().redirectResponses();
1147 for (size_t i = 0; i < responses.size(); ++i) {
1148 const KURL& newURL = i + 1 < responses.size()
1149 ? KURL(responses[i + 1].url())
1150 : resource->resourceRequest().url();
1151 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
1152 info->addRedirect(responses[i], crossOrigin);
1153 }
1154 1180
1155 if (resource->response().isHTTP() && 1181 if (resource->response().isHTTP() &&
1156 resource->response().httpStatusCode() < 400) { 1182 resource->response().httpStatusCode() < 400) {
1157 populateResourceTiming(info.get(), resource); 1183 populateResourceTiming(info.get(), resource);
1158 info->setLoadFinishTime(finishTime); 1184 info->setLoadFinishTime(finishTime);
1159 // encodedDataLength == -1 means "not available". 1185 // encodedDataLength == -1 means "not available".
1160 // TODO(ricea): Find cases where it is not available but the 1186 // TODO(ricea): Find cases where it is not available but the
1161 // PerformanceResourceTiming spec requires it to be available and fix 1187 // PerformanceResourceTiming spec requires it to be available and fix
1162 // them. 1188 // them.
1163 info->addFinalTransferSize(encodedDataLength == -1 ? 0 1189 info->addFinalTransferSize(encodedDataLength == -1 ? 0
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 SecurityOrigin* sourceOrigin = context().getSecurityOrigin(); 1329 SecurityOrigin* sourceOrigin = context().getSecurityOrigin();
1304 if (sourceOrigin && sourceOrigin->hasSuborigin()) 1330 if (sourceOrigin && sourceOrigin->hasSuborigin())
1305 request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::All); 1331 request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::All);
1306 1332
1307 ResourceLoader* loader = ResourceLoader::create(this, resource); 1333 ResourceLoader* loader = ResourceLoader::create(this, resource);
1308 if (resource->shouldBlockLoadEvent()) 1334 if (resource->shouldBlockLoadEvent())
1309 m_loaders.add(loader); 1335 m_loaders.add(loader);
1310 else 1336 else
1311 m_nonBlockingLoaders.add(loader); 1337 m_nonBlockingLoaders.add(loader);
1312 1338
1313 storeResourceTimingInitiatorInformation(resource); 1339 storePerformanceTimingInitiatorInformation(resource);
1314 resource->setFetcherSecurityOrigin(sourceOrigin); 1340 resource->setFetcherSecurityOrigin(sourceOrigin);
1315 1341
1316 loader->activateCacheAwareLoadingIfNeeded(request); 1342 loader->activateCacheAwareLoadingIfNeeded(request);
1317 loader->start(request, context().loadingTaskRunner(), 1343 loader->start(request, context().loadingTaskRunner(),
1318 context().defersLoading()); 1344 context().defersLoading());
1319 return true; 1345 return true;
1320 } 1346 }
1321 1347
1322 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) { 1348 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) {
1323 DCHECK(loader); 1349 DCHECK(loader);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 if (resource->getType() == Resource::Image && 1419 if (resource->getType() == Resource::Image &&
1394 shouldDeferImageLoad(newRequest.url())) 1420 shouldDeferImageLoad(newRequest.url()))
1395 return false; 1421 return false;
1396 } 1422 }
1397 1423
1398 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 1424 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
1399 if (it != m_resourceTimingInfoMap.end()) { 1425 if (it != m_resourceTimingInfoMap.end()) {
1400 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url()); 1426 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1401 it->value->addRedirect(redirectResponse, crossOrigin); 1427 it->value->addRedirect(redirectResponse, crossOrigin);
1402 } 1428 }
1429
1430 if (resource->getType() == Resource::MainResource &&
1431 resource->identifier() == m_mainResourceIdentifier) {
1432 DCHECK(m_mainResourceTimingInfo);
1433 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1434 m_mainResourceTimingInfo->addRedirect(redirectResponse, crossOrigin);
1435 }
1436
1403 newRequest.setAllowStoredCredentials(resource->options().allowCredentials == 1437 newRequest.setAllowStoredCredentials(resource->options().allowCredentials ==
1404 AllowStoredCredentials); 1438 AllowStoredCredentials);
1405 willSendRequest(resource->identifier(), newRequest, redirectResponse, 1439 willSendRequest(resource->identifier(), newRequest, redirectResponse,
1406 resource->options()); 1440 resource->options());
1407 return true; 1441 return true;
1408 } 1442 }
1409 1443
1410 void ResourceFetcher::willSendRequest(unsigned long identifier, 1444 void ResourceFetcher::willSendRequest(unsigned long identifier,
1411 ResourceRequest& newRequest, 1445 ResourceRequest& newRequest,
1412 const ResourceResponse& redirectResponse, 1446 const ResourceResponse& redirectResponse,
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 visitor->trace(m_context); 1672 visitor->trace(m_context);
1639 visitor->trace(m_archive); 1673 visitor->trace(m_archive);
1640 visitor->trace(m_loaders); 1674 visitor->trace(m_loaders);
1641 visitor->trace(m_nonBlockingLoaders); 1675 visitor->trace(m_nonBlockingLoaders);
1642 visitor->trace(m_documentResources); 1676 visitor->trace(m_documentResources);
1643 visitor->trace(m_preloads); 1677 visitor->trace(m_preloads);
1644 visitor->trace(m_resourceTimingInfoMap); 1678 visitor->trace(m_resourceTimingInfoMap);
1645 } 1679 }
1646 1680
1647 } // namespace blink 1681 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698