Title: [291340] trunk
Revision
291340
Author
you...@apple.com
Date
2022-03-16 05:52:33 -0700 (Wed, 16 Mar 2022)

Log Message

redirectCount returns 0 when using a Service Worker
https://bugs.webkit.org/show_bug.cgi?id=235710
<rdar://problem/88432190>

Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt:
* web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt:

Source/WebKit:

Pass an optional NetworkLoadMetrics when sending the response to web process.
Include the redirectCount value computed by NetworkResourceLoader.
Make service worker redirections go through NetworkResourceLoader to set the redirectCount value and for correctness.

Covered by updated test.

* NetworkProcess/NetworkResourceLoader.cpp:
* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
(WebKit::ServiceWorkerFetchTask::processRedirectResponse):
* WebProcess/Network/WebResourceLoader.cpp:
* WebProcess/Network/WebResourceLoader.h:
* WebProcess/Network/WebResourceLoader.messages.in:

LayoutTests:

* http/wpt/service-workers/navigation-redirect-main-frame.https.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (291339 => 291340)


--- trunk/LayoutTests/ChangeLog	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/LayoutTests/ChangeLog	2022-03-16 12:52:33 UTC (rev 291340)
@@ -1,5 +1,15 @@
 2022-03-16  Youenn Fablet  <you...@apple.com>
 
+        redirectCount returns 0 when using a Service Worker
+        https://bugs.webkit.org/show_bug.cgi?id=235710
+        <rdar://problem/88432190>
+
+        Reviewed by Chris Dumez.
+
+        * http/wpt/service-workers/navigation-redirect-main-frame.https.html:
+
+2022-03-16  Youenn Fablet  <you...@apple.com>
+
         LayoutTests/webaudio tests are skipped in iOS
         https://bugs.webkit.org/show_bug.cgi?id=237889
 

Modified: trunk/LayoutTests/http/wpt/service-workers/navigation-redirect-main-frame.https.html (291339 => 291340)


--- trunk/LayoutTests/http/wpt/service-workers/navigation-redirect-main-frame.https.html	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-redirect-main-frame.https.html	2022-03-16 12:52:33 UTC (rev 291340)
@@ -7,14 +7,19 @@
 async function doTest()
 {
     if (window.location.hash === "#redirected") {
+        let status = "PASS";
+        if (window.performance.navigation.redirectCount !== 1)
+                 status = "FAIL: redirectCount is " + window.performance.navigation.redirectCount;
+        else if (window.testRunner) {
+             if (!testRunner.didReceiveServerRedirectForProvisionalNavigation)
+                 status = "FAIL: no server redirect for provisional navigation ";
+            testRunner.clearDidReceiveServerRedirectForProvisionalNavigation();
+        }
+
+        document.body.innerHTML = status;
+
         if (window.testRunner)
-            document.body.innerHTML = testRunner.didReceiveServerRedirectForProvisionalNavigation ? "PASS" : "FAIL";
-        else
-            document.body.innerHTML = "PASS";
-        if (window.testRunner) {
-            testRunner.clearDidReceiveServerRedirectForProvisionalNavigation();
             testRunner.notifyDone();
-        }
         return;
     }
     var registration = await navigator.serviceWorker.register("navigation-redirect-main-frame-worker.js", { scope : "resources" });

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (291339 => 291340)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-03-16 12:52:33 UTC (rev 291340)
@@ -1,3 +1,14 @@
+2022-03-16  Youenn Fablet  <you...@apple.com>
+
+        redirectCount returns 0 when using a Service Worker
+        https://bugs.webkit.org/show_bug.cgi?id=235710
+        <rdar://problem/88432190>
+
+        Reviewed by Chris Dumez.
+
+        * web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt:
+        * web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt:
+
 2022-03-15  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, reverting r291282.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt (291339 => 291340)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt	2022-03-16 12:52:33 UTC (rev 291340)
@@ -1,4 +1,3 @@
 
+PASS Navigation Preload Resource Timing.
 
-FAIL Navigation Preload Resource Timing. assert_greater_than: transferSize must greater then encodedBodySize. expected a number greater than 0 but got 0
-

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt (291339 => 291340)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt	2022-03-16 12:52:33 UTC (rev 291340)
@@ -19,7 +19,7 @@
 PASS mode: "manual", manually-generated redirect response
 PASS mode: "follow", generated relative redirect response
 PASS mode: "error", generated relative redirect response
-FAIL mode: "manual", generated relative redirect response promise_test: Unhandled rejection with value: object "TypeError: Load failed"
+PASS mode: "manual", generated relative redirect response
 PASS Fetch should follow the redirect response 20 times
 PASS Fetch should not follow the redirect response 21 times.
 PASS The URL for the service worker redirected request should be propagated to response.

Modified: trunk/Source/WebKit/ChangeLog (291339 => 291340)


--- trunk/Source/WebKit/ChangeLog	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/ChangeLog	2022-03-16 12:52:33 UTC (rev 291340)
@@ -1,3 +1,24 @@
+2022-03-16  Youenn Fablet  <you...@apple.com>
+
+        redirectCount returns 0 when using a Service Worker
+        https://bugs.webkit.org/show_bug.cgi?id=235710
+        <rdar://problem/88432190>
+
+        Reviewed by Chris Dumez.
+
+        Pass an optional NetworkLoadMetrics when sending the response to web process.
+        Include the redirectCount value computed by NetworkResourceLoader.
+        Make service worker redirections go through NetworkResourceLoader to set the redirectCount value and for correctness.
+
+        Covered by updated test.
+
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
+        (WebKit::ServiceWorkerFetchTask::processRedirectResponse):
+        * WebProcess/Network/WebResourceLoader.cpp:
+        * WebProcess/Network/WebResourceLoader.h:
+        * WebProcess/Network/WebResourceLoader.messages.in:
+
 2022-03-16  Pablo Saavedra  <psaave...@igalia.com>
 
         [GTK][WPE] Crash during the WebPage::close() related to GL resources destruction

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (291339 => 291340)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2022-03-16 12:52:33 UTC (rev 291340)
@@ -559,6 +559,19 @@
     cleanup(LoadResult::Cancel);
 }
 
