OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |