Title: [230942] trunk/Source
Revision
230942
Author
[email protected]
Date
2018-04-23 20:22:53 -0700 (Mon, 23 Apr 2018)

Log Message

Make WebLoaderStrategy send to NetworkResourceLoader necessary parameters to handle full loads in NetworkProcess
https://bugs.webkit.org/show_bug.cgi?id=184763

Reviewed by Chris Dumez.

Source/WebCore:

No change of behavior yet since we do not use these parameters in NetworkProcess yet.

Add PreflightPolicy and CSP response headers as ResourceLoaderOptions.
This allows passing them from DocumentThreadableLoader to WebLoaderStrategy.

Allow getting the original headers from a SubresourceLoader.
This allows passing them from DocumentThreadableLoader down to WebLoaderStrategy.

* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::startLoadingBlobURL):
(WebCore::FetchLoader::start):
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::DocumentThreadableLoader):
(WebCore::DocumentThreadableLoader::makeCrossOriginAccessRequest):
(WebCore::DocumentThreadableLoader::makeSimpleCrossOriginAccessRequest):
* loader/ResourceLoaderOptions.h:
* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::originalHeaders const):
* loader/SubresourceLoader.h:
* loader/ThreadableLoader.cpp:
(WebCore::ThreadableLoaderOptions::ThreadableLoaderOptions):
(WebCore::ThreadableLoaderOptions::isolatedCopy const):
* loader/ThreadableLoader.h:
* page/EventSource.cpp:
(WebCore::EventSource::connect):
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::createRequest):

Source/WebKit:

Set all required NetworkResourceLoadParameters for asynchronous loads.
This includes preflight policy, CSP response headers, SecurityOrigin and content blockers identifier.

Update NetworkLoadChecker to handle preflight policy.
This is not needed right now since sync XHR and ping loads are using the default ConsiderPreflight policy.
But this will be needed for XHR/fetch/EventSource loads.

* NetworkProcess/NetworkLoadChecker.cpp:
(WebKit::NetworkLoadChecker::NetworkLoadChecker):
(WebKit::NetworkLoadChecker::checkRedirection):
(WebKit::NetworkLoadChecker::validateResponse):
(WebKit::NetworkLoadChecker::checkCORSRequest):
* NetworkProcess/NetworkLoadChecker.h:
(WebKit::NetworkLoadChecker::create):
* NetworkProcess/NetworkResourceLoadParameters.cpp:
(WebKit::NetworkResourceLoadParameters::encode const):
(WebKit::NetworkResourceLoadParameters::decode):
* NetworkProcess/NetworkResourceLoadParameters.h:
* NetworkProcess/NetworkResourceLoader.cpp:
* NetworkProcess/PingLoad.cpp:
(WebKit::PingLoad::PingLoad):
* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (230941 => 230942)


--- trunk/Source/WebCore/ChangeLog	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/ChangeLog	2018-04-24 03:22:53 UTC (rev 230942)
@@ -1,3 +1,38 @@
+2018-04-23  Youenn Fablet  <[email protected]>
+
+        Make WebLoaderStrategy send to NetworkResourceLoader necessary parameters to handle full loads in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=184763
+
+        Reviewed by Chris Dumez.
+
+        No change of behavior yet since we do not use these parameters in NetworkProcess yet.
+
+        Add PreflightPolicy and CSP response headers as ResourceLoaderOptions.
+        This allows passing them from DocumentThreadableLoader to WebLoaderStrategy.
+
+        Allow getting the original headers from a SubresourceLoader.
+        This allows passing them from DocumentThreadableLoader down to WebLoaderStrategy.
+
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::startLoadingBlobURL):
+        (WebCore::FetchLoader::start):
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::DocumentThreadableLoader):
+        (WebCore::DocumentThreadableLoader::makeCrossOriginAccessRequest):
+        (WebCore::DocumentThreadableLoader::makeSimpleCrossOriginAccessRequest):
+        * loader/ResourceLoaderOptions.h:
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::originalHeaders const):
+        * loader/SubresourceLoader.h:
+        * loader/ThreadableLoader.cpp:
+        (WebCore::ThreadableLoaderOptions::ThreadableLoaderOptions):
+        (WebCore::ThreadableLoaderOptions::isolatedCopy const):
+        * loader/ThreadableLoader.h:
+        * page/EventSource.cpp:
+        (WebCore::EventSource::connect):
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::createRequest):
+
 2018-04-23  Michael Catanzaro  <[email protected]>
 
         [WPE][GTK] Remove WlUniquePtr<wl_display> footgun

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (230941 => 230942)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -73,7 +73,7 @@
     ThreadableLoaderOptions options;
     options.sendLoadCallbacks = SendCallbacks;
     options.dataBufferingPolicy = DoNotBufferData;