+std::optional<NetworkLoadMetrics> NetworkResourceLoader::computeResponseMetrics(const ResourceResponse& response) const
+{
+    if (parameters().options.mode != FetchOptions::Mode::Navigate)
+        return { };
+
+    NetworkLoadMetrics networkLoadMetrics;
+    if (auto* metrics = response.deprecatedNetworkLoadMetricsOrNull())
+        networkLoadMetrics = *metrics;
+    networkLoadMetrics.redirectCount = m_redirectCount;
+
+    return networkLoadMetrics;
+}
+
 void NetworkResourceLoader::transferToNewWebProcess(NetworkConnectionToWebProcess& newConnection, WebCore::ResourceLoaderIdentifier newCoreIdentifier)
 {
     m_connection = newConnection;
@@ -570,7 +583,7 @@
     ASSERT(m_responseCompletionHandler || m_cacheEntryWaitingForContinueDidReceiveResponse);
 #endif
     bool willWaitForContinueDidReceiveResponse = true;
-    send(Messages::WebResourceLoader::DidReceiveResponse { m_response, m_privateRelayed, willWaitForContinueDidReceiveResponse });
+    send(Messages::WebResourceLoader::DidReceiveResponse { m_response, m_privateRelayed, willWaitForContinueDidReceiveResponse, computeResponseMetrics(m_response) });
 }
 
 bool NetworkResourceLoader::shouldInterruptLoadForXFrameOptions(const String& xFrameOptions, const URL& url)
@@ -857,7 +870,7 @@
 {
     auto browsingContextGroupSwitchDecision = toBrowsingContextGroupSwitchDecision(m_currentCoopEnforcementResult);
     if (browsingContextGroupSwitchDecision == BrowsingContextGroupSwitchDecision::StayInGroup) {
-        send(Messages::WebResourceLoader::DidReceiveResponse { response, privateRelayed, needsContinueDidReceiveResponseMessage });
+        send(Messages::WebResourceLoader::DidReceiveResponse { response, privateRelayed, needsContinueDidReceiveResponseMessage, computeResponseMetrics(response) });
         return;
     }
 
@@ -1021,6 +1034,16 @@
 
 void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
 {
+    willSendRedirectedRequestInternal(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), IsFromServiceWorker::No);
+}
+
+void NetworkResourceLoader::willSendServiceWorkerRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
+{
+    willSendRedirectedRequestInternal(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), IsFromServiceWorker::Yes);
+}
+
+void NetworkResourceLoader::willSendRedirectedRequestInternal(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse, IsFromServiceWorker isFromServiceWorker)
+{
     LOADER_RELEASE_LOG("willSendRedirectedRequest:");
     ++m_redirectCount;
     m_redirectResponse = redirectResponse;
@@ -1042,9 +1065,11 @@
             addConsoleMessage(MessageSource::PrivateClickMeasurement, MessageLevel::Error, result.error());
     }
 
-    auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse);
-    if (redirectResponse.source() == ResourceResponse::Source::Network && canUseCachedRedirect(request))
-        m_cache->storeRedirect(request, redirectResponse, redirectRequest, maxAgeCap);
+    if (isFromServiceWorker == IsFromServiceWorker::No) {
+        auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse);
+        if (redirectResponse.source() == ResourceResponse::Source::Network && canUseCachedRedirect(request))
+            m_cache->storeRedirect(request, redirectResponse, redirectRequest, maxAgeCap);
+    }
 
     if (isMainResource() && shouldInterruptNavigationForCrossOriginEmbedderPolicy(redirectResponse)) {
         this->didFailLoading(ResourceError { errorDomainWebKitInternal, 0, redirectRequest.url(), "Redirection was blocked by Cross-Origin-Embedder-Policy"_s, ResourceError::Type::AccessControl });

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h (291339 => 291340)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2022-03-16 12:52:33 UTC (rev 291340)
@@ -165,6 +165,8 @@
     void deref() const final { RefCounted<NetworkResourceLoader>::deref(); }
 #endif
 
+    void willSendServiceWorkerRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&);
+
 private:
     NetworkResourceLoader(NetworkResourceLoadParameters&&, NetworkConnectionToWebProcess&, Messages::NetworkConnectionToWebProcess::PerformSynchronousLoadDelayedReply&&);
 
