Changeset 220888 in webkit
- Timestamp:
- Aug 17, 2017 3:56:59 PM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r220887 r220888 1 2017-08-17 Chris Dumez <cdumez@apple.com> 2 3 Regression(r220817): We should only copy the original request headers for Ping loads 4 https://bugs.webkit.org/show_bug.cgi?id=175679 5 6 Reviewed by Youenn Fablet. 7 8 For performance reason, we should only copy the original request headers for Ping loads 9 (Beacon at the moment), not for all CachedResourceRequests. 10 11 * loader/LoaderStrategy.h: 12 * loader/cache/CachedResource.cpp: 13 (WebCore::CachedResource::CachedResource): 14 (WebCore::CachedResource::load): 15 * loader/cache/CachedResource.h: 16 (WebCore::CachedResource::shouldUsePingLoad): 17 (WebCore::CachedResource::setOriginalRequestHeaders): 18 * loader/cache/CachedResourceLoader.cpp: 19 (WebCore::CachedResourceLoader::requestResource): 20 * loader/cache/CachedResourceRequest.cpp: 21 (WebCore::CachedResourceRequest::CachedResourceRequest): 22 * loader/cache/CachedResourceRequest.h: 23 (WebCore::CachedResourceRequest::releaseResourceRequest): 24 (WebCore::CachedResourceRequest::releaseOriginalRequestHeaders): Deleted. 25 1 26 2017-08-17 Don Olmstead <don.olmstead@sony.com> 2 27 -
trunk/Source/WebCore/loader/LoaderStrategy.h
r220817 r220888 65 65 virtual void resumePendingRequests() = 0; 66 66 67 virtual void createPingHandle(NetworkingContext*, ResourceRequest&, HTTPHeaderMap&& originalRequestHeaders, Ref<SecurityOrigin>&& sourceOrigin, ContentSecurityPolicy*, const FetchOptions&) = 0;67 virtual void createPingHandle(NetworkingContext*, ResourceRequest&, const HTTPHeaderMap& originalRequestHeaders, Ref<SecurityOrigin>&& sourceOrigin, ContentSecurityPolicy*, const FetchOptions&) = 0; 68 68 69 69 virtual void storeDerivedDataToCache(const SHA1::Digest& bodyKey, const String& type, const String& partition, WebCore::SharedBuffer&) = 0; -
trunk/Source/WebCore/loader/cache/CachedResource.cpp
r220857 r220888 118 118 CachedResource::CachedResource(CachedResourceRequest&& request, Type type, PAL::SessionID sessionID) 119 119 : m_resourceRequest(request.releaseResourceRequest()) 120 , m_originalRequestHeaders(request.releaseOriginalRequestHeaders())121 120 , m_options(request.options()) 122 121 , m_decodedDataDeletionTimer(*this, &CachedResource::destroyDecodedData, deadDecodedDataDeletionIntervalForResourceType(type)) … … 269 268 } 270 269 // FIXME: We should not special-case Beacon here. 271 if ( type() == CachedResource::Beacon) {270 if (shouldUsePingLoad(type())) { 272 271 ASSERT(m_origin); 273 272 // Beacon is not exposed to workers so it is safe to rely on the document here. 274 273 auto* document = cachedResourceLoader.document(); 275 274 auto* contentSecurityPolicy = document && !document->shouldBypassMainWorldContentSecurityPolicy() ? document->contentSecurityPolicy() : nullptr; 276 platformStrategies()->loaderStrategy()->createPingHandle(frame.loader().networkingContext(), request, HTTPHeaderMap(m_originalRequestHeaders), *m_origin, contentSecurityPolicy, m_options); 275 ASSERT(m_originalRequestHeaders); 276 platformStrategies()->loaderStrategy()->createPingHandle(frame.loader().networkingContext(), request, *m_originalRequestHeaders, *m_origin, contentSecurityPolicy, m_options); 277 277 // FIXME: We currently do not get notified when ping loads finish so we treat them as finishing right away. 278 278 finishLoading(nullptr); -
trunk/Source/WebCore/loader/cache/CachedResource.h
r220887 r220888 119 119 Type type() const { return m_type; } 120 120 121 static bool shouldUsePingLoad(Type type) { return type == Type::Beacon; } 122 121 123 ResourceLoadPriority loadPriority() const { return m_loadPriority; } 122 124 void setLoadPriority(const std::optional<ResourceLoadPriority>&); … … 280 282 static ResourceLoadPriority defaultPriorityForResourceType(Type); 281 283 284 void setOriginalRequestHeaders(std::optional<HTTPHeaderMap>&& originalRequestHeaders) { m_originalRequestHeaders = WTFMove(originalRequestHeaders); } 285 282 286 protected: 283 287 // CachedResource constructor that may be used when the CachedResource can already be filled with response data. … … 295 299 HashCountedSet<CachedResourceClient*> m_clients; 296 300 ResourceRequest m_resourceRequest; 297 HTTPHeaderMap m_originalRequestHeaders;301 std::optional<HTTPHeaderMap> m_originalRequestHeaders; // Needed by Ping loads. 298 302 RefPtr<SubresourceLoader> m_loader; 299 303 ResourceLoaderOptions m_options; -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp
r220887 r220888 699 699 ResourceErrorOr<CachedResourceHandle<CachedResource>> CachedResourceLoader::requestResource(CachedResource::Type type, CachedResourceRequest&& request, ForPreload forPreload, DeferOption defer) 700 700 { 701 std::optional<HTTPHeaderMap> originalRequestHeaders; 702 if (CachedResource::shouldUsePingLoad(type)) 703 originalRequestHeaders = request.resourceRequest().httpHeaderFields(); 704 701 705 if (Document* document = this->document()) 702 706 request.upgradeInsecureRequestIfNeeded(*document); … … 823 827 } 824 828 ASSERT(resource); 829 resource->setOriginalRequestHeaders(WTFMove(originalRequestHeaders)); 825 830 826 831 if (forPreload == ForPreload::No && resource->loader() && resource->ignoreForRequestCount()) { -
trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp
r220817 r220888 42 42 CachedResourceRequest::CachedResourceRequest(ResourceRequest&& resourceRequest, const ResourceLoaderOptions& options, std::optional<ResourceLoadPriority> priority, String&& charset) 43 43 : m_resourceRequest(WTFMove(resourceRequest)) 44 , m_originalRequestHeaders(m_resourceRequest.httpHeaderFields())45 44 , m_charset(WTFMove(charset)) 46 45 , m_options(options) -
trunk/Source/WebCore/loader/cache/CachedResourceRequest.h
r220817 r220888 52 52 53 53 ResourceRequest&& releaseResourceRequest() { return WTFMove(m_resourceRequest); } 54 HTTPHeaderMap&& releaseOriginalRequestHeaders() { return WTFMove(m_originalRequestHeaders); }55 54 const ResourceRequest& resourceRequest() const { return m_resourceRequest; } 56 55 const String& charset() const { return m_charset; } … … 96 95 private: 97 96 ResourceRequest m_resourceRequest; 98 HTTPHeaderMap m_originalRequestHeaders;99 97 String m_charset; 100 98 ResourceLoaderOptions m_options; -
trunk/Source/WebKit/ChangeLog
r220887 r220888 1 2017-08-17 Chris Dumez <cdumez@apple.com> 2 3 Regression(r220817): We should only copy the original request headers for Ping loads 4 https://bugs.webkit.org/show_bug.cgi?id=175679 5 6 Reviewed by Youenn Fablet. 7 8 For performance reason, we should only copy the original request headers for Ping loads 9 (Beacon at the moment), not for all CachedResourceRequests. 10 11 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 12 (WebKit::NetworkConnectionToWebProcess::loadPing): 13 * NetworkProcess/NetworkConnectionToWebProcess.h: 14 * NetworkProcess/NetworkConnectionToWebProcess.messages.in: 15 * NetworkProcess/NetworkResourceLoadParameters.cpp: 16 (WebKit::NetworkResourceLoadParameters::encode const): 17 (WebKit::NetworkResourceLoadParameters::decode): 18 * NetworkProcess/NetworkResourceLoadParameters.h: 19 * NetworkProcess/PingLoad.cpp: 20 (WebKit::PingLoad::PingLoad): 21 (WebKit::PingLoad::willPerformHTTPRedirection): 22 (WebKit::PingLoad::makeCrossOriginAccessRequest): 23 (WebKit::PingLoad::makeSimpleCrossOriginAccessRequest): 24 (WebKit::PingLoad::originalRequestHeaders const): Deleted. 25 * NetworkProcess/PingLoad.h: 26 * WebProcess/Network/WebLoaderStrategy.cpp: 27 (WebKit::WebLoaderStrategy::createPingHandle): 28 * WebProcess/Network/WebLoaderStrategy.h: 29 1 30 2017-08-17 Don Olmstead <don.olmstead@sony.com> 2 31 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r220887 r220888 223 223 } 224 224 225 void NetworkConnectionToWebProcess::loadPing(NetworkResourceLoadParameters&& loadParameters )225 void NetworkConnectionToWebProcess::loadPing(NetworkResourceLoadParameters&& loadParameters, HTTPHeaderMap&& originalRequestHeaders) 226 226 { 227 227 #if USE(NETWORK_SESSION) 228 228 // PingLoad manages its own lifetime, deleting itself when its purpose has been fulfilled. 229 new PingLoad(WTFMove(loadParameters) );229 new PingLoad(WTFMove(loadParameters), WTFMove(originalRequestHeaders)); 230 230 #else 231 UNUSED_PARAM(originalRequestHeaders); 231 232 RefPtr<NetworkingContext> context = RemoteNetworkingContext::create(loadParameters.sessionID, loadParameters.shouldClearReferrerOnHTTPSToHTTPRedirect); 232 233 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r220857 r220888 37 37 namespace WebCore { 38 38 class BlobDataFileReference; 39 class HTTPHeaderMap; 39 40 class ResourceRequest; 40 41 } … … 83 84 void scheduleResourceLoad(const NetworkResourceLoadParameters&); 84 85 void performSynchronousLoad(const NetworkResourceLoadParameters&, Ref<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>&&); 85 void loadPing(NetworkResourceLoadParameters&& );86 void loadPing(NetworkResourceLoadParameters&&, WebCore::HTTPHeaderMap&& originalRequestHeaders); 86 87 void prefetchDNS(const String&); 87 88 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r220857 r220888 25 25 ScheduleResourceLoad(WebKit::NetworkResourceLoadParameters resourceLoadParameters) 26 26 PerformSynchronousLoad(WebKit::NetworkResourceLoadParameters resourceLoadParameters) -> (WebCore::ResourceError error, WebCore::ResourceResponse response, Vector<char> data) Delayed 27 LoadPing(WebKit::NetworkResourceLoadParameters resourceLoadParameters )27 LoadPing(WebKit::NetworkResourceLoadParameters resourceLoadParameters, WebCore::HTTPHeaderMap originalRequestHeaders) 28 28 RemoveLoadIdentifier(uint64_t resourceLoadIdentifier) 29 29 SetDefersLoading(uint64_t resourceLoadIdentifier, bool defers) -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
r220817 r220888 89 89 encoder.encodeEnum(mode); 90 90 encoder << cspResponseHeaders; 91 encoder << originalRequestHeaders;92 91 } 93 92 … … 168 167 if (!decoder.decode(result.cspResponseHeaders)) 169 168 return false; 170 if (!decoder.decode(result.originalRequestHeaders))171 return false;172 169 173 170 return true; -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h
r220887 r220888 31 31 #include <WebCore/ContentSecurityPolicyResponseHeaders.h> 32 32 #include <WebCore/FetchOptions.h> 33 #include <WebCore/HTTPHeaderMap.h>34 33 #include <WebCore/ResourceHandle.h> 35 34 #include <WebCore/ResourceLoaderOptions.h> … … 61 60 WebCore::FetchOptions::Mode mode; 62 61 std::optional<WebCore::ContentSecurityPolicyResponseHeaders> cspResponseHeaders; 63 std::optional<WebCore::HTTPHeaderMap> originalRequestHeaders;64 62 }; 65 63 -
trunk/Source/WebKit/NetworkProcess/PingLoad.cpp
r220817 r220888 43 43 using namespace WebCore; 44 44 45 PingLoad::PingLoad(NetworkResourceLoadParameters&& parameters )45 PingLoad::PingLoad(NetworkResourceLoadParameters&& parameters, HTTPHeaderMap&& originalRequestHeaders) 46 46 : m_parameters(WTFMove(parameters)) 47 , m_originalRequestHeaders(WTFMove(originalRequestHeaders)) 47 48 , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired) 48 49 , m_isSameOriginRequest(securityOrigin().canRequest(m_parameters.request.url())) 49 50 { 50 51 ASSERT(m_parameters.sourceOrigin); 51 ASSERT(m_parameters.originalRequestHeaders);52 52 53 53 // If the server never responds, this object will hang around forever. … … 92 92 } 93 93 94 const HTTPHeaderMap& PingLoad::originalRequestHeaders() const95 {96 return *m_parameters.originalRequestHeaders;97 }98 99 94 void PingLoad::willPerformHTTPRedirection(ResourceResponse&& redirectResponse, ResourceRequest&& request, RedirectCompletionHandler&& completionHandler) 100 95 { … … 133 128 134 129 // Except in case where preflight is needed, loading should be able to continue on its own. 135 if (m_isSimpleRequest && isSimpleCrossOriginAccessRequest(request.httpMethod(), originalRequestHeaders())) {130 if (m_isSimpleRequest && isSimpleCrossOriginAccessRequest(request.httpMethod(), m_originalRequestHeaders)) { 136 131 completionHandler(WTFMove(request)); 137 132 return; … … 220 215 RELEASE_LOG_IF_ALLOWED("makeCrossOriginAccessRequest"); 221 216 222 if (isSimpleCrossOriginAccessRequest(request.httpMethod(), originalRequestHeaders())) {217 if (isSimpleCrossOriginAccessRequest(request.httpMethod(), m_originalRequestHeaders)) { 223 218 makeSimpleCrossOriginAccessRequest(WTFMove(request)); 224 219 return; … … 226 221 227 222 m_isSimpleRequest = false; 228 if (CrossOriginPreflightResultCache::singleton().canSkipPreflight(securityOrigin().toString(), request.url(), m_parameters.allowStoredCredentials, request.httpMethod(), originalRequestHeaders())) {223 if (CrossOriginPreflightResultCache::singleton().canSkipPreflight(securityOrigin().toString(), request.url(), m_parameters.allowStoredCredentials, request.httpMethod(), m_originalRequestHeaders)) { 229 224 RELEASE_LOG_IF_ALLOWED("makeCrossOriginAccessRequest - preflight can be skipped thanks to cached result"); 230 225 preflightSuccess(WTFMove(request)); … … 235 230 void PingLoad::makeSimpleCrossOriginAccessRequest(ResourceRequest&& request) 236 231 { 237 ASSERT(isSimpleCrossOriginAccessRequest(request.httpMethod(), originalRequestHeaders()));232 ASSERT(isSimpleCrossOriginAccessRequest(request.httpMethod(), m_originalRequestHeaders)); 238 233 RELEASE_LOG_IF_ALLOWED("makeSimpleCrossOriginAccessRequest"); 239 234 -
trunk/Source/WebKit/NetworkProcess/PingLoad.h
r220817 r220888 33 33 namespace WebCore { 34 34 class ContentSecurityPolicy; 35 class HTTPHeaderMap; 35 36 class URL; 36 37 } … … 42 43 class PingLoad final : private NetworkDataTaskClient { 43 44 public: 44 explicit PingLoad(NetworkResourceLoadParameters&&);45 PingLoad(NetworkResourceLoadParameters&&, WebCore::HTTPHeaderMap&& originalRequestHeaders); 45 46 46 47 private: … … 67 68 68 69 WebCore::SecurityOrigin& securityOrigin() const; 69 const WebCore::HTTPHeaderMap& originalRequestHeaders() const; // Needed for CORS checks.70 70 71 71 NetworkResourceLoadParameters m_parameters; 72 WebCore::HTTPHeaderMap m_originalRequestHeaders; // Needed for CORS checks. 72 73 RefPtr<NetworkDataTask> m_task; 73 74 WebCore::Timer m_timeoutTimer; -
trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
r220887 r220888 387 387 } 388 388 389 void WebLoaderStrategy::createPingHandle(NetworkingContext* networkingContext, ResourceRequest& request, HTTPHeaderMap&& originalRequestHeaders, Ref<SecurityOrigin>&& sourceOrigin, ContentSecurityPolicy* contentSecurityPolicy, const FetchOptions& options)389 void WebLoaderStrategy::createPingHandle(NetworkingContext* networkingContext, ResourceRequest& request, const HTTPHeaderMap& originalRequestHeaders, Ref<SecurityOrigin>&& sourceOrigin, ContentSecurityPolicy* contentSecurityPolicy, const FetchOptions& options) 390 390 { 391 391 // It's possible that call to createPingHandle might be made during initial empty Document creation before a NetworkingContext exists. … … 401 401 NetworkResourceLoadParameters loadParameters; 402 402 loadParameters.request = request; 403 loadParameters.originalRequestHeaders = WTFMove(originalRequestHeaders);404 403 loadParameters.sourceOrigin = WTFMove(sourceOrigin); 405 404 loadParameters.sessionID = webPage ? webPage->sessionID() : PAL::SessionID::defaultSessionID(); … … 411 410 loadParameters.cspResponseHeaders = contentSecurityPolicy->responseHeaders(); 412 411 413 WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::LoadPing(WTFMove(loadParameters) ), 0);412 WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::LoadPing(WTFMove(loadParameters), originalRequestHeaders), 0); 414 413 } 415 414 -
trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h
r220817 r220888 60 60 void resumePendingRequests() final; 61 61 62 void createPingHandle(WebCore::NetworkingContext*, WebCore::ResourceRequest&, WebCore::HTTPHeaderMap&& originalRequestHeaders, Ref<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::ContentSecurityPolicy*, const WebCore::FetchOptions&) final;62 void createPingHandle(WebCore::NetworkingContext*, WebCore::ResourceRequest&, const WebCore::HTTPHeaderMap& originalRequestHeaders, Ref<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::ContentSecurityPolicy*, const WebCore::FetchOptions&) final; 63 63 64 64 void storeDerivedDataToCache(const SHA1::Digest& bodyHash, const String& type, const String& partition, WebCore::SharedBuffer&) final; -
trunk/Source/WebKitLegacy/ChangeLog
r220887 r220888 1 2017-08-17 Chris Dumez <cdumez@apple.com> 2 3 Regression(r220817): We should only copy the original request headers for Ping loads 4 https://bugs.webkit.org/show_bug.cgi?id=175679 5 6 Reviewed by Youenn Fablet. 7 8 * WebCoreSupport/WebResourceLoadScheduler.cpp: 9 (WebResourceLoadScheduler::createPingHandle): 10 * WebCoreSupport/WebResourceLoadScheduler.h: 11 1 12 2017-08-17 Don Olmstead <don.olmstead@sony.com> 2 13 -
trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp
r220817 r220888 364 364 } 365 365 366 void WebResourceLoadScheduler::createPingHandle(NetworkingContext* networkingContext, ResourceRequest& request, HTTPHeaderMap&&, Ref<SecurityOrigin>&&, WebCore::ContentSecurityPolicy*, const FetchOptions& options)366 void WebResourceLoadScheduler::createPingHandle(NetworkingContext* networkingContext, ResourceRequest& request, const HTTPHeaderMap&, Ref<SecurityOrigin>&&, WebCore::ContentSecurityPolicy*, const FetchOptions& options) 367 367 { 368 368 // PingHandle manages its own lifetime, deleting itself when its purpose has been fulfilled. -
trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h
r220817 r220888 60 60 void resumePendingRequests() override; 61 61 62 void createPingHandle(WebCore::NetworkingContext*, WebCore::ResourceRequest&, WebCore::HTTPHeaderMap&&, Ref<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::ContentSecurityPolicy*, const WebCore::FetchOptions&) override;62 void createPingHandle(WebCore::NetworkingContext*, WebCore::ResourceRequest&, const WebCore::HTTPHeaderMap&, Ref<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::ContentSecurityPolicy*, const WebCore::FetchOptions&) override; 63 63 64 64 void storeDerivedDataToCache(const SHA1::Digest&, const String&, const String&, WebCore::SharedBuffer&) override { }
Note: See TracChangeset
for help on using the changeset viewer.