-    options.preflightPolicy = ConsiderPreflight;
+    options.preflightPolicy = PreflightPolicy::Consider;
     options.credentials = FetchOptions::Credentials::Include;
     options.mode = FetchOptions::Mode::SameOrigin;
     options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce;
@@ -84,7 +84,9 @@
 
 void FetchLoader::start(ScriptExecutionContext& context, const FetchRequest& request)
 {
-    ThreadableLoaderOptions options(request.fetchOptions(), ConsiderPreflight,
+    ResourceLoaderOptions resourceLoaderOptions = request.fetchOptions();
+    resourceLoaderOptions.preflightPolicy = PreflightPolicy::Consider;
+    ThreadableLoaderOptions options(resourceLoaderOptions,
         context.shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective,
         String(cachedResourceRequestInitiators().fetch),
         ResponseFilteringPolicy::Disable);

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (230941 => 230942)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -109,7 +109,7 @@
 
     // No need to do preflight if the network stack will do it for us.
     if (!m_async && platformStrategies()->loaderStrategy()->isDoingLoadingSecurityChecks())
-        m_options.preflightPolicy = PreventPreflight;
+        m_options.preflightPolicy = PreflightPolicy::Prevent;
 
     // Referrer and Origin headers should be set after the preflight if any.
     ASSERT(!request.hasHTTPReferrer() && !request.hasHTTPOrigin());
@@ -134,6 +134,9 @@
         m_options.filteringPolicy = ResponseFilteringPolicy::Disable;
     }
 
+    if (m_contentSecurityPolicy || !document.shouldBypassMainWorldContentSecurityPolicy())
+        m_options.cspResponseHeaders = this->contentSecurityPolicy().responseHeaders();
+
     // As per step 11 of https://fetch.spec.whatwg.org/#main-fetch, data scheme (if same-origin data-URL flag is set) and about scheme are considered same-origin.
     if (request.url().protocolIsData())
         m_sameOriginRequest = options.sameOriginDataURLFlag == SameOriginDataURLFlag::Set;
@@ -155,7 +158,7 @@
 {
     ASSERT(m_options.mode == FetchOptions::Mode::Cors);
 
-    if ((m_options.preflightPolicy == ConsiderPreflight && isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields())) || m_options.preflightPolicy == PreventPreflight)
+    if ((m_options.preflightPolicy == PreflightPolicy::Consider && isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields())) || m_options.preflightPolicy == PreflightPolicy::Prevent)
         makeSimpleCrossOriginAccessRequest(WTFMove(request));
     else {
 #if ENABLE(SERVICE_WORKER)
@@ -179,8 +182,8 @@
 
 void DocumentThreadableLoader::makeSimpleCrossOriginAccessRequest(ResourceRequest&& request)
 {
-    ASSERT(m_options.preflightPolicy != ForcePreflight);
-    ASSERT(m_options.preflightPolicy == PreventPreflight || isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields()));
+    ASSERT(m_options.preflightPolicy != PreflightPolicy::Force);
+    ASSERT(m_options.preflightPolicy == PreflightPolicy::Prevent || isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields()));
 
     // Cross-origin requests are only allowed for HTTP and registered schemes. We would catch this when checking response headers later, but there is no reason to send a request that's guaranteed to be denied.
     if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol().toStringWithoutCopying())) {

Modified: trunk/Source/WebCore/loader/ResourceLoaderOptions.h (230941 => 230942)


--- trunk/Source/WebCore/loader/ResourceLoaderOptions.h	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/ResourceLoaderOptions.h	2018-04-24 03:22:53 UTC (rev 230942)
@@ -30,6 +30,7 @@
 
 #pragma once
 
+#include "ContentSecurityPolicyResponseHeaders.h"
 #include "FetchOptions.h"
 #include "HTTPHeaderNames.h"
 #include "ServiceWorkerTypes.h"
@@ -111,6 +112,12 @@
     DoNotSniff,
 };
 
