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

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

Issue 1757633005: Don't duplicate ResourceRequests and ResourceLoaderOptions on ResourceLoader (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make synchronousPolicy check higher priority in determineRevalidationPolicy Created 4 years, 9 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 rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 255
256 bool ResourceFetcher::isControlledByServiceWorker() const 256 bool ResourceFetcher::isControlledByServiceWorker() const
257 { 257 {
258 return context().isControlledByServiceWorker(); 258 return context().isControlledByServiceWorker();
259 } 259 }
260 260
261 bool ResourceFetcher::resourceNeedsLoad(Resource* resource, const FetchRequest& request, RevalidationPolicy policy) 261 bool ResourceFetcher::resourceNeedsLoad(Resource* resource, const FetchRequest& request, RevalidationPolicy policy)
262 { 262 {
263 if (FetchRequest::DeferredByClient == request.defer()) 263 if (FetchRequest::DeferredByClient == request.defer())
264 return false; 264 return false;
265 if (policy != Use) 265 return policy != Use || resource->stillNeedsLoad();
266 return true;
267 if (resource->stillNeedsLoad())
268 return true;
269 return request.options().synchronousPolicy == RequestSynchronously && resour ce->isLoading();
Nate Chapin 2016/03/10 18:46:01 I missed this clause on the first pass, which was
270 } 266 }
271 267
272 // Limit the number of URLs in m_validatedURLs to avoid memory bloat. 268 // Limit the number of URLs in m_validatedURLs to avoid memory bloat.
273 // http://crbug.com/52411 269 // http://crbug.com/52411
274 static const int kMaxValidatedURLsSize = 10000; 270 static const int kMaxValidatedURLsSize = 10000;
275 271
276 void ResourceFetcher::requestLoadStarted(Resource* resource, const FetchRequest& request, ResourceLoadStartType type, bool isStaticData) 272 void ResourceFetcher::requestLoadStarted(Resource* resource, const FetchRequest& request, ResourceLoadStartType type, bool isStaticData)
277 { 273 {
278 if (type == ResourceLoadingFromCache && resource->getStatus() == Resource::C ached && !m_validatedURLs.contains(resource->url())) 274 if (type == ResourceLoadingFromCache && resource->getStatus() == Resource::C ached && !m_validatedURLs.contains(resource->url()))
279 context().dispatchDidLoadResourceFromMemoryCache(resource, request.resou rceRequest().frameType(), request.resourceRequest().requestContext()); 275 context().dispatchDidLoadResourceFromMemoryCache(resource, request.resou rceRequest().frameType(), request.resourceRequest().requestContext());
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 678
683 if (!existingResource->canReuse(request)) 679 if (!existingResource->canReuse(request))
684 return Reload; 680 return Reload;
685 681
686 // Certain requests (e.g., XHRs) might have manually set headers that requir e revalidation. 682 // Certain requests (e.g., XHRs) might have manually set headers that requir e revalidation.
687 // FIXME: In theory, this should be a Revalidate case. In practice, the Memo ryCache revalidation path assumes a whole bunch 683 // FIXME: In theory, this should be a Revalidate case. In practice, the Memo ryCache revalidation path assumes a whole bunch
688 // of things about how revalidation works that manual headers violate, so pu nt to Reload instead. 684 // of things about how revalidation works that manual headers violate, so pu nt to Reload instead.
689 if (request.isConditional()) 685 if (request.isConditional())
690 return Reload; 686 return Reload;
691 687
688 // Don't try to reuse an in-progress async request for a new sync request.
689 if (fetchRequest.options().synchronousPolicy == RequestSynchronously && exis tingResource->isLoading())
690 return Reload;
691
692 // Don't reload resources while pasting. 692 // Don't reload resources while pasting.
693 if (m_allowStaleResources) 693 if (m_allowStaleResources)
694 return Use; 694 return Use;
695 695
696 if (request.getCachePolicy() == ResourceRequestCachePolicy::ReloadBypassingC ache) 696 if (request.getCachePolicy() == ResourceRequestCachePolicy::ReloadBypassingC ache)
697 return Reload; 697 return Reload;
698 698
699 if (!fetchRequest.options().canReuseRequest(existingResource->options())) 699 if (!fetchRequest.options().canReuseRequest(existingResource->options()))
700 return Reload; 700 return Reload;
701 701
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 // TODO(japhet): Once oilpan ships, the const auto& 831 // TODO(japhet): Once oilpan ships, the const auto&
832 // can be replaced with a Resource*. Also, null checking 832 // can be replaced with a Resource*. Also, null checking
833 // the resource probably won't be necesssary. 833 // the resource probably won't be necesssary.
834 for (const auto& documentResource : m_documentResources) { 834 for (const auto& documentResource : m_documentResources) {
835 Resource* resource = documentResource.value.get(); 835 Resource* resource = documentResource.value.get();
836 if (resource && resource->getType() == Resource::Image && resource->stil lNeedsLoad() && !clientDefersImage(resource->url())) 836 if (resource && resource->getType() == Resource::Image && resource->stil lNeedsLoad() && !clientDefersImage(resource->url()))
837 const_cast<Resource*>(resource)->load(this, defaultResourceOptions() ); 837 const_cast<Resource*>(resource)->load(this, defaultResourceOptions() );
838 } 838 }
839 } 839 }
840 840
841 void ResourceFetcher::redirectReceived(Resource* resource, const ResourceRespons e& redirectResponse)
842 {
843 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
844 if (it != m_resourceTimingInfoMap.end())
845 it->value->addRedirect(redirectResponse);
846 }
847
848 void ResourceFetcher::didLoadResource(Resource* resource) 841 void ResourceFetcher::didLoadResource(Resource* resource)
849 { 842 {
850 context().didLoadResource(resource); 843 context().didLoadResource(resource);
851 } 844 }
852 845
853 int ResourceFetcher::requestCount() const 846 int ResourceFetcher::requestCount() const
854 { 847 {
855 return m_loaders ? m_loaders->size() : 0; 848 return m_loaders ? m_loaders->size() : 0;
856 } 849 }
857 850
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 } 944 }
952 945
953 void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceErr or& error) 946 void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceErr or& error)
954 { 947 {
955 TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource); 948 TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource);
956 willTerminateResourceLoader(resource->loader()); 949 willTerminateResourceLoader(resource->loader());
957 bool isInternalRequest = resource->options().initiatorInfo.name == FetchInit iatorTypeNames::internal; 950 bool isInternalRequest = resource->options().initiatorInfo.name == FetchInit iatorTypeNames::internal;
958 context().dispatchDidFail(resource->identifier(), error, isInternalRequest); 951 context().dispatchDidFail(resource->identifier(), error, isInternalRequest);
959 } 952 }
960 953
961 void ResourceFetcher::willSendRequest(unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse, const FetchInitiatorInfo& in itiatorInfo)
962 {
963 context().dispatchWillSendRequest(identifier, request, redirectResponse, ini tiatorInfo);
964 }
965
966 void ResourceFetcher::didReceiveResponse(const Resource* resource, const Resourc eResponse& response) 954 void ResourceFetcher::didReceiveResponse(const Resource* resource, const Resourc eResponse& response)
967 { 955 {
968 // If the response is fetched via ServiceWorker, the original URL of the res ponse could be different from the URL of the request. 956 // If the response is fetched via ServiceWorker, the original URL of the res ponse could be different from the URL of the request.
969 // We check the URL not to load the resources which are forbidden by the pag e CSP. 957 // We check the URL not to load the resources which are forbidden by the pag e CSP.
970 // https://w3c.github.io/webappsec-csp/#should-block-response 958 // https://w3c.github.io/webappsec-csp/#should-block-response
971 if (response.wasFetchedViaServiceWorker()) { 959 if (response.wasFetchedViaServiceWorker()) {
972 const KURL& originalURL = response.originalURLViaServiceWorker(); 960 const KURL& originalURL = response.originalURLViaServiceWorker();
973 if (!originalURL.isEmpty() && !context().allowResponse(resource->getType (), resource->resourceRequest(), originalURL, resource->options())) { 961 if (!originalURL.isEmpty() && !context().allowResponse(resource->getType (), resource->resourceRequest(), originalURL, resource->options())) {
974 resource->loader()->cancel(); 962 resource->loader()->cancel();
975 bool isInternalRequest = resource->options().initiatorInfo.name == F etchInitiatorTypeNames::internal; 963 bool isInternalRequest = resource->options().initiatorInfo.name == F etchInitiatorTypeNames::internal;
(...skipping 21 matching lines...) Expand all
997 985
998 void ResourceFetcher::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* lo ader) 986 void ResourceFetcher::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* lo ader)
999 { 987 {
1000 if (!m_nonBlockingLoaders) 988 if (!m_nonBlockingLoaders)
1001 m_nonBlockingLoaders = ResourceLoaderSet::create(); 989 m_nonBlockingLoaders = ResourceLoaderSet::create();
1002 m_nonBlockingLoaders->add(loader); 990 m_nonBlockingLoaders->add(loader);
1003 m_loaders->remove(loader); 991 m_loaders->remove(loader);
1004 didLoadResource(loader->cachedResource()); 992 didLoadResource(loader->cachedResource());
1005 } 993 }
1006 994
1007 void ResourceFetcher::didInitializeResourceLoader(ResourceLoader* loader) 995 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceLoade r* loader, ResourceRequest& request)
1008 { 996 {
1009 if (loader->cachedResource()->shouldBlockLoadEvent()) { 997 if (loader->cachedResource()->shouldBlockLoadEvent()) {
1010 if (!m_loaders) 998 if (!m_loaders)
1011 m_loaders = ResourceLoaderSet::create(); 999 m_loaders = ResourceLoaderSet::create();
1012 m_loaders->add(loader); 1000 m_loaders->add(loader);
1013 } else { 1001 } else {
1014 if (!m_nonBlockingLoaders) 1002 if (!m_nonBlockingLoaders)
1015 m_nonBlockingLoaders = ResourceLoaderSet::create(); 1003 m_nonBlockingLoaders = ResourceLoaderSet::create();
1016 m_nonBlockingLoaders->add(loader); 1004 m_nonBlockingLoaders->add(loader);
1017 } 1005 }
1006
1007 context().willStartLoadingResource(request);
1008 storeResourceTimingInitiatorInformation(resource);
1009 TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource- >url().getString().ascii(), "priority", resource->resourceRequest().priority());
1010
1011 context().dispatchWillSendRequest(resource->identifier(), request, ResourceR esponse(), resource->options().initiatorInfo);
1018 } 1012 }
1019 1013
1020 void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader) 1014 void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader)
1021 { 1015 {
1022 if (m_loaders && m_loaders->contains(loader)) 1016 if (m_loaders && m_loaders->contains(loader))
1023 m_loaders->remove(loader); 1017 m_loaders->remove(loader);
1024 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader)) 1018 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader))
1025 m_nonBlockingLoaders->remove(loader); 1019 m_nonBlockingLoaders->remove(loader);
1026 else 1020 else
1027 ASSERT_NOT_REACHED(); 1021 ASSERT_NOT_REACHED();
1028 } 1022 }
1029 1023
1030 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceReque st& request)
1031 {
1032 context().willStartLoadingResource(request);
1033 storeResourceTimingInitiatorInformation(resource);
1034 TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource- >url().getString().ascii(), "priority", resource->resourceRequest().priority());
1035 }
1036
1037 void ResourceFetcher::stopFetching() 1024 void ResourceFetcher::stopFetching()
1038 { 1025 {
1039 if (m_nonBlockingLoaders) 1026 if (m_nonBlockingLoaders)
1040 m_nonBlockingLoaders->cancelAll(); 1027 m_nonBlockingLoaders->cancelAll();
1041 if (m_loaders) 1028 if (m_loaders)
1042 m_loaders->cancelAll(); 1029 m_loaders->cancelAll();
1043 } 1030 }
1044 1031
1045 bool ResourceFetcher::isFetching() const 1032 bool ResourceFetcher::isFetching() const
1046 { 1033 {
1047 return m_loaders && !m_loaders->isEmpty(); 1034 return m_loaders && !m_loaders->isEmpty();
1048 } 1035 }
1049 1036
1050 void ResourceFetcher::setDefersLoading(bool defers) 1037 void ResourceFetcher::setDefersLoading(bool defers)
1051 { 1038 {
1052 if (m_loaders) 1039 if (m_loaders)
1053 m_loaders->setAllDefersLoading(defers); 1040 m_loaders->setAllDefersLoading(defers);
1054 if (m_nonBlockingLoaders) 1041 if (m_nonBlockingLoaders)
1055 m_nonBlockingLoaders->setAllDefersLoading(defers); 1042 m_nonBlockingLoaders->setAllDefersLoading(defers);
1056 } 1043 }
1057 1044
1058 bool ResourceFetcher::defersLoading() const 1045 bool ResourceFetcher::defersLoading() const
1059 { 1046 {
1060 return context().defersLoading(); 1047 return context().defersLoading();
1061 } 1048 }
1062 1049
1063 bool ResourceFetcher::canAccessRedirect(Resource* resource, ResourceRequest& new Request, const ResourceResponse& redirectResponse, ResourceLoaderOptions& option s) 1050 static bool isManualRedirectFetchRequest(const ResourceRequest& request)
1064 { 1051 {
1065 if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), options, resource->isUnusedPreload(), FetchRequest::UseDefaultOriginRestriction ForType)) 1052 return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual && request.requestContext() == WebURLRequest::RequestContextFetch;
1066 return false; 1053 }
1067 if (options.corsEnabled == IsCORSEnabled) {
1068 SecurityOrigin* sourceOrigin = options.securityOrigin.get();
1069 if (!sourceOrigin)
1070 sourceOrigin = context().getSecurityOrigin();
1071 1054
1072 String errorMessage; 1055 bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& ne wRequest, const ResourceResponse& redirectResponse)
1073 StoredCredentials withCredentials = resource->lastResourceRequest().allo wStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials; 1056 {
1074 if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newRequest, redirectResponse, withCredentials, options, errorMessage)) { 1057 if (!isManualRedirectFetchRequest(resource->resourceRequest())) {
1075 resource->setCORSFailed(); 1058 if (!context().canRequest(resource->getType(), newRequest, newRequest.ur l(), resource->options(), resource->isUnusedPreload(), FetchRequest::UseDefaultO riginRestrictionForType))
1076 context().addConsoleMessage(errorMessage);
1077 return false; 1059 return false;
1060 if (resource->options().corsEnabled == IsCORSEnabled) {
1061 SecurityOrigin* sourceOrigin = resource->options().securityOrigin.ge t();
1062 if (!sourceOrigin)
1063 sourceOrigin = context().getSecurityOrigin();
1064
1065 String errorMessage;
1066 StoredCredentials withCredentials = resource->lastResourceRequest(). allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials;
1067 if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newReque st, redirectResponse, withCredentials, resource->mutableOptions(), errorMessage) ) {
1068 resource->setCORSFailed();
1069 context().addConsoleMessage(errorMessage);
1070 return false;
1071 }
1078 } 1072 }
1073 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRe quest.url()))
1074 return false;
1079 } 1075 }
1080 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newReques t.url())) 1076
1081 return false; 1077 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
1078 if (it != m_resourceTimingInfoMap.end())
1079 it->value->addRedirect(redirectResponse);
1080 context().dispatchWillSendRequest(resource->identifier(), newRequest, redire ctResponse, resource->options().initiatorInfo);
1082 return true; 1081 return true;
1083 } 1082 }
1084 1083
1085 void ResourceFetcher::updateAllImageResourcePriorities() 1084 void ResourceFetcher::updateAllImageResourcePriorities()
1086 { 1085 {
1087 if (!m_loaders) 1086 if (!m_loaders)
1088 return; 1087 return;
1089 1088
1090 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities"); 1089 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities");
1091 for (const auto& loader : m_loaders->hashSet()) { 1090 for (const auto& loader : m_loaders->hashSet()) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 visitor->trace(m_loaders); 1219 visitor->trace(m_loaders);
1221 visitor->trace(m_nonBlockingLoaders); 1220 visitor->trace(m_nonBlockingLoaders);
1222 #if ENABLE(OILPAN) 1221 #if ENABLE(OILPAN)
1223 visitor->trace(m_documentResources); 1222 visitor->trace(m_documentResources);
1224 visitor->trace(m_preloads); 1223 visitor->trace(m_preloads);
1225 visitor->trace(m_resourceTimingInfoMap); 1224 visitor->trace(m_resourceTimingInfoMap);
1226 #endif 1225 #endif
1227 } 1226 }
1228 1227
1229 } // namespace blink 1228 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ResourceFetcher.h ('k') | third_party/WebKit/Source/core/fetch/ResourceLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698