Title: [225297] trunk
Revision
225297
Author
commit-qu...@webkit.org
Date
2017-11-29 15:03:49 -0800 (Wed, 29 Nov 2017)

Log Message

Add support for service worker generated redirections
https://bugs.webkit.org/show_bug.cgi?id=179498

Patch by Youenn Fablet <you...@apple.com> on 2017-11-29
Reviewed by Darin Adler.

Source/WebCore:

Test: http/tests/workers/service/service-worker-redirection-fetch.https.html

Added redirection routines following fetch specification to:
- check whether a response is a redirection
- generate a redirected request from a request and its redirection response.
Added some specific redirect request generation following existing WebKit networking code.

* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::redirect):
(WebCore::isRedirectStatus): Deleted.
* platform/network/ResourceRequestBase.cpp:
(WebCore::shouldUseGet):
(WebCore::ResourceRequestBase::redirectedRequest const):
* platform/network/ResourceRequestBase.h:
* platform/network/ResourceResponseBase.h:
(WebCore::ResourceResponseBase::isRedirectionStatusCode):
(WebCore::ResourceResponseBase::isRedirection const):

Source/WebKit:

Small refactoring to allow a service worker redirected fetch to follow the redirection through the service worker.

* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::scheduleLoad): Make use of the loader request in case a network load is needed after a service worker redirection.
* WebProcess/Storage/ServiceWorkerClientFetch.cpp:
(WebKit::ServiceWorkerClientFetch::create):
(WebKit::ServiceWorkerClientFetch::~ServiceWorkerClientFetch):
(WebKit::ServiceWorkerClientFetch::ServiceWorkerClientFetch):
(WebKit::ServiceWorkerClientFetch::start):
(WebKit::ServiceWorkerClientFetch::didReceiveResponse): Check for response.
Generate redirected request if needed and call loader callback to process the redirection.
Adding some states so that if didFinish is called before the willSendRequest callback, redirection is followed.
(WebKit::ServiceWorkerClientFetch::didFinish):
In case redirection should be followed, wait for didFinish to follow it.
This simplifies the model although introducing some limited latency.
* WebProcess/Storage/ServiceWorkerClientFetch.h:
* WebProcess/Storage/WebSWClientConnection.cpp:
(WebKit::WebSWClientConnection::startFetch):
* WebProcess/Storage/WebSWClientConnection.h:
* WebProcess/Storage/WebServiceWorkerProvider.cpp:
(WebKit::WebServiceWorkerProvider::handleFetch):

LayoutTests:

* http/tests/workers/service/resources/service-worker-redirection-fetch-worker.js: Added.
(event.event.request.url.indexOf):
(event.event.request.url.endsWith):
* http/tests/workers/service/service-worker-redirection-fetch.https-expected.txt: Added.
* http/tests/workers/service/service-worker-redirection-fetch.https.html: Added.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (225296 => 225297)


--- trunk/LayoutTests/ChangeLog	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/LayoutTests/ChangeLog	2017-11-29 23:03:49 UTC (rev 225297)
@@ -1,3 +1,16 @@
+2017-11-29  Youenn Fablet  <you...@apple.com>
+
+        Add support for service worker generated redirections
+        https://bugs.webkit.org/show_bug.cgi?id=179498
+
+        Reviewed by Darin Adler.
+
+        * http/tests/workers/service/resources/service-worker-redirection-fetch-worker.js: Added.
+        (event.event.request.url.indexOf):
+        (event.event.request.url.endsWith):
+        * http/tests/workers/service/service-worker-redirection-fetch.https-expected.txt: Added.
+        * http/tests/workers/service/service-worker-redirection-fetch.https.html: Added.
+
 2017-11-29  Chris Dumez  <cdu...@apple.com>
 
         Start exposing self.registration inside service workers

Modified: trunk/Source/WebCore/ChangeLog (225296 => 225297)