+enum class PreflightPolicy {
+    Consider,
+    Force,
+    Prevent
+};
+
 struct ResourceLoaderOptions : public FetchOptions {
     ResourceLoaderOptions() { }
 
@@ -158,6 +165,9 @@
     unsigned maxRedirectCount { 20 };
 
     Vector<String> derivedCachedDataTypesToRetrieve;
+
+    PreflightPolicy preflightPolicy { PreflightPolicy::Consider };
+    std::optional<ContentSecurityPolicyResponseHeaders> cspResponseHeaders;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (230941 => 230942)


--- trunk/Source/WebCore/loader/SubresourceLoader.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -784,4 +784,9 @@
     m_documentLoader->cachedResourceLoader().resourceTimingInformation().addResourceTiming(*m_resource, *document, WTFMove(resourceTiming));
 }
 
+const HTTPHeaderMap* SubresourceLoader::originalHeaders() const
+{
+    return (m_resource  && m_resource->originalRequest()) ? &m_resource->originalRequest()->httpHeaderFields() : nullptr;
 }
+
+}

Modified: trunk/Source/WebCore/loader/SubresourceLoader.h (230941 => 230942)


--- trunk/Source/WebCore/loader/SubresourceLoader.h	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/SubresourceLoader.h	2018-04-24 03:22:53 UTC (rev 230942)
@@ -50,6 +50,7 @@
     void cancelIfNotFinishing();
     bool isSubresourceLoader() const override;
     CachedResource* cachedResource();
+    WEBCORE_EXPORT const HTTPHeaderMap* originalHeaders() const;
 
     SecurityOrigin* origin() { return m_origin.get(); }
 #if PLATFORM(IOS)

Modified: trunk/Source/WebCore/loader/ThreadableLoader.cpp (230941 => 230942)


--- trunk/Source/WebCore/loader/ThreadableLoader.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/ThreadableLoader.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -54,9 +54,8 @@
 {
 }
 
-ThreadableLoaderOptions::ThreadableLoaderOptions(const ResourceLoaderOptions& baseOptions, PreflightPolicy preflightPolicy, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, String&& initiator, ResponseFilteringPolicy filteringPolicy)
+ThreadableLoaderOptions::ThreadableLoaderOptions(const ResourceLoaderOptions& baseOptions, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, String&& initiator, ResponseFilteringPolicy filteringPolicy)
     : ResourceLoaderOptions(baseOptions)
-    , preflightPolicy(preflightPolicy)
     , contentSecurityPolicyEnforcement(contentSecurityPolicyEnforcement)
     , initiator(WTFMove(initiator))
     , filteringPolicy(filteringPolicy)
@@ -93,9 +92,9 @@
     copy.derivedCachedDataTypesToRetrieve.reserveInitialCapacity(this->derivedCachedDataTypesToRetrieve.size());
     for (auto& derivedCachedDataType : this->derivedCachedDataTypesToRetrieve)
         copy.derivedCachedDataTypesToRetrieve.uncheckedAppend(derivedCachedDataType.isolatedCopy());