@@ -242,6 +244,10 @@
     void startContentFiltering(WebCore::ResourceRequest&);
 #endif
 
+    enum class IsFromServiceWorker : bool { No, Yes };
+    void willSendRedirectedRequestInternal(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&, IsFromServiceWorker);
+    std::optional<WebCore::NetworkLoadMetrics> computeResponseMetrics(const WebCore::ResourceResponse&) const;
+
     const NetworkResourceLoadParameters m_parameters;
 
     Ref<NetworkConnectionToWebProcess> m_connection;

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp (291339 => 291340)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-03-16 12:52:33 UTC (rev 291340)
@@ -183,7 +183,7 @@
         response.setSource(ResourceResponse::Source::ServiceWorker);
     auto newRequest = m_currentRequest.redirectedRequest(response, m_loader.parameters().shouldClearReferrerOnHTTPSToHTTPRedirect);
 
-    sendToClient(Messages::WebResourceLoader::WillSendRequest { newRequest, IPC::FormDataReference { newRequest.httpBody() }, response });
+    m_loader.willSendServiceWorkerRedirectedRequest(ResourceRequest(m_currentRequest), WTFMove(newRequest), WTFMove(response));
 }
 
 void ServiceWorkerFetchTask::didReceiveResponse(WebCore::ResourceResponse&& response, bool needsContinueDidReceiveResponseMessage)

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp (291339 => 291340)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp	2022-03-16 12:52:33 UTC (rev 291340)
@@ -154,8 +154,10 @@
 
 void ServiceWorkerNavigationPreloader::willSendRedirectedRequest(ResourceRequest&&, ResourceRequest&&, ResourceResponse&& response)
 {
-    didReceiveResponse(WTFMove(response), PrivateRelayed::No, [](auto) { });
-    didComplete();
+    didReceiveResponse(WTFMove(response), PrivateRelayed::No, [weakThis = WeakPtr { *this }](auto) {
+        if (weakThis)
+            weakThis->didComplete();
+    });
 }
 
 void ServiceWorkerNavigationPreloader::didReceiveResponse(ResourceResponse&& response, PrivateRelayed, ResponseCompletionHandler&& completionHandler)

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp (291339 => 291340)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2022-03-16 12:52:33 UTC (rev 291340)
@@ -149,7 +149,7 @@
     m_coreLoader->didSendData(bytesSent, totalBytesToBeSent);
 }
 
-void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage)
+void WebResourceLoader::didReceiveResponse(ResourceResponse&& response, PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<NetworkLoadMetrics>&& metrics)
 {
     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveResponse for '%s'. Status %d.", m_coreLoader->url().string().latin1().data(), response.httpStatusCode());
     WEBRESOURCELOADER_RELEASE_LOG("didReceiveResponse: (httpStatusCode=%d)", response.httpStatusCode());
@@ -156,6 +156,9 @@
 
     Ref<WebResourceLoader> protectedThis(*this);
 
+    if (metrics)
+        response.setDeprecatedNetworkLoadMetrics(Box<NetworkLoadMetrics>::create(WTFMove(*metrics)));
+
     if (privateRelayed == PrivateRelayed::Yes && mainFrameMainResource() == MainFrameMainResource::Yes)
         WebProcess::singleton().setHadMainFrameMainResourcePrivateRelayed();
 

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h (291339 => 291340)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2022-03-16 12:52:33 UTC (rev 291340)
@@ -85,7 +85,7 @@
 
     void willSendRequest(WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&&);
     void didSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent);
-    void didReceiveResponse(const WebCore::ResourceResponse&, PrivateRelayed, bool needsContinueDidReceiveResponseMessage);
+    void didReceiveResponse(WebCore::ResourceResponse&&, PrivateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics>&&);
     void didReceiveData(const IPC::SharedBufferCopy& data, int64_t encodedDataLength);
     void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&);
     void didFailResourceLoad(const WebCore::ResourceError&);

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in (291339 => 291340)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2022-03-16 12:05:08 UTC (rev 291339)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2022-03-16 12:52:33 UTC (rev 291340)
@@ -23,7 +23,7 @@
 messages -> WebResourceLoader LegacyReceiver {
     WillSendRequest(WebCore::ResourceRequest request, IPC::FormDataReference requestBody, WebCore::ResourceResponse redirectResponse)
     DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent)
-    DidReceiveResponse(WebCore::ResourceResponse response, enum:bool WebKit::PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage)
+    DidReceiveResponse(WebCore::ResourceResponse response, enum:bool WebKit::PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics> optionalNetworkLoadMetrics)
     DidReceiveData(IPC::SharedBufferCopy data, int64_t encodedDataLength)
     DidFinishResourceLoad(WebCore::NetworkLoadMetrics networkLoadMetrics)
     DidFailResourceLoad(WebCore::ResourceError error)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to