DocumentThreadableLoader should ensure service worker is not reused if redirection comes from the network
https://bugs.webkit.org/show_bug.cgi?id=182137

Patch by Youenn Fablet <youenn@apple.com> on 2018-01-25
Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/service-worker/fetch-request-fallback.https-expected.txt:

Source/WebCore:

Covered by rebased test.
In case redirection does not come from memory cache or service worker, disable service worker interception when following the redirection.

* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::redirectReceived):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@227626 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 3d58d41e..c870820 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,5 +1,18 @@
 2018-01-25  Youenn Fablet  <youenn@apple.com>
 
+        DocumentThreadableLoader should ensure service worker is not reused if redirection comes from the network
+        https://bugs.webkit.org/show_bug.cgi?id=182137
+
+        Reviewed by Chris Dumez.
+
+        Covered by rebased test.
+        In case redirection does not come from memory cache or service worker, disable service worker interception when following the redirection.
+
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::redirectReceived):
+
+2018-01-25  Youenn Fablet  <youenn@apple.com>
+
         DocumentLoader should interrupt ongoing load when getting a redirection from network that matches a service worker
         https://bugs.webkit.org/show_bug.cgi?id=182115
 
diff --git a/Source/WebCore/loader/DocumentThreadableLoader.cpp b/Source/WebCore/loader/DocumentThreadableLoader.cpp
index 44ab9c2..4f4be1a 100644
--- a/Source/WebCore/loader/DocumentThreadableLoader.cpp
+++ b/Source/WebCore/loader/DocumentThreadableLoader.cpp
@@ -293,6 +293,10 @@
         m_originalHeaders->remove(HTTPHeaderName::Authorization);
     request.setHTTPHeaderFields(*m_originalHeaders);
 
+#if ENABLE(SERVICE_WORKER)
+    if (redirectResponse.source() != ResourceResponse::Source::ServiceWorker && redirectResponse.source() != ResourceResponse::Source::MemoryCache)
+        m_options.serviceWorkersMode = ServiceWorkersMode::None;
+#endif
     makeCrossOriginAccessRequest(ResourceRequest(request));
     completionHandler(WTFMove(request));
 }