+    copy.preflightPolicy = this->preflightPolicy;
 
     // ThreadableLoaderOptions
-    copy.preflightPolicy = this->preflightPolicy;
     copy.contentSecurityPolicyEnforcement = this->contentSecurityPolicyEnforcement;
     copy.initiator = this->initiator.isolatedCopy();
     copy.filteringPolicy = this->filteringPolicy;

Modified: trunk/Source/WebCore/loader/ThreadableLoader.h (230941 => 230942)


--- trunk/Source/WebCore/loader/ThreadableLoader.h	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/loader/ThreadableLoader.h	2018-04-24 03:22:53 UTC (rev 230942)
@@ -43,12 +43,6 @@
     class ScriptExecutionContext;
     class ThreadableLoaderClient;
 
-    enum PreflightPolicy {
-        ConsiderPreflight,
-        ForcePreflight,
-        PreventPreflight
-    };
-
     enum class ContentSecurityPolicyEnforcement {
         DoNotEnforce,
         EnforceChildSrcDirective,
@@ -64,12 +58,11 @@
     struct ThreadableLoaderOptions : ResourceLoaderOptions {
         ThreadableLoaderOptions();
         explicit ThreadableLoaderOptions(FetchOptions&&);
-        ThreadableLoaderOptions(const ResourceLoaderOptions&, PreflightPolicy, ContentSecurityPolicyEnforcement, String&& initiator, ResponseFilteringPolicy);
+        ThreadableLoaderOptions(const ResourceLoaderOptions&, ContentSecurityPolicyEnforcement, String&& initiator, ResponseFilteringPolicy);
         ~ThreadableLoaderOptions();
 
         ThreadableLoaderOptions isolatedCopy() const;
 
-        PreflightPolicy preflightPolicy { ConsiderPreflight };
         ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement { ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective };
         String initiator; // This cannot be an AtomicString, as isolatedCopy() wouldn't create an object that's safe for passing to another thread.
         ResponseFilteringPolicy filteringPolicy { ResponseFilteringPolicy::Disable };

Modified: trunk/Source/WebCore/page/EventSource.cpp (230941 => 230942)


--- trunk/Source/WebCore/page/EventSource.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/page/EventSource.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -100,7 +100,7 @@
     ThreadableLoaderOptions options;
     options.sendLoadCallbacks = SendCallbacks;
     options.credentials = m_withCredentials ? FetchOptions::Credentials::Include : FetchOptions::Credentials::SameOrigin;
-    options.preflightPolicy = PreventPreflight;
+    options.preflightPolicy = PreflightPolicy::Prevent;
     options.mode = FetchOptions::Mode::Cors;
     options.cache = FetchOptions::Cache::NoStore;
     options.dataBufferingPolicy = DoNotBufferData;

Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (230941 => 230942)


--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -583,7 +583,7 @@
     options.sendLoadCallbacks = SendCallbacks;
     // The presence of upload event listeners forces us to use preflighting because POSTing to an URL that does not
     // permit cross origin requests should look exactly like POSTing to an URL that does not respond at all.
-    options.preflightPolicy = m_uploadListenerFlag ? ForcePreflight : ConsiderPreflight;
+    options.preflightPolicy = m_uploadListenerFlag ? PreflightPolicy::Force : PreflightPolicy::Consider;
     options.credentials = m_includeCredentials ? FetchOptions::Credentials::Include : FetchOptions::Credentials::SameOrigin;
     options.mode = FetchOptions::Mode::Cors;
     options.contentSecurityPolicyEnforcement = scriptExecutionContext()->shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective;

Modified: trunk/Source/WebKit/ChangeLog (230941 => 230942)


--- trunk/Source/WebKit/ChangeLog	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/ChangeLog	2018-04-24 03:22:53 UTC (rev 230942)
@@ -1,3 +1,34 @@
+2018-04-23  Youenn Fablet  <[email protected]>
+
+        Make WebLoaderStrategy send to NetworkResourceLoader necessary parameters to handle full loads in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=184763
+
+        Reviewed by Chris Dumez.
+
+        Set all required NetworkResourceLoadParameters for asynchronous loads.
+        This includes preflight policy, CSP response headers, SecurityOrigin and content blockers identifier.
+
+        Update NetworkLoadChecker to handle preflight policy.
+        This is not needed right now since sync XHR and ping loads are using the default ConsiderPreflight policy.
+        But this will be needed for XHR/fetch/EventSource loads. 
+
+        * NetworkProcess/NetworkLoadChecker.cpp:
+        (WebKit::NetworkLoadChecker::NetworkLoadChecker):
+        (WebKit::NetworkLoadChecker::checkRedirection):
+        (WebKit::NetworkLoadChecker::validateResponse):
+        (WebKit::NetworkLoadChecker::checkCORSRequest):
+        * NetworkProcess/NetworkLoadChecker.h:
+        (WebKit::NetworkLoadChecker::create):
+        * NetworkProcess/NetworkResourceLoadParameters.cpp:
+        (WebKit::NetworkResourceLoadParameters::encode const):
+        (WebKit::NetworkResourceLoadParameters::decode):
+        * NetworkProcess/NetworkResourceLoadParameters.h:
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        * NetworkProcess/PingLoad.cpp:
+        (WebKit::PingLoad::PingLoad):
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):
+
 2018-04-23  Wenson Hsieh  <[email protected]>
 
         [Extra zoom mode] REGRESSION(230860) Unable to change time input values using UI

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -41,12 +41,13 @@
 
 using namespace WebCore;
 
-NetworkLoadChecker::NetworkLoadChecker(WebCore::FetchOptions&& options, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalRequestHeaders, URL&& url, RefPtr<SecurityOrigin>&& sourceOrigin)
+NetworkLoadChecker::NetworkLoadChecker(WebCore::FetchOptions&& options, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalRequestHeaders, URL&& url, RefPtr<SecurityOrigin>&& sourceOrigin, PreflightPolicy preflightPolicy)
     : m_options(WTFMove(options))
     , m_sessionID(sessionID)
     , m_originalRequestHeaders(WTFMove(originalRequestHeaders))
     , m_url(WTFMove(url))
     , m_origin(WTFMove(sourceOrigin))
+    , m_preflightPolicy(preflightPolicy)
 {
     if (m_options.mode == FetchOptions::Mode::Cors || m_options.mode == FetchOptions::Mode::SameOrigin)
         m_isSameOriginRequest = m_url.protocolIsData() || m_url.protocolIsBlob() || m_origin->canRequest(m_url);
@@ -192,12 +193,21 @@
     ASSERT(m_options.mode == FetchOptions::Mode::Cors);
 
     // Except in case where preflight is needed, loading should be able to continue on its own.
-    if (m_isSimpleRequest && isSimpleCrossOriginAccessRequest(request.httpMethod(), m_originalRequestHeaders)) {
+    switch (m_preflightPolicy) {
+    case PreflightPolicy::Force:
+        checkCORSRequestWithPreflight(WTFMove(request), WTFMove(handler));
+        break;
+    case PreflightPolicy::Consider:
+        if (!m_isSimpleRequest || !isSimpleCrossOriginAccessRequest(request.httpMethod(), m_originalRequestHeaders)) {
+            checkCORSRequestWithPreflight(WTFMove(request), WTFMove(handler));
+            return;
+        }
+        FALLTHROUGH;
+    case PreflightPolicy::Prevent:
         updateRequestForAccessControl(request, *m_origin, m_storedCredentialsPolicy);
         handler(WTFMove(request));
-        return;
+        break;
     }
-    checkCORSRequestWithPreflight(WTFMove(request), WTFMove(handler));
 }
 
 void NetworkLoadChecker::checkCORSRedirectedRequest(ResourceRequest&& request, ValidationHandler&& handler)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2018-04-24 03:22:53 UTC (rev 230942)
@@ -42,9 +42,9 @@
 
 class NetworkLoadChecker : public RefCounted<NetworkLoadChecker> {
 public:
-    static Ref<NetworkLoadChecker> create(WebCore::FetchOptions&& options, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalHeaders, WebCore::URL&& url, RefPtr<WebCore::SecurityOrigin>&& sourceOrigin)
+    static Ref<NetworkLoadChecker> create(WebCore::FetchOptions&& options, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalHeaders, WebCore::URL&& url, RefPtr<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::PreflightPolicy preflightPolicy)
     {
-        return adoptRef(*new NetworkLoadChecker { WTFMove(options), sessionID, WTFMove(originalHeaders), WTFMove(url), WTFMove(sourceOrigin) });
+        return adoptRef(*new NetworkLoadChecker { WTFMove(options), sessionID, WTFMove(originalHeaders), WTFMove(url), WTFMove(sourceOrigin), preflightPolicy });
     }
     ~NetworkLoadChecker();
 
@@ -68,7 +68,7 @@
     WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; }
 
 private:
-    NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&);
+    NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy);
 
     WebCore::ContentSecurityPolicy* contentSecurityPolicy() const;
     bool isChecking() const { return !!m_corsPreflightChecker; }
