Title: [220320] trunk
Revision
220320
Author
commit-qu...@webkit.org
Date
2017-08-05 15:11:28 -0700 (Sat, 05 Aug 2017)

Log Message

[Fetch API] Response should keep all ResourceResponse information
https://bugs.webkit.org/show_bug.cgi?id=175099

Patch by Youenn Fablet <you...@apple.com> on 2017-08-05
Reviewed by Sam Weinig.

Source/WebCore:

No change of behavior, covered by existing tests.

Disabling filtering of resource response at DocumentThreadableLoader for fetch API and doing the filtering at FetchResponse level.
This requires passing the tainting parameter to FetchResponse. For that purpose, we store the tainting on the ResourceResponse itself.
This allows mimicking the concept of internal response from the fetch spec.
This might be useful for future developments related to caching the responses.

The body is now also stored in FetchResponse so a flag is added to ensure we only expose the body if allowed.

Changing storage of opaque redirect information to keep the redirection information in the response.

* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::blob):
(WebCore::FetchBodyOwner::consumeNullBody):
* Modules/fetch/FetchBodyOwner.h:
* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::start):
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::BodyLoader::didReceiveResponse):
(WebCore::FetchResponse::consume):
(WebCore::FetchResponse::consumeBodyAsStream):
(WebCore::FetchResponse::createReadableStreamSource):
* Modules/fetch/FetchResponse.h:
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::responseReceived):
(WebCore::DocumentThreadableLoader::didReceiveResponse):
(WebCore::DocumentThreadableLoader::didFinishLoading):
(WebCore::DocumentThreadableLoader::loadRequest):
* loader/DocumentThreadableLoader.h:
* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::willSendRequestInternal):
* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::setBodyDataFrom):
(WebCore::CachedResource::setResponse):
* platform/network/ResourceResponseBase.cpp:
(WebCore::ResourceResponseBase::crossThreadData const):
(WebCore::ResourceResponseBase::fromCrossThreadData):
(WebCore::ResourceResponseBase::filter):
* platform/network/ResourceResponseBase.h:
(WebCore::ResourceResponseBase::setTainting):
(WebCore::ResourceResponseBase::tainting const):
(WebCore::ResourceResponseBase::encode const):
(WebCore::ResourceResponseBase::decode):

LayoutTests:

Updating test now that we are no longer cancelling the load in case of opaque responses.

* http/tests/inspector/network/fetch-network-data-expected.txt:
* http/tests/inspector/network/fetch-network-data.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (220319 => 220320)


--- trunk/LayoutTests/ChangeLog	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/LayoutTests/ChangeLog	2017-08-05 22:11:28 UTC (rev 220320)
@@ -1,3 +1,15 @@
+2017-08-05  Youenn Fablet  <you...@apple.com>
+
+        [Fetch API] Response should keep all ResourceResponse information
+        https://bugs.webkit.org/show_bug.cgi?id=175099
+
+        Reviewed by Sam Weinig.
+
+        Updating test now that we are no longer cancelling the load in case of opaque responses.
+
+        * http/tests/inspector/network/fetch-network-data-expected.txt:
+        * http/tests/inspector/network/fetch-network-data.html:
+
 2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
 
         getClientRects doesn't work with list box option elements

Modified: trunk/LayoutTests/http/tests/inspector/network/fetch-network-data-expected.txt (220319 => 220320)


--- trunk/LayoutTests/http/tests/inspector/network/fetch-network-data-expected.txt	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/LayoutTests/http/tests/inspector/network/fetch-network-data-expected.txt	2017-08-05 22:11:28 UTC (rev 220320)
@@ -12,9 +12,10 @@
 
 -- Running test case: Network.Fetch.ModeNoCORS.CrossOrigin
 PASS: Resource should be Fetch type.
-PASS: Resource should have failed to load.
-PASS: Load should have failed.
-PASS: Load should have canceled.
+PASS: Resource should have loaded successfully.
+PASS: MIMEType should be 'application/json'.
+PASS: Status code should be 200.
+PASS: Should be able to see X-Custom-Header.
 
 -- Running test case: Network.Fetch.ModeCORS.SameOrigin
 PASS: Resource should be Fetch type.

