Chromium Code Reviews| 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 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 760 // it is a font that defers actually loading until the font is required. On the other hand, | 760 // it is a font that defers actually loading until the font is required. On the other hand, |
| 761 // a Resource can have a non-null ResourceLoader* but have isLoading() r eturn false in a narrow window | 761 // a Resource can have a non-null ResourceLoader* but have isLoading() r eturn false in a narrow window |
| 762 // during completion, because we set loading to false before notifying R esourceClients, but don't | 762 // during completion, because we set loading to false before notifying R esourceClients, but don't |
| 763 // clear the ResourceLoader pointer until the stack unwinds. If, inside the ResourceClient callbacks, | 763 // clear the ResourceLoader pointer until the stack unwinds. If, inside the ResourceClient callbacks, |
| 764 // an event fires synchronously and an event handler re-requests the res ource, we can reach this point | 764 // an event fires synchronously and an event handler re-requests the res ource, we can reach this point |
| 765 // while not loading but having a ResourceLoader. | 765 // while not loading but having a ResourceLoader. |
| 766 if (existingResource->isLoading() || existingResource->loader()) | 766 if (existingResource->isLoading() || existingResource->loader()) |
| 767 return Use; | 767 return Use; |
| 768 } | 768 } |
| 769 | 769 |
| 770 // Don't try to reuse an in-progress async request for a new sync request. | |
| 771 if (fetchRequest.options().synchronousPolicy == RequestSynchronously && exis tingResource->isLoading()) | |
|
hiroshige
2016/03/10 00:24:38
This doesn't Reload in non-RawResource cases, beca
Nate Chapin
2016/03/10 18:46:01
Bumped priority up so that the only higher priorit
| |
| 772 return Reload; | |
| 773 | |
| 770 // CachePolicyReload always reloads | 774 // CachePolicyReload always reloads |
| 771 if (cachePolicy == CachePolicyReload) { | 775 if (cachePolicy == CachePolicyReload) { |
| 772 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to CachePolicyReload."); | 776 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to CachePolicyReload."); |
| 773 return Reload; | 777 return Reload; |
| 774 } | 778 } |
| 775 | 779 |
| 776 // We'll try to reload the resource if it failed last time. | 780 // We'll try to reload the resource if it failed last time. |
| 777 if (existingResource->errorOccurred()) { | 781 if (existingResource->errorOccurred()) { |
| 778 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicye reloading due to resource being in the error state"); | 782 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicye reloading due to resource being in the error state"); |
| 779 return Reload; | 783 return Reload; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 851 // TODO(japhet): Once oilpan ships, the const auto& | 855 // TODO(japhet): Once oilpan ships, the const auto& |
| 852 // can be replaced with a Resource*. Also, null checking | 856 // can be replaced with a Resource*. Also, null checking |
| 853 // the resource probably won't be necesssary. | 857 // the resource probably won't be necesssary. |
| 854 for (const auto& documentResource : m_documentResources) { | 858 for (const auto& documentResource : m_documentResources) { |
| 855 Resource* resource = documentResource.value.get(); | 859 Resource* resource = documentResource.value.get(); |
| 856 if (resource && resource->getType() == Resource::Image && resource->stil lNeedsLoad() && !clientDefersImage(resource->url())) | 860 if (resource && resource->getType() == Resource::Image && resource->stil lNeedsLoad() && !clientDefersImage(resource->url())) |
| 857 const_cast<Resource*>(resource)->load(this, defaultResourceOptions() ); | 861 const_cast<Resource*>(resource)->load(this, defaultResourceOptions() ); |
| 858 } | 862 } |
| 859 } | 863 } |
| 860 | 864 |
| 861 void ResourceFetcher::redirectReceived(Resource* resource, const ResourceRespons e& redirectResponse) | |
| 862 { | |
| 863 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); | |
| 864 if (it != m_resourceTimingInfoMap.end()) | |
| 865 it->value->addRedirect(redirectResponse); | |
| 866 } | |
| 867 | |
| 868 void ResourceFetcher::didLoadResource(Resource* resource) | 865 void ResourceFetcher::didLoadResource(Resource* resource) |
| 869 { | 866 { |
| 870 context().didLoadResource(resource); | 867 context().didLoadResource(resource); |
| 871 } | 868 } |
| 872 | 869 |
| 873 int ResourceFetcher::requestCount() const | 870 int ResourceFetcher::requestCount() const |
| 874 { | 871 { |
| 875 return m_loaders ? m_loaders->size() : 0; | 872 return m_loaders ? m_loaders->size() : 0; |
| 876 } | 873 } |
| 877 | 874 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 } | 968 } |
| 972 | 969 |
| 973 void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceErr or& error) | 970 void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceErr or& error) |
| 974 { | 971 { |
| 975 TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource); | 972 TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource); |
| 976 willTerminateResourceLoader(resource->loader()); | 973 willTerminateResourceLoader(resource->loader()); |
| 977 bool isInternalRequest = resource->options().initiatorInfo.name == FetchInit iatorTypeNames::internal; | 974 bool isInternalRequest = resource->options().initiatorInfo.name == FetchInit iatorTypeNames::internal; |
| 978 context().dispatchDidFail(resource->identifier(), error, isInternalRequest); | 975 context().dispatchDidFail(resource->identifier(), error, isInternalRequest); |
| 979 } | 976 } |
| 980 | 977 |
| 981 void ResourceFetcher::willSendRequest(unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse, const FetchInitiatorInfo& in itiatorInfo) | |
| 982 { | |
| 983 context().dispatchWillSendRequest(identifier, request, redirectResponse, ini tiatorInfo); | |
| 984 } | |
| 985 | |
| 986 void ResourceFetcher::didReceiveResponse(const Resource* resource, const Resourc eResponse& response) | 978 void ResourceFetcher::didReceiveResponse(const Resource* resource, const Resourc eResponse& response) |
| 987 { | 979 { |
| 988 // If the response is fetched via ServiceWorker, the original URL of the res ponse could be different from the URL of the request. | 980 // If the response is fetched via ServiceWorker, the original URL of the res ponse could be different from the URL of the request. |
| 989 // We check the URL not to load the resources which are forbidden by the pag e CSP. | 981 // We check the URL not to load the resources which are forbidden by the pag e CSP. |
| 990 // https://w3c.github.io/webappsec-csp/#should-block-response | 982 // https://w3c.github.io/webappsec-csp/#should-block-response |
| 991 if (response.wasFetchedViaServiceWorker()) { | 983 if (response.wasFetchedViaServiceWorker()) { |
| 992 const KURL& originalURL = response.originalURLViaServiceWorker(); | 984 const KURL& originalURL = response.originalURLViaServiceWorker(); |
| 993 if (!originalURL.isEmpty() && !context().allowResponse(resource->getType (), resource->resourceRequest(), originalURL, resource->options())) { | 985 if (!originalURL.isEmpty() && !context().allowResponse(resource->getType (), resource->resourceRequest(), originalURL, resource->options())) { |
| 994 resource->loader()->cancel(); | 986 resource->loader()->cancel(); |
| 995 bool isInternalRequest = resource->options().initiatorInfo.name == F etchInitiatorTypeNames::internal; | 987 bool isInternalRequest = resource->options().initiatorInfo.name == F etchInitiatorTypeNames::internal; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1017 | 1009 |
| 1018 void ResourceFetcher::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* lo ader) | 1010 void ResourceFetcher::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* lo ader) |
| 1019 { | 1011 { |
| 1020 if (!m_nonBlockingLoaders) | 1012 if (!m_nonBlockingLoaders) |
| 1021 m_nonBlockingLoaders = ResourceLoaderSet::create(); | 1013 m_nonBlockingLoaders = ResourceLoaderSet::create(); |
| 1022 m_nonBlockingLoaders->add(loader); | 1014 m_nonBlockingLoaders->add(loader); |
| 1023 m_loaders->remove(loader); | 1015 m_loaders->remove(loader); |
| 1024 didLoadResource(loader->cachedResource()); | 1016 didLoadResource(loader->cachedResource()); |
| 1025 } | 1017 } |
| 1026 | 1018 |
| 1027 void ResourceFetcher::didInitializeResourceLoader(ResourceLoader* loader) | 1019 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceLoade r* loader, ResourceRequest& request) |
| 1028 { | 1020 { |
| 1029 if (loader->cachedResource()->shouldBlockLoadEvent()) { | 1021 if (loader->cachedResource()->shouldBlockLoadEvent()) { |
| 1030 if (!m_loaders) | 1022 if (!m_loaders) |
| 1031 m_loaders = ResourceLoaderSet::create(); | 1023 m_loaders = ResourceLoaderSet::create(); |
| 1032 m_loaders->add(loader); | 1024 m_loaders->add(loader); |
| 1033 } else { | 1025 } else { |
| 1034 if (!m_nonBlockingLoaders) | 1026 if (!m_nonBlockingLoaders) |
| 1035 m_nonBlockingLoaders = ResourceLoaderSet::create(); | 1027 m_nonBlockingLoaders = ResourceLoaderSet::create(); |
| 1036 m_nonBlockingLoaders->add(loader); | 1028 m_nonBlockingLoaders->add(loader); |
| 1037 } | 1029 } |
| 1030 | |
| 1031 context().willStartLoadingResource(request); | |
| 1032 storeResourceTimingInitiatorInformation(resource); | |
| 1033 TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource- >url().getString().ascii(), "priority", resource->resourceRequest().priority()); | |
| 1034 | |
| 1035 context().dispatchWillSendRequest(resource->identifier(), request, ResourceR esponse(), resource->options().initiatorInfo); | |
| 1038 } | 1036 } |
| 1039 | 1037 |
| 1040 void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader) | 1038 void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader) |
| 1041 { | 1039 { |
| 1042 if (m_loaders && m_loaders->contains(loader)) | 1040 if (m_loaders && m_loaders->contains(loader)) |
| 1043 m_loaders->remove(loader); | 1041 m_loaders->remove(loader); |
| 1044 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader)) | 1042 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader)) |
| 1045 m_nonBlockingLoaders->remove(loader); | 1043 m_nonBlockingLoaders->remove(loader); |
| 1046 else | 1044 else |
| 1047 ASSERT_NOT_REACHED(); | 1045 ASSERT_NOT_REACHED(); |
| 1048 } | 1046 } |
| 1049 | 1047 |
| 1050 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceReque st& request) | |
| 1051 { | |
| 1052 context().willStartLoadingResource(request); | |
| 1053 storeResourceTimingInitiatorInformation(resource); | |
| 1054 TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource- >url().getString().ascii(), "priority", resource->resourceRequest().priority()); | |
| 1055 } | |
| 1056 | |
| 1057 void ResourceFetcher::stopFetching() | 1048 void ResourceFetcher::stopFetching() |
| 1058 { | 1049 { |
| 1059 if (m_nonBlockingLoaders) | 1050 if (m_nonBlockingLoaders) |
| 1060 m_nonBlockingLoaders->cancelAll(); | 1051 m_nonBlockingLoaders->cancelAll(); |
| 1061 if (m_loaders) | 1052 if (m_loaders) |
| 1062 m_loaders->cancelAll(); | 1053 m_loaders->cancelAll(); |
| 1063 } | 1054 } |
| 1064 | 1055 |
| 1065 bool ResourceFetcher::isFetching() const | 1056 bool ResourceFetcher::isFetching() const |
| 1066 { | 1057 { |
| 1067 return m_loaders && !m_loaders->isEmpty(); | 1058 return m_loaders && !m_loaders->isEmpty(); |
| 1068 } | 1059 } |
| 1069 | 1060 |
| 1070 void ResourceFetcher::setDefersLoading(bool defers) | 1061 void ResourceFetcher::setDefersLoading(bool defers) |
| 1071 { | 1062 { |
| 1072 if (m_loaders) | 1063 if (m_loaders) |
| 1073 m_loaders->setAllDefersLoading(defers); | 1064 m_loaders->setAllDefersLoading(defers); |
| 1074 if (m_nonBlockingLoaders) | 1065 if (m_nonBlockingLoaders) |
| 1075 m_nonBlockingLoaders->setAllDefersLoading(defers); | 1066 m_nonBlockingLoaders->setAllDefersLoading(defers); |
| 1076 } | 1067 } |
| 1077 | 1068 |
| 1078 bool ResourceFetcher::defersLoading() const | 1069 bool ResourceFetcher::defersLoading() const |
| 1079 { | 1070 { |
| 1080 return context().defersLoading(); | 1071 return context().defersLoading(); |
| 1081 } | 1072 } |
| 1082 | 1073 |
| 1083 bool ResourceFetcher::canAccessRedirect(Resource* resource, ResourceRequest& new Request, const ResourceResponse& redirectResponse, ResourceLoaderOptions& option s) | 1074 static bool isManualRedirectFetchRequest(const ResourceRequest& request) |
|
Nate Chapin
2016/03/09 22:35:54
I'm not sure whether it's better to merge canAcces
| |
| 1084 { | 1075 { |
| 1085 if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), options, resource->isUnusedPreload(), FetchRequest::UseDefaultOriginRestriction ForType)) | 1076 return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual && request.requestContext() == WebURLRequest::RequestContextFetch; |
| 1086 return false; | 1077 } |
| 1087 if (options.corsEnabled == IsCORSEnabled) { | |
| 1088 SecurityOrigin* sourceOrigin = options.securityOrigin.get(); | |
| 1089 if (!sourceOrigin) | |
| 1090 sourceOrigin = context().securityOrigin(); | |
| 1091 | 1078 |
| 1092 String errorMessage; | 1079 bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& ne wRequest, const ResourceResponse& redirectResponse) |
| 1093 StoredCredentials withCredentials = resource->lastResourceRequest().allo wStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials; | 1080 { |
| 1094 if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newRequest, redirectResponse, withCredentials, options, errorMessage)) { | 1081 if (!isManualRedirectFetchRequest(resource->resourceRequest())) { |
| 1095 resource->setCORSFailed(); | 1082 if (!context().canRequest(resource->getType(), newRequest, newRequest.ur l(), resource->options(), resource->isUnusedPreload(), FetchRequest::UseDefaultO riginRestrictionForType)) |
| 1096 context().addConsoleMessage(errorMessage); | |
| 1097 return false; | 1083 return false; |
| 1084 if (resource->options().corsEnabled == IsCORSEnabled) { | |
| 1085 SecurityOrigin* sourceOrigin = resource->options().securityOrigin.ge t(); | |
| 1086 if (!sourceOrigin) | |
| 1087 sourceOrigin = context().securityOrigin(); | |
| 1088 | |
| 1089 String errorMessage; | |
| 1090 StoredCredentials withCredentials = resource->lastResourceRequest(). allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials; | |
| 1091 if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newReque st, redirectResponse, withCredentials, resource->mutableOptions(), errorMessage) ) { | |
| 1092 resource->setCORSFailed(); | |
| 1093 context().addConsoleMessage(errorMessage); | |
| 1094 return false; | |
| 1095 } | |
| 1098 } | 1096 } |
| 1097 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRe quest.url())) | |
| 1098 return false; | |
| 1099 } | 1099 } |
| 1100 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newReques t.url())) | 1100 |
| 1101 return false; | 1101 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
| 1102 if (it != m_resourceTimingInfoMap.end()) | |
| 1103 it->value->addRedirect(redirectResponse); | |
| 1104 context().dispatchWillSendRequest(resource->identifier(), newRequest, redire ctResponse, resource->options().initiatorInfo); | |
| 1102 return true; | 1105 return true; |
| 1103 } | 1106 } |
| 1104 | 1107 |
| 1105 void ResourceFetcher::updateAllImageResourcePriorities() | 1108 void ResourceFetcher::updateAllImageResourcePriorities() |
| 1106 { | 1109 { |
| 1107 if (!m_loaders) | 1110 if (!m_loaders) |
| 1108 return; | 1111 return; |
| 1109 | 1112 |
| 1110 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities"); | 1113 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities"); |
| 1111 for (const auto& loader : m_loaders->hashSet()) { | 1114 for (const auto& loader : m_loaders->hashSet()) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1240 visitor->trace(m_loaders); | 1243 visitor->trace(m_loaders); |
| 1241 visitor->trace(m_nonBlockingLoaders); | 1244 visitor->trace(m_nonBlockingLoaders); |
| 1242 #if ENABLE(OILPAN) | 1245 #if ENABLE(OILPAN) |
| 1243 visitor->trace(m_documentResources); | 1246 visitor->trace(m_documentResources); |
| 1244 visitor->trace(m_preloads); | 1247 visitor->trace(m_preloads); |
| 1245 visitor->trace(m_resourceTimingInfoMap); | 1248 visitor->trace(m_resourceTimingInfoMap); |
| 1246 #endif | 1249 #endif |
| 1247 } | 1250 } |
| 1248 | 1251 |
| 1249 } // namespace blink | 1252 } // namespace blink |
| OLD | NEW |