@@ -108,6 +108,7 @@
     mutable std::unique_ptr<WebCore::ContentSecurityPolicy> m_contentSecurityPolicy;
     size_t m_redirectCount { 0 };
     WebCore::URL m_previousURL;
+    WebCore::PreflightPolicy m_preflightPolicy;
 };
 
 }

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -92,12 +92,14 @@
     encoder << cspResponseHeaders;
     encoder << originalRequestHeaders;
 
+    encoder << shouldRestrictHTTPResponseAccess;
+
+    encoder.encodeEnum(preflightPolicy);
+
 #if ENABLE(CONTENT_EXTENSIONS)
     encoder << mainDocumentURL;
     encoder << userContentControllerIdentifier;
 #endif
-
-    encoder << shouldRestrictHTTPResponseAccess;
 }
 
 bool NetworkResourceLoadParameters::decode(IPC::Decoder& decoder, NetworkResourceLoadParameters& result)
@@ -187,6 +189,15 @@
     if (!decoder.decode(result.originalRequestHeaders))
         return false;
 
+    std::optional<bool> shouldRestrictHTTPResponseAccess;
+    decoder >> shouldRestrictHTTPResponseAccess;
+    if (!shouldRestrictHTTPResponseAccess)
+        return false;
+    result.shouldRestrictHTTPResponseAccess = *shouldRestrictHTTPResponseAccess;
+
+    if (!decoder.decodeEnum(result.preflightPolicy))
+        return false;
+
 #if ENABLE(CONTENT_EXTENSIONS)
     if (!decoder.decode(result.mainDocumentURL))
         return false;