Modified: trunk/LayoutTests/http/tests/inspector/network/fetch-network-data.html (220319 => 220320)


--- trunk/LayoutTests/http/tests/inspector/network/fetch-network-data.html	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/LayoutTests/http/tests/inspector/network/fetch-network-data.html	2017-08-05 22:11:28 UTC (rev 220320)
@@ -52,9 +52,10 @@
         name: "Network.Fetch.ModeNoCORS.CrossOrigin",
         description: "Same Origin 'no-cors' fetch => type 'opaque'. Produces an opaque failure.",
         _expression_: `fetch("http://localhost:8000/inspector/network/resources/cors-data.pl", {mode: "no-cors"})`,
-        failedHandler(resource) {
-            InspectorTest.expectThat(resource.failed, "Load should have failed.");
-            InspectorTest.expectThat(resource.canceled, "Load should have canceled.");
+        loadedHandler(resource) {
+            InspectorTest.expectEqual(resource.mimeType, "application/json", "MIMEType should be 'application/json'.");
+            InspectorTest.expectEqual(resource.statusCode, 200, "Status code should be 200.");
+            InspectorTest.expectEqual(resource.responseHeaders["X-Custom-Header"], "Custom-Header-Value", "Should be able to see X-Custom-Header.");
         }
     });
 

Modified: trunk/Source/WebCore/ChangeLog (220319 => 220320)


