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

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 addRedirectsToResourceTimingInfo(Resource* resource,
Yoav Weiss 2016/12/01 21:53:55 As this is used for both RT and NT2, do you think
sunjian 2016/12/01 23:28:42 I personally think it might be a better idea not t
Yoav Weiss 2016/12/02 07:10:05 I'd have preferred something like "addRedirectsToT
sunjian 2016/12/03 00:16:50 Acknowledged.
107 ResourceTimingInfo* info) {
108 // Store redirect responses that were packed inside the final response.
109 const Vector<ResourceResponse>& responses =
110 resource->response().redirectResponses();
111 for (size_t i = 0; i < responses.size(); ++i) {
112 const KURL& newURL = i + 1 < responses.size()
113 ? KURL(responses[i + 1].url())
114 : resource->resourceRequest().url();
115 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
116 info->addRedirect(responses[i], crossOrigin);
117 }
118 }
119
106 } // namespace 120 } // namespace
107 121
108 static void RecordSriResourceIntegrityMismatchEvent( 122 static void RecordSriResourceIntegrityMismatchEvent(
109 SriResourceIntegrityMismatchEvent event) { 123 SriResourceIntegrityMismatchEvent event) {
110 DEFINE_THREAD_SAFE_STATIC_LOCAL( 124 DEFINE_THREAD_SAFE_STATIC_LOCAL(
111 EnumerationHistogram, integrityHistogram, 125 EnumerationHistogram, integrityHistogram,
112 new EnumerationHistogram("sri.resource_integrity_mismatch_event", 126 new EnumerationHistogram("sri.resource_integrity_mismatch_event",
113 SriResourceIntegrityMismatchEventCount)); 127 SriResourceIntegrityMismatchEventCount));
114 integrityHistogram.count(event); 128 integrityHistogram.count(event);
115 } 129 }
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 759
746 // - Don't add main resource to cache to prevent reuse. 760 // - Don't add main resource to cache to prevent reuse.
747 // - Don't add the resource if its body will not be stored. 761 // - Don't add the resource if its body will not be stored.
748 if (factory.type() != Resource::MainResource && 762 if (factory.type() != Resource::MainResource &&
749 request.options().dataBufferingPolicy != DoNotBufferData) { 763 request.options().dataBufferingPolicy != DoNotBufferData) {
750 memoryCache()->add(resource); 764 memoryCache()->add(resource);
751 } 765 }
752 return resource; 766 return resource;
753 } 767 }
754 768
755 void ResourceFetcher::storeResourceTimingInitiatorInformation( 769 void ResourceFetcher::storePerformanceTimingInitiatorInformation(
756 Resource* resource) { 770 Resource* resource) {
757 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name; 771 const AtomicString& fetchInitiator = resource->options().initiatorInfo.name;
758 if (fetchInitiator == FetchInitiatorTypeNames::internal) 772 if (fetchInitiator == FetchInitiatorTypeNames::internal)
759 return; 773 return;
760 774
761 bool isMainResource = resource->getType() == Resource::MainResource; 775 bool isMainResource = resource->getType() == Resource::MainResource;
762 776
763 // The request can already be fetched in a previous navigation. Thus 777 // The request can already be fetched in a previous navigation. Thus
764 // startTime must be set accordingly. 778 // startTime must be set accordingly.
765 double startTime = resource->resourceRequest().navigationStartTime() 779 double startTime = resource->resourceRequest().navigationStartTime()
766 ? resource->resourceRequest().navigationStartTime() 780 ? resource->resourceRequest().navigationStartTime()
767 : monotonicallyIncreasingTime(); 781 : monotonicallyIncreasingTime();
768 782
769 std::unique_ptr<ResourceTimingInfo> info = 783 std::unique_ptr<ResourceTimingInfo> info =
770 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource); 784 ResourceTimingInfo::create(fetchInitiator, startTime, isMainResource);
771 785
772 if (resource->isCacheValidator()) { 786 if (resource->isCacheValidator()) {
773 const AtomicString& timingAllowOrigin = 787 const AtomicString& timingAllowOrigin =
774 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin); 788 resource->response().httpHeaderField(HTTPNames::Timing_Allow_Origin);
775 if (!timingAllowOrigin.isEmpty()) 789 if (!timingAllowOrigin.isEmpty())
776 info->setOriginalTimingAllowOrigin(timingAllowOrigin); 790 info->setOriginalTimingAllowOrigin(timingAllowOrigin);
777 } 791 }
778 792
779 if (!isMainResource || 793 if (!isMainResource ||
780 context().updateTimingInfoForIFrameNavigation(info.get())) 794 context().updateTimingInfoForIFrameNavigation(info.get())) {
781 m_resourceTimingInfoMap.add(resource, std::move(info)); 795 m_resourceTimingInfoMap.add(resource, std::move(info));
796 } else {
797 DCHECK(!m_mainResourceTimingInfo);
798 m_mainResourceTimingInfo = std::move(info);
799 m_mainResourceIdentifier = resource->identifier();
800 }
782 } 801 }
783 802
784 ResourceFetcher::RevalidationPolicy 803 ResourceFetcher::RevalidationPolicy
785 ResourceFetcher::determineRevalidationPolicy(Resource::Type type, 804 ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
786 const FetchRequest& fetchRequest, 805 const FetchRequest& fetchRequest,
787 Resource* existingResource, 806 Resource* existingResource,
788 bool isStaticData) const { 807 bool isStaticData) const {
789 const ResourceRequest& request = fetchRequest.resourceRequest(); 808 const ResourceRequest& request = fetchRequest.resourceRequest();
790 809
791 if (!existingResource) 810 if (!existingResource)
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 } 1132 }
1114 1133
1115 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) { 1134 ArchiveResource* ResourceFetcher::createArchive(Resource* resource) {
1116 // Only the top-frame can load MHTML. 1135 // Only the top-frame can load MHTML.
1117 if (!context().isMainFrame()) 1136 if (!context().isMainFrame())
1118 return nullptr; 1137 return nullptr;
1119 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer()); 1138 m_archive = MHTMLArchive::create(resource->url(), resource->resourceBuffer());
1120 return m_archive ? m_archive->mainResource() : nullptr; 1139 return m_archive ? m_archive->mainResource() : nullptr;
1121 } 1140 }
1122 1141
1142 ResourceTimingInfo* ResourceFetcher::getMainResourceTimingInfo(
1143 unsigned long identifier) {
1144 if (m_mainResourceTimingInfo) {
Yoav Weiss 2016/12/01 21:53:55 The condition here seems unnecessary other than fo
sunjian 2016/12/01 23:28:41 Agree. But since this is a public method, how i ca
kinuko 2016/12/02 00:44:55 Just document / have a comment to say calling getM
Yoav Weiss 2016/12/02 07:10:05 if callers are invoking it before m_mainResourceTi
sunjian 2016/12/03 00:16:50 This commit is old. I uploaded a new commit and th
1145 DCHECK(m_mainResourceIdentifier == identifier);
1146 return m_mainResourceTimingInfo.get();
1147 }
1148 return nullptr;
1149 }
1150
1123 void ResourceFetcher::didFinishLoading(Resource* resource, 1151 void ResourceFetcher::didFinishLoading(Resource* resource,
1124 double finishTime, 1152 double finishTime,
1125 DidFinishLoadingReason finishReason) { 1153 DidFinishLoadingReason finishReason) {
1126 network_instrumentation::endResourceLoad( 1154 network_instrumentation::endResourceLoad(
1127 resource->identifier(), network_instrumentation::RequestOutcome::Success); 1155 resource->identifier(), network_instrumentation::RequestOutcome::Success);
1128 DCHECK(resource); 1156 DCHECK(resource);
1129 const int64_t encodedDataLength = resource->response().encodedDataLength(); 1157 const int64_t encodedDataLength = resource->response().encodedDataLength();
1130 1158
1131 // When loading a multipart resource, make the loader non-block when finishing 1159 // When loading a multipart resource, make the loader non-block when finishing
1132 // loading the first part. 1160 // loading the first part.
1133 if (finishReason == DidFinishFirstPartInMultipart) 1161 if (finishReason == DidFinishFirstPartInMultipart)
1134 moveResourceLoaderToNonBlocking(resource->loader()); 1162 moveResourceLoaderToNonBlocking(resource->loader());
1135 else 1163 else
1136 removeResourceLoader(resource->loader()); 1164 removeResourceLoader(resource->loader());
1137 DCHECK(!m_loaders.contains(resource->loader())); 1165 DCHECK(!m_loaders.contains(resource->loader()));
1138 DCHECK(finishReason == DidFinishFirstPartInMultipart || 1166 DCHECK(finishReason == DidFinishFirstPartInMultipart ||
1139 !m_nonBlockingLoaders.contains(resource->loader())); 1167 !m_nonBlockingLoaders.contains(resource->loader()));
1140 1168
1169 if (resource->getType() == Resource::MainResource &&
1170 m_mainResourceTimingInfo) {
1171 DCHECK(resource->identifier() == m_mainResourceIdentifier);
1172 // Store redirect responses that were packed inside the final response.
1173 addRedirectsToResourceTimingInfo(resource, m_mainResourceTimingInfo.get());
1174 m_mainResourceTimingInfo->addFinalTransferSize(
1175 encodedDataLength == -1 ? 0 : encodedDataLength);
1176 }
1141 if (std::unique_ptr<ResourceTimingInfo> info = 1177 if (std::unique_ptr<ResourceTimingInfo> info =
1142 m_resourceTimingInfoMap.take(resource)) { 1178 m_resourceTimingInfoMap.take(resource)) {
1143 // Store redirect responses that were packed inside the final response. 1179 // Store redirect responses that were packed inside the final response.
1144 const Vector<ResourceResponse>& responses = 1180 addRedirectsToResourceTimingInfo(resource, info.get());
1145 resource->response().redirectResponses();
1146 for (size_t i = 0; i < responses.size(); ++i) {
1147 const KURL& newURL = i + 1 < responses.size()
1148 ? KURL(responses[i + 1].url())
1149 : resource->resourceRequest().url();
1150 bool crossOrigin = IsCrossOrigin(responses[i].url(), newURL);
1151 info->addRedirect(responses[i], crossOrigin);
1152 }
1153 1181
1154 if (resource->response().isHTTP() && 1182 if (resource->response().isHTTP() &&
1155 resource->response().httpStatusCode() < 400) { 1183 resource->response().httpStatusCode() < 400) {
1156 populateResourceTiming(info.get(), resource); 1184 populateResourceTiming(info.get(), resource);
1157 info->setLoadFinishTime(finishTime); 1185 info->setLoadFinishTime(finishTime);
1158 // encodedDataLength == -1 means "not available". 1186 // encodedDataLength == -1 means "not available".
1159 // TODO(ricea): Find cases where it is not available but the 1187 // TODO(ricea): Find cases where it is not available but the
1160 // PerformanceResourceTiming spec requires it to be available and fix 1188 // PerformanceResourceTiming spec requires it to be available and fix
1161 // them. 1189 // them.
1162 info->addFinalTransferSize(encodedDataLength == -1 ? 0 1190 info->addFinalTransferSize(encodedDataLength == -1 ? 0
(...skipping 144 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
1435 if (resource->getType() == Resource::MainResource &&
1436 m_mainResourceTimingInfo) {
Yoav Weiss 2016/12/01 21:53:55 I think this is true for iframes as well. Would be
sunjian 2016/12/01 23:28:41 Did you mean context().updateTimingInfoForIFrameNa
Yoav Weiss 2016/12/02 07:10:05 What happens when m_mainResourceTimingInfo is fill
sunjian 2016/12/03 00:16:49 I see. So i modified the if condition a little bit
1437 DCHECK(resource->identifier() == m_mainResourceIdentifier);
1438 bool crossOrigin = IsCrossOrigin(redirectResponse.url(), newRequest.url());
1439 m_mainResourceTimingInfo->addRedirect(redirectResponse, crossOrigin);
1440 }
1441
1406 newRequest.setAllowStoredCredentials(resource->options().allowCredentials == 1442 newRequest.setAllowStoredCredentials(resource->options().allowCredentials ==
1407 AllowStoredCredentials); 1443 AllowStoredCredentials);
1408 willSendRequest(resource->identifier(), newRequest, redirectResponse, 1444 willSendRequest(resource->identifier(), newRequest, redirectResponse,
1409 resource->options()); 1445 resource->options());
1410 return true; 1446 return true;
1411 } 1447 }
1412 1448
1413 void ResourceFetcher::willSendRequest(unsigned long identifier, 1449 void ResourceFetcher::willSendRequest(unsigned long identifier,
1414 ResourceRequest& newRequest, 1450 ResourceRequest& newRequest,
1415 const ResourceResponse& redirectResponse, 1451 const ResourceResponse& redirectResponse,
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 visitor->trace(m_context); 1677 visitor->trace(m_context);
1642 visitor->trace(m_archive); 1678 visitor->trace(m_archive);
1643 visitor->trace(m_loaders); 1679 visitor->trace(m_loaders);
1644 visitor->trace(m_nonBlockingLoaders); 1680 visitor->trace(m_nonBlockingLoaders);
1645 visitor->trace(m_documentResources); 1681 visitor->trace(m_documentResources);
1646 visitor->trace(m_preloads); 1682 visitor->trace(m_preloads);
1647 visitor->trace(m_resourceTimingInfoMap); 1683 visitor->trace(m_resourceTimingInfoMap);
1648 } 1684 }
1649 1685
1650 } // namespace blink 1686 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698