@@ -198,12 +209,6 @@
     result.userContentControllerIdentifier = *userContentControllerIdentifier;
 #endif
 
-    std::optional<bool> shouldRestrictHTTPResponseAccess;
-    decoder >> shouldRestrictHTTPResponseAccess;
-    if (!shouldRestrictHTTPResponseAccess)
-        return false;
-    result.shouldRestrictHTTPResponseAccess = *shouldRestrictHTTPResponseAccess;
-
     return true;
 }
     

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h	2018-04-24 03:22:53 UTC (rev 230942)
@@ -60,6 +60,7 @@
     std::optional<WebCore::ContentSecurityPolicyResponseHeaders> cspResponseHeaders;
     WebCore::HTTPHeaderMap originalRequestHeaders;
     bool shouldRestrictHTTPResponseAccess { false };
+    WebCore::PreflightPolicy preflightPolicy { WebCore::PreflightPolicy::Consider };
 
 #if ENABLE(CONTENT_EXTENSIONS)
     WebCore::URL mainDocumentURL;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -127,7 +127,7 @@
     }
 
     if (shouldUseNetworkLoadChecker(!!synchronousReply, m_parameters)) {
-        m_networkLoadChecker = NetworkLoadChecker::create(FetchOptions { m_parameters.options }, m_parameters.sessionID, HTTPHeaderMap { m_parameters.originalRequestHeaders }, URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef());
+        m_networkLoadChecker = NetworkLoadChecker::create(FetchOptions { m_parameters.options }, m_parameters.sessionID, HTTPHeaderMap { m_parameters.originalRequestHeaders }, URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy);
         if (m_parameters.cspResponseHeaders)
             m_networkLoadChecker->setCSPResponseHeaders(ContentSecurityPolicyResponseHeaders { m_parameters.cspResponseHeaders.value() });
 #if ENABLE(CONTENT_EXTENSIONS)

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.cpp (230941 => 230942)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -42,7 +42,7 @@
     : m_parameters(WTFMove(parameters))
     , m_completionHandler(WTFMove(completionHandler))
     , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired)