--- trunk/Source/WebCore/ChangeLog	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/ChangeLog	2017-08-05 22:11:28 UTC (rev 220320)
@@ -1,3 +1,54 @@
+2017-08-05  Youenn Fablet  <you...@apple.com>
+
+        [Fetch API] Response should keep all ResourceResponse information
+        https://bugs.webkit.org/show_bug.cgi?id=175099
+
+        Reviewed by Sam Weinig.
+
+        No change of behavior, covered by existing tests.
+
+        Disabling filtering of resource response at DocumentThreadableLoader for fetch API and doing the filtering at FetchResponse level.
+        This requires passing the tainting parameter to FetchResponse. For that purpose, we store the tainting on the ResourceResponse itself.
+        This allows mimicking the concept of internal response from the fetch spec.
+        This might be useful for future developments related to caching the responses.
+
+        The body is now also stored in FetchResponse so a flag is added to ensure we only expose the body if allowed.
+
+        Changing storage of opaque redirect information to keep the redirection information in the response.
+
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::blob):
+        (WebCore::FetchBodyOwner::consumeNullBody):
+        * Modules/fetch/FetchBodyOwner.h:
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::start):
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::BodyLoader::didReceiveResponse):
+        (WebCore::FetchResponse::consume):
+        (WebCore::FetchResponse::consumeBodyAsStream):
+        (WebCore::FetchResponse::createReadableStreamSource):
+        * Modules/fetch/FetchResponse.h:
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::responseReceived):
+        (WebCore::DocumentThreadableLoader::didReceiveResponse):
+        (WebCore::DocumentThreadableLoader::didFinishLoading):
+        (WebCore::DocumentThreadableLoader::loadRequest):
+        * loader/DocumentThreadableLoader.h:
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::willSendRequestInternal):
+        * loader/cache/CachedResource.cpp:
+        (WebCore::CachedResource::setBodyDataFrom):
+        (WebCore::CachedResource::setResponse):
+        * platform/network/ResourceResponseBase.cpp:
+        (WebCore::ResourceResponseBase::crossThreadData const):
+        (WebCore::ResourceResponseBase::fromCrossThreadData):
+        (WebCore::ResourceResponseBase::filter):
+        * platform/network/ResourceResponseBase.h:
+        (WebCore::ResourceResponseBase::setTainting):
+        (WebCore::ResourceResponseBase::tainting const):
+        (WebCore::ResourceResponseBase::encode const):
+        (WebCore::ResourceResponseBase::decode):
+
 2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
 
         WebDriver: use in-view center point for clicks instead of bounding box center point

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (220319 => 220320)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -88,7 +88,7 @@
 void FetchBodyOwner::blob(Ref<DeferredPromise>&& promise)
 {
     if (isBodyNull()) {
-        promise->resolve<IDLInterface<Blob>>(Blob::create({ }, Blob::normalizedContentType(extractMIMETypeFromMediaType(m_contentType))).get());
+        promise->resolve<IDLInterface<Blob>>(Blob::create({ }, Blob::normalizedContentType(extractMIMETypeFromMediaType(m_contentType))));
         return;
     }
     if (isDisturbedOrLocked()) {
@@ -133,6 +133,27 @@
     m_body->consumeOnceLoadingFinished(type, WTFMove(promise), m_contentType);
 }
 
+void FetchBodyOwner::consumeNullBody(FetchBodyConsumer::Type consumerType, Ref<DeferredPromise>&& promise)
+{
+    switch (consumerType) {
+    case FetchBodyConsumer::Type::ArrayBuffer:
+        fulfillPromiseWithArrayBuffer(WTFMove(promise), nullptr, 0);
+        return;
+    case FetchBodyConsumer::Type::Blob:
+        promise->resolve<IDLInterface<Blob>>(Blob::create({ }, String()));
+        return;
+    case FetchBodyConsumer::Type::JSON:
+        promise->reject(SyntaxError);
+        return;
+    case FetchBodyConsumer::Type::Text:
+        promise->resolve<IDLDOMString>({ });
+        return;
+    case FetchBodyConsumer::Type::None:
+        ASSERT_NOT_REACHED();
+        return;
+    }
+}
+
 void FetchBodyOwner::formData(Ref<DeferredPromise>&& promise)
 {
     if (isBodyNull()) {

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (220319 => 220320)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2017-08-05 22:11:28 UTC (rev 220320)
@@ -66,6 +66,7 @@
     void extractBody(ScriptExecutionContext&, FetchBody::Init&&);
     void updateContentType();
     void consumeOnceLoadingFinished(FetchBodyConsumer::Type, Ref<DeferredPromise>&&);
+    void consumeNullBody(FetchBodyConsumer::Type, Ref<DeferredPromise>&&);
 
     void setBody(FetchBody&& body) { m_body = WTFMove(body); }
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (220319 => 220320)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -75,7 +75,7 @@
     ThreadableLoaderOptions options(request.fetchOptions(), ConsiderPreflight,
         context.shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective,
         String(cachedResourceRequestInitiators().fetch),
-        ResponseFilteringPolicy::Enable);
+        ResponseFilteringPolicy::Disable);
     options.sendLoadCallbacks = SendCallbacks;
     options.dataBufferingPolicy = DoNotBufferData;
     options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (220319 => 220320)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -175,8 +175,10 @@
 {
     ASSERT(m_promise);
 
-    m_response.m_response = resourceResponse;
-    m_response.m_headers->filterAndFill(resourceResponse.httpHeaderFields(), FetchHeaders::Guard::Response);
+    m_response.m_response = ResourceResponseBase::filter(resourceResponse);
+    m_response.m_shouldExposeBody = resourceResponse.tainting() != ResourceResponse::Tainting::Opaque;
+
+    m_response.m_headers->filterAndFill(m_response.m_response.httpHeaderFields(), FetchHeaders::Guard::Response);
     m_response.updateContentType();
 
     std::exchange(m_promise, std::nullopt)->resolve(m_response);
@@ -227,6 +229,11 @@
     ASSERT(type <= static_cast<unsigned>(FetchBodyConsumer::Type::Text));
     auto consumerType = static_cast<FetchBodyConsumer::Type>(type);
 
+    if (!m_shouldExposeBody) {
+        consumeNullBody(consumerType, WTFMove(wrapper));
+        return;
+    }
+
     if (isLoading()) {
         consumeOnceLoadingFinished(consumerType, WTFMove(wrapper));
         return;
@@ -273,6 +280,7 @@
 
 void FetchResponse::consumeBodyAsStream()
 {
+    ASSERT(m_shouldExposeBody);
     ASSERT(m_readableStreamSource);
     m_isDisturbed = true;
     if (!isLoading()) {
@@ -326,7 +334,7 @@
     ASSERT(!m_readableStreamSource);
     ASSERT(!m_isDisturbed);
 
-    if (isBodyNull())
+    if (isBodyNull() || !m_shouldExposeBody)
         return nullptr;
 
     m_readableStreamSource = adoptRef(*new FetchResponseSource(*this));

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (220319 => 220320)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-08-05 22:11:28 UTC (rev 220320)
@@ -130,6 +130,7 @@
     ResourceResponse m_response;
     std::optional<BodyLoader> m_bodyLoader;
     mutable String m_responseURL;
+    bool m_shouldExposeBody { true };
 
     FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::ArrayBuffer  };
 };

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (220319 => 220320)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -290,10 +290,10 @@
 void DocumentThreadableLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
-    didReceiveResponse(m_resource->identifier(), response, m_resource->responseTainting());
+    didReceiveResponse(m_resource->identifier(), response);
 }
 
-void DocumentThreadableLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, ResourceResponse::Tainting tainting)
+void DocumentThreadableLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
 {
     ASSERT(m_client);
     ASSERT(response.type() != ResourceResponse::Type::Error);
@@ -309,8 +309,8 @@
     }
 
     if (response.type() == ResourceResponse::Type::Default) {
-        m_client->didReceiveResponse(identifier, ResourceResponse::filterResponse(response, tainting));
-        if (tainting == ResourceResponse::Tainting::Opaque) {
+        m_client->didReceiveResponse(identifier, ResourceResponseBase::filter(response));
+        if (response.tainting() == ResourceResponse::Tainting::Opaque) {
             clearResource();
             if (m_client)
                 m_client->didFinishLoading(identifier);
@@ -380,9 +380,8 @@
             m_client->didReceiveData(m_resource->resourceBuffer()->data(), m_resource->resourceBuffer()->size());
         } else {
             ASSERT(response.type() == ResourceResponse::Type::Default);
-            
-            auto tainting = m_resource->responseTainting();
-            m_client->didReceiveResponse(identifier, ResourceResponse::filterResponse(response, tainting));
+
+            m_client->didReceiveResponse(identifier, ResourceResponseBase::filter(response));
             m_client->didReceiveData(m_resource->resourceBuffer()->data(), m_resource->resourceBuffer()->size());
         }
     }
@@ -486,7 +485,7 @@
         if (requestURL.isLocalFile()) {
             // We don't want XMLHttpRequest to raise an exception for file:// resources, see <rdar://problem/4962298>.
             // FIXME: XMLHttpRequest quirks should be in XMLHttpRequest code, not in DocumentThreadableLoader.cpp.
-            didReceiveResponse(identifier, response, ResourceResponse::Tainting::Basic);
+            didReceiveResponse(identifier, response);
             didFinishLoading(identifier);
             return;
         }
@@ -509,13 +508,12 @@
         }
     }
 
-    ResourceResponse::Tainting tainting = ResourceResponse::Tainting::Basic;
     if (!m_sameOriginRequest) {
         if (m_options.mode == FetchOptions::Mode::NoCors)
-            tainting = ResourceResponse::Tainting::Opaque;
+            response.setTainting(ResourceResponse::Tainting::Opaque);
         else {
             ASSERT(m_options.mode == FetchOptions::Mode::Cors);
-            tainting = ResourceResponse::Tainting::Cors;
+            response.setTainting(ResourceResponse::Tainting::Cors);
             String accessControlErrorDescription;
             if (!passesAccessControlCheck(response, m_options.allowCredentials, securityOrigin(), accessControlErrorDescription)) {
                 logErrorAndFail(ResourceError(errorDomainWebKitInternal, 0, response.url(), accessControlErrorDescription, ResourceError::Type::AccessControl));
@@ -523,7 +521,7 @@
             }
         }
     }
-    didReceiveResponse(identifier, response, tainting);
+    didReceiveResponse(identifier, response);
 
     if (data)
         didReceiveData(identifier, data->data(), data->size());

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (220319 => 220320)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2017-08-05 22:11:28 UTC (rev 220320)
@@ -88,7 +88,7 @@
         void finishedTimingForWorkerLoad(const ResourceTiming&);
         void notifyFinished(CachedResource&) override;
 
-        void didReceiveResponse(unsigned long identifier, const ResourceResponse&, ResourceResponse::Tainting);
+        void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
         void didReceiveData(unsigned long identifier, const char* data, int dataLength);
         void didFinishLoading(unsigned long identifier);
         void didFail(unsigned long identifier, const ResourceError&);

Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (220319 => 220320)


--- trunk/Source/WebCore/loader/SubresourceLoader.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -187,10 +187,11 @@
                 return;
             }
 
