Title: [295518] trunk
Revision
295518
Author
commit-qu...@webkit.org
Date
2022-06-14 01:28:49 -0700 (Tue, 14 Jun 2022)

Log Message

Implement PerformanceResourceTiming.workerStart in ServiceWorkers
https://bugs.webkit.org/show_bug.cgi?id=179377
rdar://problem/35391187

Patch by Youenn Fablet <youe...@gmail.com> on 2022-06-14
Reviewed by Alex Christensen.

Store the time when we are about to either fire the fetch event or run the service worker to fire the fetch event.
To do so, we store it in NetworkResourceLoader and send the value to WebResourceLoader.
In case of process swap, we send it back to the new WebResourceLoader.
WebResourceLoader is then responsible to update the network load metrics when receiving the response/finish load metrics.

Covered by updated tests.

* LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt:
* LayoutTests/http/wpt/service-workers/navigation-timing.js:
(event.setTimeout):
* LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html:
* Source/WebCore/page/PerformanceResourceTiming.cpp:
(WebCore::PerformanceResourceTiming::workerStart const):
* Source/WebCore/platform/network/NetworkLoadMetrics.cpp:
(WebCore::NetworkLoadMetrics::updateFromFinalMetrics):
(WebCore::NetworkLoadMetrics::isolatedCopy const):
* Source/WebCore/platform/network/NetworkLoadMetrics.h:
(WebCore::NetworkLoadMetrics::encode const):
(WebCore::NetworkLoadMetrics::decode):
* Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::transferToNewWebProcess):
(WebKit::NetworkResourceLoader::continueWillSendRequest):
(WebKit::NetworkResourceLoader::setWorkerStart):
* Source/WebKit/NetworkProcess/NetworkResourceLoader.h:
* Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
(WebKit::ServiceWorkerFetchTask::ServiceWorkerFetchTask):
* Source/WebKit/WebProcess/Network/WebResourceLoader.cpp:
(WebKit::WebResourceLoader::didReceiveResponse):
(WebKit::WebResourceLoader::didFinishResourceLoad):
* Source/WebKit/WebProcess/Network/WebResourceLoader.h:
(WebKit::WebResourceLoader::setWorkerStart):
* Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in:

Canonical link: https://commits.webkit.org/251523@main

Modified Paths

Diff

Modified: trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt (295517 => 295518)


--- trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt	2022-06-14 08:28:49 UTC (rev 295518)
@@ -1 +1 @@
-PASS - navigation timing as expected
+PASS

Modified: trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js (295517 => 295518)


--- trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js	2022-06-14 08:28:49 UTC (rev 295518)
@@ -8,6 +8,8 @@
     setTimeout(()=>{
         event.respondWith(caches.open("cache_name").then((cache) => {
             return cache.match(event.request).then((response) => {
+                if (!response)
+                    return fetch(event.request);
                 return response;
             });
         }));

Modified: trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html (295517 => 295518)


--- trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html	2022-06-14 08:28:49 UTC (rev 295518)
@@ -7,19 +7,33 @@
 async function doTest()
 {
     const navTiming = performance.getEntries()[0];
-    const navTimingResult = (navigator.serviceWorker.controller
+    const navTimingResult = navigator.serviceWorker.controller
+        && navTiming.fetchStart >= navTiming.workerStart
         && navTiming.requestStart + navTiming.responseStart + navTiming.responseEnd > 0
         && navTiming.responseStart >= navTiming.requestStart
-        && navTiming.responseEnd >= navTiming.responseStart) ? "PASS - navigation timing as expected"
-        : "FAIL - navigation timing incorrect "
+        && navTiming.responseEnd >= navTiming.responseStart;
+
+    if (!navTimingResult) {
+        document.body.innerHTML = "FAIL - navigation timing incorrect "
+            + navTiming.fetchStart + " "
+            + navTiming.workerStart + " "
             + navTiming.requestStart + " "
             + navTiming.responseStart + " "
             + navTiming.responseEnd;
 
-    document.body.innerHTML = navTimingResult;
-    if (window.testRunner) {
+        if (window.testRunner)
+            testRunner.notifyDone();
+        return;
+    }
+
+    const response = await fetch("/?test");
+    await response.text();
+    const fetchTiming = performance.getEntries()[1];
+
+    const fetchTimingResult = fetchTiming.fetchStart && fetchTiming.workerStart && fetchTiming.fetchStart >= fetchTiming.workerStart;
+    document.body.innerHTML = fetchTimingResult ? "PASS" : "Failed fetchTimingResult " + fetchTiming.fetchStart + " " + fetchTiming.workerStart;
+    if (window.testRunner)
         testRunner.notifyDone();
-    }
 }
 </script>
 </body>

Modified: trunk/Source/WebCore/page/PerformanceResourceTiming.cpp (295517 => 295518)


--- trunk/Source/WebCore/page/PerformanceResourceTiming.cpp	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebCore/page/PerformanceResourceTiming.cpp	2022-06-14 08:28:49 UTC (rev 295518)
@@ -107,8 +107,10 @@
 
 double PerformanceResourceTiming::workerStart() const
 {
-    // FIXME: <https://webkit.org/b/179377> Implement PerformanceResourceTiming.workerStart in ServiceWorkers
-    return 0.0;
+    if (m_resourceTiming.networkLoadMetrics().failsTAOCheck)
+        return 0.0;
+
+    return networkLoadTimeToDOMHighResTimeStamp(m_timeOrigin, m_resourceTiming.networkLoadMetrics().workerStart);
 }
 
 double PerformanceResourceTiming::redirectStart() const

Modified: trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp (295517 => 295518)


--- trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp	2022-06-14 08:28:49 UTC (rev 295518)
@@ -44,6 +44,7 @@
     MonotonicTime originalRequestStart = requestStart;
     MonotonicTime originalResponseStart = responseStart;
     MonotonicTime originalResponseEnd = responseEnd;
+    MonotonicTime originalWorkerStart = workerStart;
 
     *this = other;
 
@@ -67,6 +68,8 @@
         responseStart = originalResponseStart;
     if (!responseEnd)
         responseEnd = originalResponseEnd;
+    if (!workerStart)
+        workerStart = originalWorkerStart;
 
     if (!responseEnd)
         responseEnd = MonotonicTime::now();
@@ -109,6 +112,7 @@
     copy.requestStart = requestStart.isolatedCopy();
     copy.responseStart = responseStart.isolatedCopy();
     copy.responseEnd = responseEnd.isolatedCopy();
+    copy.workerStart = workerStart.isolatedCopy();
 
     copy.protocol = protocol.isolatedCopy();
 

Modified: trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h (295517 => 295518)


--- trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h	2022-06-14 08:28:49 UTC (rev 295518)
@@ -88,7 +88,8 @@
     MonotonicTime requestStart;
     MonotonicTime responseStart;
     MonotonicTime responseEnd;
-    
+    MonotonicTime workerStart;
+
     // ALPN Protocol ID: https://w3c.github.io/resource-timing/#bib-RFC7301
     String protocol;
 
@@ -159,6 +160,7 @@
     encoder << requestStart;
     encoder << responseStart;
     encoder << responseEnd;
+    encoder << workerStart;
 
     encoder << protocol;
 
@@ -201,6 +203,7 @@
         && decoder.decode(metrics.requestStart)
         && decoder.decode(metrics.responseStart)
         && decoder.decode(metrics.responseEnd)
+        && decoder.decode(metrics.workerStart)
         && decoder.decode(metrics.protocol)
         && decoder.decode(metrics.redirectCount)))
         return std::nullopt;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (295517 => 295518)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2022-06-14 08:28:49 UTC (rev 295518)
@@ -591,6 +591,8 @@
         if (auto* swConnection = newConnection.swConnection())
             swConnection->transferServiceWorkerLoadToNewWebProcess(*this, *m_serviceWorkerRegistration);
     }
