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

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 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 745
746 // - Don't add main resource to cache to prevent reuse. 746 // - Don't add main resource to cache to prevent reuse.
747 // - Don't add the resource if its body will not be stored. 747 // - Don't add the resource if its body will not be stored.
748 if (factory.type() != Resource::MainResource && 748 if (factory.type() != Resource::MainResource &&
749 request.options().dataBufferingPolicy != DoNotBufferData) { 749 request.options().dataBufferingPolicy != DoNotBufferData) {
750 memoryCache()->add(resource); 750 memoryCache()->add(resource);
751 } 751 }
752 return resource; 752 return resource;
753 } 753 }
754 754
755 void ResourceFetcher::storeResourceTimingInitiatorInformation( 755 void ResourceFetcher::storePerformanceTimingInitiatorInformation(
756 Resource* resource) { 756 Resource* resource) {
757 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; 757 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name;
758 if (fetchInitiator == FetchInitiatorTypeNames::internal) 758 if (fetchInitiator == FetchInitiatorTypeNames::internal)
759 return; 759 return;
760 760
761 bool isMainResource = resource->getType() == Resource::MainResource; 761 bool isMainResource = resource->getType() == Resource::MainResource;
762 762
763 // The request can already be fetched in a previous navigation. Thus 763 // The request can already be fetched in a previous navigation. Thus
764 // startTime must be set accordingly. 764 // startTime must be set accordingly.
765 double startTime = resource->resourceRequest().navigationStartTime() 765 double startTime = resource->resourceRequest().navigationStartTime()
766 ? resource->resourceRequest().navigationStartTime() 766 ? resource->resourceRequest().navigationStartTime()
767 : monotonicallyIncreasingTime(); 767 : monotonicallyIncreasingTime();
768 768
769 std::unique_ptr<ResourceTimingInfo> info = 769 std::unique_ptr<ResourceTimingInfo> info =
770 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 770 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
771 771
772 if (resource->isCacheValidator()) { 772 if (resource->isCacheValidator()) {
773 const AtomicString& timingAllowOrigin = 773 const AtomicString& timingAllowOrigin =
774 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 774 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
775 if (!timingAllowOrigin.isEmpty()) 775 if (!timingAllowOrigin.isEmpty())
776 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 776 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
777 } 777 }
778 778
779 if (!isMainResource || 779 if (!isMainResource ||
780 context().updateTimingInfoForIFrameNavigation(info.get())) 780 context().updateTimingInfoForIFrameNavigation(info.get()))
781 m_resourceTimingInfoMap.add(resource, std::move(info)); 781 m_resourceTimingInfoMap.add(resource, std::move(info));
782 else
783 m_mainResourceTimingInfoMap.add(resource->identifier(), std::move(info));
782 } 784 }
783 785
784 ResourceFetcher::RevalidationPolicy 786 ResourceFetcher::RevalidationPolicy
785 ResourceFetcher::determineRevalidationPolicy(Resource::Type type, 787 ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
786 const FetchRequest& fetchRequest, 788 const FetchRequest& fetchRequest,
787 Resource* existingResource, 789 Resource* existingResource,
788 bool isStaticData) const { 790 bool isStaticData) const {
789 const ResourceRequest& request = fetchRequest.resourceRequest(); 791 const ResourceRequest& request = fetchRequest.resourceRequest();
790 792
791 if (!existingResource) 793 if (!existingResource)
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 } 1115 }
1114 1116
1115 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { 1117 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) {
1116 // Only the top-frame can load MHTML. 1118 // Only the top-frame can load MHTML.
1117 if (!context().isMainFrame()) 1119 if (!context().isMainFrame())
1118 return nullptr; 1120 return nullptr;
1119 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer()); 1121 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer());
1120 return m_archive ? m_archive->mainResource() : nullptr; 1122 return m_archive ? m_archive->mainResource() : nullptr;
1121 } 1123 }
1122 1124
1125 ResourceTimingInfo* ResourceFetcher::getMainResourceTimingInfo(
1126 unsigned long identifier) {
1127 MainResourceTimingInfoMap::iterator it =
1128 m_mainResourceTimingInfoMap.find(identifier);
1129 if (it != m_mainResourceTimingInfoMap.end()) {
1130 return it->value.get();
1131 }
1132 return nullptr;
1133 }
1134
1123 void ResourceFetcher::didFinishLoading(Resource* resource, 1135 void ResourceFetcher::didFinishLoading(Resource* resource,
1124 double finishTime, 1136 double finishTime,
1125 int64_t encodedDataLength, 1137 int64_t encodedDataLength,
1126 DidFinishLoadingReason finishReason) { 1138 DidFinishLoadingReason finishReason) {
1127 network_instrumentation::endResourceLoad( 1139 network_instrumentation::endResourceLoad(
1128 resource->identifier(), network_instrumentation::RequestOutcome::Success); 1140 resource->identifier(), network_instrumentation::RequestOutcome::Success);
1129 DCHECK(resource); 1141 DCHECK(resource);
1130 1142
1131 // When loading a multipart resource, make the loader non-block when finishing 1143 // When loading a multipart resource, make the loader non-block when finishing
1132 // loading the first part. 1144 // loading the first part.
1133 if (finishReason == DidFinishFirstPartInMultipart) 1145 if (finishReason == DidFinishFirstPartInMultipart)
1134 moveResourceLoaderToNonBlocking(resource->loader()); 1146 moveResourceLoaderToNonBlocking(resource->loader());
1135 else 1147 else
1136 removeResourceLoader(resource->loader()); 1148 removeResourceLoader(resource->loader());
1137 DCHECK(!m_loaders.contains(resource->loader())); 1149 DCHECK(!m_loaders.contains(resource->loader()));
1138 DCHECK(finishReason == DidFinishFirstPartInMultipart || 1150 DCHECK(finishReason == DidFinishFirstPartInMultipart ||
1139 !m_nonBlockingLoaders.contains(resource->loader())); 1151 !m_nonBlockingLoaders.contains(resource->loader()));
1140 1152
1153 MainResourceTimingInfoMap::iterator it =
1154 m_mainResourceTimingInfoMap.find(resource->identifier());
1155 if (it != m_mainResourceTimingInfoMap.end()) {
1156 // Store redirect responses that were packed inside the final response.
kinuko 2016/11/30 07:34:54 We seem to be duplicating the almost same code her
sunjian 2016/12/01 21:21:59 Done.
1157 const Vector<ResourceResponse>& responses =
1158 resource->response().redirectResponses();
1159 for (size_t i = 0; i < responses.size(); ++i) {
1160 const KURL& newURL = i + 1 < responses.size()
1161 ? KURL(responses[i + 1].url())
1162 : resource->resourceRequest().url();
1163 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
1164 it->value->addRedirect(responses[i], crossOrigin);
1165 }
1166 it->value->addFinalTransferSize(
1167 encodedDataLength == -1 ? 0 : encodedDataLength);
1168 }
1141 if (std::unique_ptr<ResourceTimingInfo> info = 1169 if (std::unique_ptr<ResourceTimingInfo> info =
1142 m_resourceTimingInfoMap.take(resource)) { 1170 m_resourceTimingInfoMap.take(resource)) {
1143 // Store redirect responses that were packed inside the final response. 1171 // Store redirect responses that were packed inside the final response.
1144 const Vector<ResourceResponse>& responses = 1172 const Vector<ResourceResponse>& responses =
1145 resource->response().redirectResponses(); 1173 resource->response().redirectResponses();
1146 for (size_t i = 0; i < responses.size(); ++i) { 1174 for (size_t i = 0; i < responses.size(); ++i) {
1147 const KURL& newURL = i + 1 < responses.size() 1175 const KURL& newURL = i + 1 < responses.size()
1148 ? KURL(responses[i + 1].url()) 1176 ? KURL(responses[i + 1].url())
1149 : resource->resourceRequest().url(); 1177 : resource->resourceRequest().url();
1150 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL); 1178 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 SecurityOrigin* sourceOrigin = context().getSecurityOrigin(); 1335 SecurityOrigin* sourceOrigin = context().getSecurityOrigin();
1308 if (sourceOrigin && sourceOrigin->hasSuborigin()) 1336 if (sourceOrigin && sourceOrigin->hasSuborigin())
1309 request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::All); 1337 request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::All);
1310 1338
1311 ResourceLoader* loader = ResourceLoader::create(this, resource); 1339 ResourceLoader* loader = ResourceLoader::create(this, resource);
1312 if (resource->shouldBlockLoadEvent()) 1340 if (resource->shouldBlockLoadEvent())
1313 m_loaders.add(loader); 1341 m_loaders.add(loader);
1314 else 1342 else
1315 m_nonBlockingLoaders.add(loader); 1343 m_nonBlockingLoaders.add(loader);
1316 1344
1317 storeResourceTimingInitiatorInformation(resource); 1345 storePerformanceTimingInitiatorInformation(resource);
1318 resource->setFetcherSecurityOrigin(sourceOrigin); 1346 resource->setFetcherSecurityOrigin(sourceOrigin);
1319 1347
1320 loader->activateCacheAwareLoadingIfNeeded(request); 1348 loader->activateCacheAwareLoadingIfNeeded(request);
1321 loader->start(request, context().loadingTaskRunner(), 1349 loader->start(request, context().loadingTaskRunner(),
1322 context().defersLoading()); 1350 context().defersLoading());
1323 return true; 1351 return true;
1324 } 1352 }
1325 1353
1326 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) { 1354 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) {
1327 if (m_loaders.contains(loader)) 1355 if (m_loaders.contains(loader))
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 if (resource->getType() == Resource::Image && 1424 if (resource->getType() == Resource::Image &&
1397 shouldDeferImageLoad(newRequest.url())) 1425 shouldDeferImageLoad(newRequest.url()))
1398 return false; 1426 return false;
1399 } 1427 }
1400 1428
1401 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 1429 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
1402 if (it != m_resourceTimingInfoMap.end()) { 1430 if (it != m_resourceTimingInfoMap.end()) {
1403 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url()); 1431 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1404 it->value->addRedirect(redirectResponse, crossOrigin); 1432 it->value->addRedirect(redirectResponse, crossOrigin);
1405 } 1433 }
1434 MainResourceTimingInfoMap::iterator itt =
1435 m_mainResourceTimingInfoMap.find(resource->identifier());
1436 if (itt != m_mainResourceTimingInfoMap.end()) {
1437 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1438 itt->value->addRedirect(redirectResponse, crossOrigin);
1439 }
1440
1406 newRequest.setAllowStoredCredentials(resource->options().allowCredentials == 1441 newRequest.setAllowStoredCredentials(resource->options().allowCredentials ==
1407 AllowStoredCredentials); 1442 AllowStoredCredentials);
1408 willSendRequest(resource->identifier(), newRequest, redirectResponse, 1443 willSendRequest(resource->identifier(), newRequest, redirectResponse,
1409 resource->options()); 1444 resource->options());
1410 return true; 1445 return true;
1411 } 1446 }
1412 1447
1413 void ResourceFetcher::willSendRequest(unsigned long identifier, 1448 void ResourceFetcher::willSendRequest(unsigned long identifier,
1414 ResourceRequest& newRequest, 1449 ResourceRequest& newRequest,
1415 const ResourceResponse& redirectResponse, 1450 const ResourceResponse& redirectResponse,
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 visitor->trace(m_context); 1676 visitor->trace(m_context);
1642 visitor->trace(m_archive); 1677 visitor->trace(m_archive);
1643 visitor->trace(m_loaders); 1678 visitor->trace(m_loaders);
1644 visitor->trace(m_nonBlockingLoaders); 1679 visitor->trace(m_nonBlockingLoaders);
1645 visitor->trace(m_documentResources); 1680 visitor->trace(m_documentResources);
1646 visitor->trace(m_preloads); 1681 visitor->trace(m_preloads);
1647 visitor->trace(m_resourceTimingInfoMap); 1682 visitor->trace(m_resourceTimingInfoMap);
1648 } 1683 }
1649 1684
1650 } // namespace blink 1685 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698