-            ResourceResponse opaqueRedirectedResponse;
-            opaqueRedirectedResponse.setURL(redirectResponse.url());
+            ResourceResponse opaqueRedirectedResponse = redirectResponse;
             opaqueRedirectedResponse.setType(ResourceResponse::Type::Opaqueredirect);
+            opaqueRedirectedResponse.setTainting(ResourceResponse::Tainting::Opaqueredirect);
             m_resource->responseReceived(opaqueRedirectedResponse);
+
             NetworkLoadMetrics emptyMetrics;
             didFinishLoading(emptyMetrics);
             return;

Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (220319 => 220320)


--- trunk/Source/WebCore/loader/cache/CachedResource.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -299,6 +299,7 @@
 {
     m_data = resource.m_data;
     m_response = resource.m_response;
+    m_response.setTainting(m_responseTainting);
     setDecodedSize(resource.decodedSize());
     setEncodedSize(resource.encodedSize());
 }
@@ -436,6 +437,8 @@
     ASSERT(m_response.type() == ResourceResponse::Type::Default);
     m_response = response;
     m_response.setRedirected(m_redirectChainCacheStatus.status != RedirectChainCacheStatus::NoRedirection);
+    if (m_response.tainting() == ResourceResponse::Tainting::Basic || m_response.tainting() == ResourceResponse::Tainting::Cors)
+        m_response.setTainting(m_responseTainting);
 
     m_varyingHeaderValues = collectVaryingRequestHeaders(m_resourceRequest, m_response, m_sessionID);
 }

Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp (220319 => 220320)


--- trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp	2017-08-05 22:11:28 UTC (rev 220320)
@@ -82,6 +82,7 @@
     data.httpHeaderFields = httpHeaderFields().isolatedCopy();
     data.networkLoadMetrics = m_networkLoadMetrics.isolatedCopy();
     data.type = m_type;
+    data.tainting = m_tainting;
     data.isRedirected = m_isRedirected;
 
     return data;
@@ -103,32 +104,42 @@
     response.m_httpHeaderFields = WTFMove(data.httpHeaderFields);
     response.m_networkLoadMetrics = data.networkLoadMetrics;
     response.m_type = data.type;
+    response.m_tainting = data.tainting;
     response.m_isRedirected = data.isRedirected;
 
     return response;
 }
 
-ResourceResponse ResourceResponseBase::filterResponse(const ResourceResponse& response, ResourceResponse::Tainting tainting)
+ResourceResponse ResourceResponseBase::filter(const ResourceResponse& response)
 {
-    if (tainting == ResourceResponse::Tainting::Opaque) {
+    if (response.tainting() == Tainting::Opaque) {
         ResourceResponse opaqueResponse;
-        opaqueResponse.setType(ResourceResponse::Type::Opaque);
+        opaqueResponse.setTainting(Tainting::Opaque);
+        opaqueResponse.setType(Type::Opaque);
         return opaqueResponse;
     }
 
+    if (response.tainting() == Tainting::Opaqueredirect) {
+        ResourceResponse opaqueResponse;
+        opaqueResponse.setTainting(Tainting::Opaqueredirect);
+        opaqueResponse.setType(Type::Opaqueredirect);
+        opaqueResponse.setURL(response.url());
+        return opaqueResponse;
+    }
+
     ResourceResponse filteredResponse = response;
     // Let's initialize filteredResponse to remove some header fields.
     filteredResponse.lazyInit(AllFields);
 
-    if (tainting == ResourceResponse::Tainting::Basic) {
-        filteredResponse.setType(ResourceResponse::Type::Basic);
+    if (response.tainting() == Tainting::Basic) {
+        filteredResponse.setType(Type::Basic);
         filteredResponse.m_httpHeaderFields.remove(HTTPHeaderName::SetCookie);
         filteredResponse.m_httpHeaderFields.remove(HTTPHeaderName::SetCookie2);
         return filteredResponse;
     }
 
-    ASSERT(tainting == ResourceResponse::Tainting::Cors);
-    filteredResponse.setType(ResourceResponse::Type::Cors);
+    ASSERT(response.tainting() == Tainting::Cors);
+    filteredResponse.setType(Type::Cors);
 
     HTTPHeaderSet accessControlExposeHeaderSet;
     parseAccessControlExposeHeadersAllowList(response.httpHeaderField(HTTPHeaderName::AccessControlExposeHeaders), accessControlExposeHeaderSet);

Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.h (220319 => 220320)


--- trunk/Source/WebCore/platform/network/ResourceResponseBase.h	2017-08-05 18:59:18 UTC (rev 220319)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.h	2017-08-05 22:11:28 UTC (rev 220320)
@@ -44,7 +44,8 @@
 class ResourceResponseBase {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    enum class Type;
+    enum class Type { Basic, Cors, Default, Error, Opaque, Opaqueredirect };
+    enum class Tainting { Basic, Cors, Opaque, Opaqueredirect };
 
     struct CrossThreadData {
         CrossThreadData(const CrossThreadData&) = delete;
@@ -62,6 +63,7 @@
         HTTPHeaderMap httpHeaderFields;
         NetworkLoadMetrics networkLoadMetrics;
         Type type;
+        Tainting tainting;
         bool isRedirected;
     };
 
@@ -68,9 +70,6 @@
     CrossThreadData crossThreadData() const;
     static ResourceResponse fromCrossThreadData(CrossThreadData&&);
 
-    enum class Tainting { Basic, Cors, Opaque };
-    static ResourceResponse filterResponse(const ResourceResponse&, Tainting);
-
     bool isNull() const { return m_isNull; }
     WEBCORE_EXPORT bool isHTTP() const;
     bool isSuccessful() const;
@@ -154,12 +153,16 @@
         return 1280;
     }
 
-    enum class Type { Basic, Cors, Default, Error, Opaque, Opaqueredirect };
     Type type() const { return m_type; }
     void setType(Type type) { m_type = type; }
     bool isRedirected() const { return m_isRedirected; }
     void setRedirected(bool isRedirected) { m_isRedirected = isRedirected; }
 
+    void setTainting(Tainting tainting) { m_tainting = tainting; }
+    Tainting tainting() const { return m_tainting; }
+
+    static ResourceResponse filter(const ResourceResponse&);
+
     static bool compare(const ResourceResponse&, const ResourceResponse&);
 
     template<class Encoder> void encode(Encoder&) const;
@@ -224,6 +227,7 @@
 
     Type m_type { Type::Default };
     bool m_isRedirected { false };
+    Tainting m_tainting { Tainting::Basic };
 };
 
 inline bool operator==(const ResourceResponse& a, const ResourceResponse& b) { return ResourceResponseBase::compare(a, b); }
@@ -255,6 +259,7 @@
     encoder.encodeEnum(m_source);
     encoder << m_cacheBodyKey;
     encoder.encodeEnum(m_type);
+    encoder.encodeEnum(m_tainting);
     encoder << m_isRedirected;
 }
 
@@ -297,6 +302,8 @@
         return false;
     if (!decoder.decodeEnum(response.m_type))
         return false;
+    if (!decoder.decodeEnum(response.m_tainting))
+        return false;
     if (!decoder.decode(response.m_isRedirected))
         return false;
     response.m_isNull = false;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to