+    if (m_workerStart)
+        send(Messages::WebResourceLoader::SetWorkerStart { m_workerStart }, coreIdentifier());
 #else
     ASSERT(m_responseCompletionHandler || m_cacheEntryWaitingForContinueDidReceiveResponse);
 #endif
@@ -1234,6 +1236,7 @@
 #if ENABLE(SERVICE_WORKER)
     if (shouldTryToMatchRegistrationOnRedirection(parameters().options, !!m_serviceWorkerFetchTask)) {
         m_serviceWorkerRegistration = { };
+        setWorkerStart({ });
         if (auto serviceWorkerFetchTask = m_connection->createFetchTask(*this, newRequest)) {
             LOADER_RELEASE_LOG("continueWillSendRequest: Created a ServiceWorkerFetchTask to handle the redirect (fetchIdentifier=%" PRIu64 ")", serviceWorkerFetchTask->fetchIdentifier().toUInt64());
             m_networkLoad = nullptr;
@@ -1776,6 +1779,12 @@
 }
 
 #if ENABLE(SERVICE_WORKER)
+void NetworkResourceLoader::setWorkerStart(MonotonicTime value)
+{
+    m_workerStart = value;
+    send(Messages::WebResourceLoader::SetWorkerStart { m_workerStart }, coreIdentifier());
+}
+
 void NetworkResourceLoader::startWithServiceWorker()
 {
     LOADER_RELEASE_LOG("startWithServiceWorker:");

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h (295517 => 295518)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2022-06-14 08:28:49 UTC (rev 295518)
@@ -44,6 +44,7 @@
 #include <WebCore/SecurityPolicyViolationEvent.h>
 #include <WebCore/SharedBuffer.h>
 #include <WebCore/Timer.h>
+#include <wtf/MonotonicTime.h>
 #include <wtf/WeakPtr.h>
 
 namespace WebCore {
@@ -156,6 +157,8 @@
     void setResultingClientIdentifier(String&& identifier) { m_resultingClientIdentifier = WTFMove(identifier); }
     const String& resultingClientIdentifier() const { return m_resultingClientIdentifier; }
     void setServiceWorkerRegistration(WebCore::SWServerRegistration& serviceWorkerRegistration) { m_serviceWorkerRegistration = serviceWorkerRegistration; }
+    void setWorkerStart(MonotonicTime);
+    MonotonicTime workerStart() const { return m_workerStart; }
 #endif
 
     std::optional<WebCore::ResourceError> doCrossOriginOpenerHandlingOfResponse(const WebCore::ResourceResponse&);
@@ -291,6 +294,7 @@
     std::unique_ptr<ServiceWorkerFetchTask> m_serviceWorkerFetchTask;
     String m_resultingClientIdentifier;
     WeakPtr<WebCore::SWServerRegistration> m_serviceWorkerRegistration;
+    MonotonicTime m_workerStart;
 #endif
     NetworkResourceLoadIdentifier m_resourceLoadID;
     WebCore::ResourceResponse m_redirectResponse;

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp (295517 => 295518)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-06-14 08:28:49 UTC (rev 295518)
@@ -105,6 +105,8 @@
                 weakThis->preloadResponseIsReady();
         });
     }
+
+    loader.setWorkerStart(MonotonicTime::now());
 }
 
 ServiceWorkerFetchTask::~ServiceWorkerFetchTask()

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp (295517 => 295518)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2022-06-14 08:28:49 UTC (rev 295518)
@@ -156,8 +156,10 @@
 
     Ref<WebResourceLoader> protectedThis(*this);
 
-    if (metrics)
+    if (metrics) {
+        metrics->workerStart = m_workerStart;
         response.setDeprecatedNetworkLoadMetrics(Box<NetworkLoadMetrics>::create(WTFMove(*metrics)));
+    }
 
     if (privateRelayed == PrivateRelayed::Yes && mainFrameMainResource() == MainFrameMainResource::Yes)
         WebProcess::singleton().setHadMainFrameMainResourcePrivateRelayed();