--- trunk/Source/WebCore/ChangeLog	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/ChangeLog	2017-11-29 23:03:49 UTC (rev 225297)
@@ -1,3 +1,28 @@
+2017-11-29  Youenn Fablet  <you...@apple.com>
+
+        Add support for service worker generated redirections
+        https://bugs.webkit.org/show_bug.cgi?id=179498
+
+        Reviewed by Darin Adler.
+
+        Test: http/tests/workers/service/service-worker-redirection-fetch.https.html
+
+        Added redirection routines following fetch specification to:
+        - check whether a response is a redirection
+        - generate a redirected request from a request and its redirection response.
+        Added some specific redirect request generation following existing WebKit networking code.
+
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::redirect):
+        (WebCore::isRedirectStatus): Deleted.
+        * platform/network/ResourceRequestBase.cpp:
+        (WebCore::shouldUseGet):
+        (WebCore::ResourceRequestBase::redirectedRequest const):
+        * platform/network/ResourceRequestBase.h:
+        * platform/network/ResourceResponseBase.h:
+        (WebCore::ResourceResponseBase::isRedirectionStatusCode):
+        (WebCore::ResourceResponseBase::isRedirection const):
+
 2017-11-29  Chris Dumez  <cdu...@apple.com>
 
         Start exposing self.registration inside service workers

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (225296 => 225297)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -38,11 +38,6 @@
 
 namespace WebCore {
 
-static inline bool isRedirectStatus(int status)
-{
-    return status == 301 || status == 302 || status == 303 || status == 307 || status == 308;
-}
-
 // https://fetch.spec.whatwg.org/#null-body-status
 static inline bool isNullBodyStatus(int status)
 {
@@ -134,7 +129,7 @@
     URL requestURL = context.completeURL(url);
     if (!requestURL.isValid() || !requestURL.user().isEmpty() || !requestURL.pass().isEmpty())
         return Exception { TypeError };
-    if (!isRedirectStatus(status))
+    if (!ResourceResponse::isRedirectionStatusCode(status))
         return Exception { RangeError };
     auto redirectResponse = adoptRef(*new FetchResponse(context, { }, FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
     redirectResponse->m_response.setHTTPStatusCode(status);

Modified: trunk/Source/WebCore/platform/network/HTTPHeaderNames.in (225296 => 225297)


--- trunk/Source/WebCore/platform/network/HTTPHeaderNames.in	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/platform/network/HTTPHeaderNames.in	2017-11-29 23:03:49 UTC (rev 225297)
@@ -74,6 +74,7 @@
 Ping-To
 Purpose
 Pragma
+Proxy-Authorization
 Range
 Referer
 Refresh

Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp (225296 => 225297)


--- trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -120,6 +120,42 @@
     m_platformRequestUpdated = false;
 }
 
+static bool shouldUseGet(const ResourceRequestBase& request, const ResourceResponse& redirectResponse)
+{
+    if (redirectResponse.httpStatusCode() == 301 || redirectResponse.httpStatusCode() == 302)
+        return equalLettersIgnoringASCIICase(request.httpMethod(), "post");
+    return redirectResponse.httpStatusCode() == 303;
+}
+
+ResourceRequest ResourceRequestBase::redirectedRequest(const ResourceResponse& redirectResponse, bool shouldClearReferrerOnHTTPSToHTTPRedirect) const
+{
+    ASSERT(redirectResponse.isRedirection());
+    // This method is based on https://fetch.spec.whatwg.org/#http-redirect-fetch.
+    // It also implements additional processing like done by CFNetwork layer.
+
+    auto request = asResourceRequest();
+    auto location = redirectResponse.httpHeaderField(HTTPHeaderName::Location);
+
+    request.setURL(location.isEmpty() ? URL { } : URL { redirectResponse.url(), location });
+
+    if (shouldUseGet(*this, redirectResponse)) {
+        request.setHTTPMethod(ASCIILiteral("GET"));
+        request.setHTTPBody(nullptr);
+        request.clearHTTPContentType();
+        request.m_httpHeaderFields.remove(HTTPHeaderName::ContentLength);
+    }
+
+    if (shouldClearReferrerOnHTTPSToHTTPRedirect && !request.url().protocolIs("https") && WebCore::protocolIs(request.httpReferrer(), "https"))
+        request.clearHTTPReferrer();
+
+    if (!protocolHostAndPortAreEqual(request.url(), redirectResponse.url()))
+        request.clearHTTPOrigin();
+    request.clearHTTPAuthorization();
+    request.m_httpHeaderFields.remove(HTTPHeaderName::ProxyAuthorization);
+
+    return request;
+}
+
 void ResourceRequestBase::removeCredentials()
 {
     updateResourceRequest(); 
@@ -520,7 +556,7 @@
     return arePointingToEqualData(a.httpBody(), b.httpBody());
 }
 
-bool ResourceRequestBase::compare(const ResourceRequest& a, const ResourceRequest& b)
+bool ResourceRequestBase::equal(const ResourceRequest& a, const ResourceRequest& b)
 {
     if (!equalIgnoringHeaderFields(a, b))
         return false;

Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.h (225296 => 225297)


--- trunk/Source/WebCore/platform/network/ResourceRequestBase.h	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.h	2017-11-29 23:03:49 UTC (rev 225297)
@@ -50,6 +50,7 @@
 };
 
 class ResourceRequest;
+class ResourceResponse;
 
 // Do not use this type directly.  Use ResourceRequest instead.
 class ResourceRequestBase {
@@ -64,6 +65,8 @@
     WEBCORE_EXPORT const URL& url() const;
     WEBCORE_EXPORT void setURL(const URL& url);
 
+    WEBCORE_EXPORT ResourceRequest redirectedRequest(const ResourceResponse&, bool shouldClearReferrerOnHTTPSToHTTPRedirect) const;
+
     WEBCORE_EXPORT void removeCredentials();
 
     WEBCORE_EXPORT ResourceRequestCachePolicy cachePolicy() const;
@@ -170,7 +173,7 @@
     WEBCORE_EXPORT static void setDefaultAllowCookies(bool);
 #endif
 
-    static bool compare(const ResourceRequest&, const ResourceRequest&);
+    WEBCORE_EXPORT static bool equal(const ResourceRequest&, const ResourceRequest&);
 
 protected:
     // Used when ResourceRequest is initialized from a platform representation of the request
@@ -234,7 +237,7 @@
 
 bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&);
 
-inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::compare(a, b); }
+inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::equal(a, b); }
 inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
 
 WEBCORE_EXPORT unsigned initializeMaximumHTTPConnectionCountPerHost();

Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.h (225296 => 225297)


--- trunk/Source/WebCore/platform/network/ResourceResponseBase.h	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.h	2017-11-29 23:03:49 UTC (rev 225297)
@@ -47,6 +47,8 @@
     enum class Type { Basic, Cors, Default, Error, Opaque, Opaqueredirect };
     enum class Tainting { Basic, Cors, Opaque, Opaqueredirect };
 
+    static bool isRedirectionStatusCode(int code) { return code == 301 || code == 302 || code == 303 || code == 307 || code == 308; }
+
     struct CrossThreadData {
         CrossThreadData(const CrossThreadData&) = delete;
         CrossThreadData& operator=(const CrossThreadData&) = delete;
@@ -88,6 +90,7 @@
 
     WEBCORE_EXPORT int httpStatusCode() const;
     WEBCORE_EXPORT void setHTTPStatusCode(int);
+    bool isRedirection() const { return isRedirectionStatusCode(m_httpStatusCode); }
 
     WEBCORE_EXPORT const String& httpStatusText() const;
     WEBCORE_EXPORT void setHTTPStatusText(const String&);

Modified: trunk/Source/WebKit/ChangeLog (225296 => 225297)


--- trunk/Source/WebKit/ChangeLog	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/ChangeLog	2017-11-29 23:03:49 UTC (rev 225297)
@@ -1,5 +1,34 @@
 2017-11-29  Youenn Fablet  <you...@apple.com>
 
+        Add support for service worker generated redirections
+        https://bugs.webkit.org/show_bug.cgi?id=179498
+
+        Reviewed by Darin Adler.
+
+        Small refactoring to allow a service worker redirected fetch to follow the redirection through the service worker.
+
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::scheduleLoad): Make use of the loader request in case a network load is needed after a service worker redirection.
+        * WebProcess/Storage/ServiceWorkerClientFetch.cpp:
+        (WebKit::ServiceWorkerClientFetch::create):
+        (WebKit::ServiceWorkerClientFetch::~ServiceWorkerClientFetch):
+        (WebKit::ServiceWorkerClientFetch::ServiceWorkerClientFetch):
+        (WebKit::ServiceWorkerClientFetch::start):
+        (WebKit::ServiceWorkerClientFetch::didReceiveResponse): Check for response.
+        Generate redirected request if needed and call loader callback to process the redirection.
+        Adding some states so that if didFinish is called before the willSendRequest callback, redirection is followed.
+        (WebKit::ServiceWorkerClientFetch::didFinish):
+        In case redirection should be followed, wait for didFinish to follow it.
+        This simplifies the model although introducing some limited latency.
+        * WebProcess/Storage/ServiceWorkerClientFetch.h:
+        * WebProcess/Storage/WebSWClientConnection.cpp:
+        (WebKit::WebSWClientConnection::startFetch):
+        * WebProcess/Storage/WebSWClientConnection.h:
+        * WebProcess/Storage/WebServiceWorkerProvider.cpp:
+        (WebKit::WebServiceWorkerProvider::handleFetch):
+
+2017-11-29  Youenn Fablet  <you...@apple.com>
+
         Add support for FetchEvent.clientId
         https://bugs.webkit.org/show_bug.cgi?id=180052
 

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -219,7 +219,7 @@
     }
 
 #if ENABLE(SERVICE_WORKER)