-    , m_networkLoadChecker(NetworkLoadChecker::create(FetchOptions { m_parameters.options}, m_parameters.sessionID, WTFMove(m_parameters.originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef()))
+    , m_networkLoadChecker(NetworkLoadChecker::create(FetchOptions { m_parameters.options}, m_parameters.sessionID, WTFMove(m_parameters.originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy))
 {
 
     if (m_parameters.cspResponseHeaders)

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (230941 => 230942)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-04-24 02:45:32 UTC (rev 230941)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-04-24 03:22:53 UTC (rev 230942)
@@ -274,7 +274,33 @@
     loadParameters.maximumBufferingTime = maximumBufferingTime;
     loadParameters.derivedCachedDataTypesToRetrieve = resourceLoader.options().derivedCachedDataTypesToRetrieve;
     loadParameters.options = resourceLoader.options();
+    loadParameters.preflightPolicy = resourceLoader.options().preflightPolicy;
 
+    auto* document = resourceLoader.frame() ? resourceLoader.frame()->document() : nullptr;
+    if (resourceLoader.options().cspResponseHeaders)
+        loadParameters.cspResponseHeaders = resourceLoader.options().cspResponseHeaders;
+    else if (document && !document->shouldBypassMainWorldContentSecurityPolicy()) {
+        if (auto* contentSecurityPolicy = document->contentSecurityPolicy())
+            loadParameters.cspResponseHeaders = contentSecurityPolicy->responseHeaders();
+    }
+
+    if (resourceLoader.isSubresourceLoader()) {
+        if (auto* headers = static_cast<SubresourceLoader&>(resourceLoader).originalHeaders())
+            loadParameters.originalRequestHeaders = *headers;
+    }
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    if (document) {
+        loadParameters.mainDocumentURL = document->topDocument().url();
+        // FIXME: Instead of passing userContentControllerIdentifier, the NetworkProcess should be able to get it using webPageId.
+        auto* webFrameLoaderClient = toWebFrameLoaderClient(resourceLoader.frame()->loader().client());
+        auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
+        auto* webPage = webFrame ? webFrame->page() : nullptr;
+        if (webPage)
+            loadParameters.userContentControllerIdentifier = webPage->userContentControllerIdentifier();
+    }
+#endif
+
     if (loadParameters.options.mode != FetchOptions::Mode::Navigate) {
         // FIXME: All loaders should provide their origin if navigation mode is cors/no-cors/same-origin.
         // As a temporary approach, we use the document origin if available or the HTTP Origin header otherwise.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to