@@ -241,19 +243,21 @@
     m_coreLoader->didReceiveData(data.isNull() ? SharedBuffer::create() : data.unsafeBuffer().releaseNonNull(), encodedDataLength, DataPayloadBytes);
 }
 
-void WebResourceLoader::didFinishResourceLoad(const NetworkLoadMetrics& networkLoadMetrics)
+void WebResourceLoader::didFinishResourceLoad(NetworkLoadMetrics&& networkLoadMetrics)
 {
     LOG(Network, "(WebProcess) WebResourceLoader::didFinishResourceLoad for '%s'", m_coreLoader->url().string().latin1().data());
     WEBRESOURCELOADER_RELEASE_LOG("didFinishResourceLoad: (length=%zd)", m_numBytesReceived);
 
     if (UNLIKELY(m_interceptController.isIntercepting(m_coreLoader->identifier()))) {
-        m_interceptController.defer(m_coreLoader->identifier(), [this, protectedThis = Ref { *this }, networkLoadMetrics]() mutable {
+        m_interceptController.defer(m_coreLoader->identifier(), [this, protectedThis = Ref { *this }, networkLoadMetrics = WTFMove(networkLoadMetrics)]() mutable {
             if (m_coreLoader)
-                didFinishResourceLoad(networkLoadMetrics);
+                didFinishResourceLoad(WTFMove(networkLoadMetrics));
         });
         return;
     }
 
+    networkLoadMetrics.workerStart = m_workerStart;
+
     ASSERT_WITH_MESSAGE(!m_isProcessingNetworkResponse, "Load should not be able to finish before we've validated the response");
     m_coreLoader->didFinishLoading(networkLoadMetrics);
 }

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h (295517 => 295518)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2022-06-14 08:28:49 UTC (rev 295518)
@@ -34,6 +34,7 @@
 #include <WebCore/FrameIdentifier.h>
 #include <WebCore/PageIdentifier.h>
 #include <WebCore/ResourceLoaderIdentifier.h>
+#include <wtf/MonotonicTime.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 
@@ -87,11 +88,12 @@
     void didSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent);
     void didReceiveResponse(WebCore::ResourceResponse&&, PrivateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics>&&);
     void didReceiveData(IPC::SharedBufferReference&& data, int64_t encodedDataLength);
-    void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&);
+    void didFinishResourceLoad(WebCore::NetworkLoadMetrics&&);
     void didFailResourceLoad(const WebCore::ResourceError&);
     void didFailServiceWorkerLoad(const WebCore::ResourceError&);
     void serviceWorkerDidNotHandle();
     void didBlockAuthenticationChallenge();
+    void setWorkerStart(MonotonicTime value) { m_workerStart = value; }
 
     void stopLoadingAfterXFrameOptionsOrContentSecurityPolicyDenied(const WebCore::ResourceResponse&);
 
@@ -113,6 +115,8 @@
 #if ASSERT_ENABLED
     bool m_isProcessingNetworkResponse { false };
 #endif
+
+    MonotonicTime m_workerStart;
 };
 
 } // namespace WebKit

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


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2022-06-14 06:33:01 UTC (rev 295517)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2022-06-14 08:28:49 UTC (rev 295518)
@@ -22,6 +22,7 @@
 
 messages -> WebResourceLoader LegacyReceiver {
     WillSendRequest(WebCore::ResourceRequest request, IPC::FormDataReference requestBody, WebCore::ResourceResponse redirectResponse)
+    SetWorkerStart(MonotonicTime value)
     DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent)
     DidReceiveResponse(WebCore::ResourceResponse response, enum:bool WebKit::PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics> optionalNetworkLoadMetrics)
     DidReceiveData(IPC::SharedBufferReference data, int64_t encodedDataLength)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to