-    WebServiceWorkerProvider::singleton().handleFetch(resourceLoader, resource, sessionID, [trackingParameters, sessionID, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime = maximumBufferingTime(resource), resourceLoader = makeRef(resourceLoader)] (ServiceWorkerClientFetch::Result result) mutable {
+    WebServiceWorkerProvider::singleton().handleFetch(resourceLoader, resource, sessionID, shouldClearReferrerOnHTTPSToHTTPRedirect, [trackingParameters, sessionID, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime = maximumBufferingTime(resource), resourceLoader = makeRef(resourceLoader)] (ServiceWorkerClientFetch::Result result) mutable {
         if (result != ServiceWorkerClientFetch::Result::Unhandled)
             return;
         if (resourceLoader->options().serviceWorkersMode == ServiceWorkersMode::Only) {
@@ -232,7 +232,7 @@
         }
 
         LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, url '%s' will be scheduled through ServiceWorker handle fetch algorithm", resourceLoader->url().string().latin1().data());
-        WebProcess::singleton().webLoaderStrategy().scheduleLoadFromNetworkProcess(resourceLoader.get(), resourceLoader->originalRequest(), trackingParameters, sessionID, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime);
+        WebProcess::singleton().webLoaderStrategy().scheduleLoadFromNetworkProcess(resourceLoader.get(), resourceLoader->request(), trackingParameters, sessionID, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime);
     });
 #else
     LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, url '%s' will be scheduled through ServiceWorker handle fetch algorithm", resourceLoader.url().string().latin1().data());

Modified: trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -29,6 +29,7 @@
 #if ENABLE(SERVICE_WORKER)
 
 #include "DataReference.h"
+#include "WebSWClientConnection.h"
 #include "WebServiceWorkerProvider.h"
 #include <WebCore/MIMETypeRegistry.h>
 #include <WebCore/NotImplemented.h>
@@ -38,25 +39,50 @@
 
 namespace WebKit {
 
-ServiceWorkerClientFetch::ServiceWorkerClientFetch(WebServiceWorkerProvider& serviceWorkerProvider, Ref<WebCore::ResourceLoader>&& loader, uint64_t identifier, Ref<IPC::Connection>&& connection, Callback&& callback)
+Ref<ServiceWorkerClientFetch> ServiceWorkerClientFetch::create(WebServiceWorkerProvider& serviceWorkerProvider, Ref<WebCore::ResourceLoader>&& loader, uint64_t identifier, Ref<WebSWClientConnection>&& connection, bool shouldClearReferrerOnHTTPSToHTTPRedirect, Callback&& callback)
+{
+    auto fetch = adoptRef(*new ServiceWorkerClientFetch { serviceWorkerProvider, WTFMove(loader), identifier, WTFMove(connection), shouldClearReferrerOnHTTPSToHTTPRedirect, WTFMove(callback) });
+    fetch->start();
+    return fetch;
+}
+
+ServiceWorkerClientFetch::~ServiceWorkerClientFetch()
+{
+}
+
+ServiceWorkerClientFetch::ServiceWorkerClientFetch(WebServiceWorkerProvider& serviceWorkerProvider, Ref<WebCore::ResourceLoader>&& loader, uint64_t identifier, Ref<WebSWClientConnection>&& connection, bool shouldClearReferrerOnHTTPSToHTTPRedirect, Callback&& callback)
     : m_serviceWorkerProvider(serviceWorkerProvider)
     , m_loader(WTFMove(loader))
     , m_identifier(identifier)
     , m_connection(WTFMove(connection))
     , m_callback(WTFMove(callback))
+    , m_shouldClearReferrerOnHTTPSToHTTPRedirect(shouldClearReferrerOnHTTPSToHTTPRedirect)
 {
 }
 
+void ServiceWorkerClientFetch::start()
+{
+    m_connection->startFetch(m_loader, m_loader->identifier());
+}
+
 void ServiceWorkerClientFetch::didReceiveResponse(WebCore::ResourceResponse&& response)
 {
     auto protectedThis = makeRef(*this);
 
-    if (!(response.httpStatusCode() <= 300 || response.httpStatusCode() >= 400 || response.httpStatusCode() == 304 || response.httpStatusCode() == 305 || response.httpStatusCode() == 306)) {
-        // FIXME: Support redirections.
-        notImplemented();
-        m_loader->didFail({ ResourceError::Type::General });
-        if (auto callback = WTFMove(m_callback))
-            callback(Result::Succeeded);
+    if (response.isRedirection()) {
+        m_redirectionStatus = RedirectionStatus::Receiving;
+        // FIXME: Get shouldClearReferrerOnHTTPSToHTTPRedirect value from
+        m_loader->willSendRequest(m_loader->request().redirectedRequest(response, m_shouldClearReferrerOnHTTPSToHTTPRedirect), response, [protectedThis = makeRef(*this), this](ResourceRequest&& request) {
+            if (request.isNull() || !m_callback)
+                return;
+
+            ASSERT(request == m_loader->request());
+            if (m_redirectionStatus == RedirectionStatus::Received) {
+                start();
+                return;
+            }
+            m_redirectionStatus = RedirectionStatus::Following;
+        });
         return;
     }
 
@@ -92,6 +118,21 @@
 
 void ServiceWorkerClientFetch::didFinish()
 {
+    switch (m_redirectionStatus) {
+    case RedirectionStatus::None:
+        break;
+    case RedirectionStatus::Receiving:
+        m_redirectionStatus = RedirectionStatus::Received;
+        return;
+    case RedirectionStatus::Following:
+        m_redirectionStatus = RedirectionStatus::None;
+        start();
+        return;
+    case RedirectionStatus::Received:
+        ASSERT_NOT_REACHED();
+        m_redirectionStatus = RedirectionStatus::None;
+    }
+
     ASSERT(!m_callback);
 
     auto protectedThis = makeRef(*this);

Modified: trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h	2017-11-29 23:03:49 UTC (rev 225297)
@@ -27,6 +27,7 @@
 
 #if ENABLE(SERVICE_WORKER)
 
+#include "DataReference.h"
 #include "FormDataReference.h"
 #include "MessageReceiver.h"
 #include "MessageSender.h"
@@ -35,18 +36,19 @@
 
 namespace WebKit {
 
+class WebSWClientConnection;
 class WebServiceWorkerProvider;
 
-class ServiceWorkerClientFetch final : public RefCounted<ServiceWorkerClientFetch>, public IPC::MessageSender, public IPC::MessageReceiver {
+class ServiceWorkerClientFetch final : public RefCounted<ServiceWorkerClientFetch>, public IPC::MessageReceiver {
 public:
     enum class Result { Succeeded, Cancelled, Unhandled };
     using Callback = WTF::CompletionHandler<void(Result)>;
 
-    static Ref<ServiceWorkerClientFetch> create(WebServiceWorkerProvider& serviceWorkerProvider, Ref<WebCore::ResourceLoader>&& loader, uint64_t identifier, Ref<IPC::Connection>&& connection, Callback&& callback)
-    {
-        return adoptRef(*new ServiceWorkerClientFetch { serviceWorkerProvider, WTFMove(loader), identifier, WTFMove(connection), WTFMove(callback) });
-    }
+    static Ref<ServiceWorkerClientFetch> create(WebServiceWorkerProvider&, Ref<WebCore::ResourceLoader>&&, uint64_t identifier, Ref<WebSWClientConnection>&&, bool shouldClearReferrerOnHTTPSToHTTPRedirect, Callback&&);
+    ~ServiceWorkerClientFetch();
 
+    void start();
+
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     void cancel();
 
@@ -53,7 +55,7 @@
     bool isOngoing() const { return !!m_callback; }
 
 private:
-    ServiceWorkerClientFetch(WebServiceWorkerProvider&, Ref<WebCore::ResourceLoader>&&, uint64_t identifier, Ref<IPC::Connection>&&, Callback&&);
+    ServiceWorkerClientFetch(WebServiceWorkerProvider&, Ref<WebCore::ResourceLoader>&&, uint64_t identifier, Ref<WebSWClientConnection>&&, bool shouldClearReferrerOnHTTPSToHTTPRedirect, Callback&&);
 
     void didReceiveResponse(WebCore::ResourceResponse&&);
     void didReceiveData(const IPC::DataReference&, int64_t encodedDataLength);
@@ -62,14 +64,14 @@
     void didFail();
     void didNotHandle();
 
-    IPC::Connection* messageSenderConnection() final { return m_connection.ptr(); }
-    uint64_t messageSenderDestinationID() final { return m_identifier; }
-
     WebServiceWorkerProvider& m_serviceWorkerProvider;
     Ref<WebCore::ResourceLoader> m_loader;
     uint64_t m_identifier { 0 };
-    Ref<IPC::Connection> m_connection;
+    Ref<WebSWClientConnection> m_connection;
     Callback m_callback;
+    enum class RedirectionStatus { None, Receiving, Following, Received };
+    RedirectionStatus m_redirectionStatus { RedirectionStatus::None };
+    bool m_shouldClearReferrerOnHTTPSToHTTPRedirect { true };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -166,12 +166,10 @@
     send(Messages::WebSWServerConnection::GetRegistrations(requestIdentifier, SecurityOriginData::fromSecurityOrigin(topOrigin), clientURL));
 }
 
-Ref<ServiceWorkerClientFetch> WebSWClientConnection::startFetch(WebServiceWorkerProvider& provider, Ref<WebCore::ResourceLoader>&& loader, uint64_t identifier, ServiceWorkerClientFetch::Callback&& callback)
+void WebSWClientConnection::startFetch(const ResourceLoader& loader, uint64_t identifier)
 {
-    ASSERT(loader->options().serviceWorkersMode != ServiceWorkersMode::None && loader->options().serviceWorkerIdentifier);
-
-    send(Messages::WebSWServerConnection::StartFetch { identifier, loader->options().serviceWorkerIdentifier, loader->originalRequest(), loader->options(), IPC::FormDataReference { loader->originalRequest().httpBody() } });
-    return ServiceWorkerClientFetch::create(provider, WTFMove(loader), identifier, m_connection.get(), WTFMove(callback));
+    ASSERT(loader.options().serviceWorkersMode != ServiceWorkersMode::None && loader.options().serviceWorkerIdentifier);
+    send(Messages::WebSWServerConnection::StartFetch { identifier, loader.options().serviceWorkerIdentifier, loader.request(), loader.options(), IPC::FormDataReference { loader.request().httpBody() } });
 }
 
 void WebSWClientConnection::postMessageToServiceWorkerClient(DocumentIdentifier destinationContextIdentifier, const IPC::DataReference& message, ServiceWorkerData&& source, const String& sourceOrigin)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h	2017-11-29 23:03:49 UTC (rev 225297)
@@ -61,7 +61,7 @@
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
 
     bool mayHaveServiceWorkerRegisteredForOrigin(const WebCore::SecurityOrigin&) const final;
-    Ref<ServiceWorkerClientFetch> startFetch(WebServiceWorkerProvider&, Ref<WebCore::ResourceLoader>&&, uint64_t identifier, ServiceWorkerClientFetch::Callback&&);
+    void startFetch(const WebCore::ResourceLoader&, uint64_t identifier);
 
     void postMessageToServiceWorkerClient(WebCore::DocumentIdentifier destinationContextIdentifier, const IPC::DataReference& message, WebCore::ServiceWorkerData&& source, const String& sourceOrigin);
 

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp	2017-11-29 23:03:49 UTC (rev 225297)
@@ -69,7 +69,7 @@
     return !!options.serviceWorkerIdentifier;
 }
 
-void WebServiceWorkerProvider::handleFetch(ResourceLoader& loader, CachedResource* resource, PAL::SessionID sessionID, ServiceWorkerClientFetch::Callback&& callback)
+void WebServiceWorkerProvider::handleFetch(ResourceLoader& loader, CachedResource* resource, PAL::SessionID sessionID, bool shouldClearReferrerOnHTTPSToHTTPRedirect, ServiceWorkerClientFetch::Callback&& callback)
 {
     if (!loader.request().url().protocolIsInHTTPFamily() || !shouldHandleFetch(loader.options())) {
         callback(ServiceWorkerClientFetch::Result::Unhandled);
@@ -77,10 +77,7 @@
     }
 
     auto& connection = WebProcess::singleton().ensureWebToStorageProcessConnection().serviceWorkerConnectionForSession(sessionID);
-    auto fetch = connection.startFetch(*this, loader, loader.identifier(), WTFMove(callback));
-    ASSERT(fetch->isOngoing());
-
-    m_ongoingFetchTasks.add(loader.identifier(), WTFMove(fetch));
+    m_ongoingFetchTasks.add(loader.identifier(), ServiceWorkerClientFetch::create(*this, loader, loader.identifier(), connection, shouldClearReferrerOnHTTPSToHTTPRedirect, WTFMove(callback)));
 }
 
 bool WebServiceWorkerProvider::cancelFetch(uint64_t fetchIdentifier)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.h (225296 => 225297)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.h	2017-11-29 22:19:23 UTC (rev 225296)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.h	2017-11-29 23:03:49 UTC (rev 225297)
@@ -41,7 +41,7 @@
 public:
     static WebServiceWorkerProvider& singleton();
 
-    void handleFetch(WebCore::ResourceLoader&, WebCore::CachedResource*, PAL::SessionID, ServiceWorkerClientFetch::Callback&&);
+    void handleFetch(WebCore::ResourceLoader&, WebCore::CachedResource*, PAL::SessionID, bool shouldClearReferrerOnHTTPSToHTTPRedirect, ServiceWorkerClientFetch::Callback&&);
     bool cancelFetch(uint64_t fetchIdentifier);
     void fetchFinished(uint64_t fetchIdentifier);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to