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)