Diff
Modified: trunk/LayoutTests/ChangeLog (291440 => 291441)
--- trunk/LayoutTests/ChangeLog 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/LayoutTests/ChangeLog 2022-03-17 21:19:27 UTC (rev 291441)
@@ -1,3 +1,19 @@
+2022-03-17 Alex Christensen <[email protected]>
+
+ PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
+ https://bugs.webkit.org/show_bug.cgi?id=237317
+
+ Reviewed by Youenn Fablet.
+
+ Test that these values are reasonable after loading the main resource from a service worker's cache.
+
+ * http/wpt/service-workers/navigation-timing.https-expected.txt: Added.
+ * http/wpt/service-workers/navigation-timing.https.html: Added.
+ * http/wpt/service-workers/navigation-timing.js: Added.
+ (event.event.waitUntil.caches.open.string_appeared_here.then):
+ (event.event.respondWith.caches.open.string_appeared_here.then):
+ * http/wpt/service-workers/resources/navigation-timing-part-2.html: Added.
+
2022-03-17 Cameron McCormack <[email protected]>
Avoid calling connectionClosedFromServer on a connection twice when a version change is active
Added: trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt (0 => 291441)
--- trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https-expected.txt 2022-03-17 21:19:27 UTC (rev 291441)
@@ -0,0 +1 @@
+PASS - navigation timing as expected
Added: trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https.html (0 => 291441)
--- trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https.html (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-timing.https.html 2022-03-17 21:19:27 UTC (rev 291441)
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>Service Worker navigation timing request and response time</title>
+</head>
+<body _onload_="doTest()">
+<script>
+async function doTest()
+{
+ var registration = await navigator.serviceWorker.register("navigation-timing.js", { scope : "resources/" });
+ var activeWorker = registration.active;
+ if (!activeWorker) {
+ activeWorker = registration.installing;
+ await new Promise(resolve => {
+ activeWorker.addEventListener('statechange', () => {
+ if (activeWorker.state === "activated")
+ resolve(registration);
+ });
+ });
+ }
+ window.location = "resources/navigation-timing-part-2.html";
+}
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+</script>
+</body>
+</html>
Added: trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js (0 => 291441)
--- trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/navigation-timing.js 2022-03-17 21:19:27 UTC (rev 291441)
@@ -0,0 +1,15 @@
+self.addEventListener('install', (event) => {
+ event.waitUntil(caches.open("cache_name").then((cache) => {
+ return cache.addAll(['/WebKit/service-workers/resources/navigation-timing-part-2.html']);
+ }));
+});
+
+self.addEventListener('fetch', (event) => {
+ setTimeout(()=>{
+ event.respondWith(caches.open("cache_name").then((cache) => {
+ return cache.match(event.request).then((response) => {
+ return response;
+ });
+ }));
+ }, 500);
+});
Added: trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html (0 => 291441)
--- trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/navigation-timing-part-2.html 2022-03-17 21:19:27 UTC (rev 291441)
@@ -0,0 +1,26 @@
+<html>
+<head>
+<title>Service Worker navigation timing request and response time</title>
+</head>
+<body _onload_="doTest()">
+<script>
+async function doTest()
+{
+ const navTiming = performance.getEntries()[0];
+ const navTimingResult = (navigator.serviceWorker.controller
+ && 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.requestStart + " "
+ + navTiming.responseStart + " "
+ + navTiming.responseEnd;
+
+ document.body.innerHTML = navTimingResult;
+ if (window.testRunner) {
+ testRunner.notifyDone();
+ }
+}
+</script>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (291440 => 291441)
--- trunk/Source/WebCore/ChangeLog 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/ChangeLog 2022-03-17 21:19:27 UTC (rev 291441)
@@ -1,3 +1,19 @@
+2022-03-17 Alex Christensen <[email protected]>
+
+ PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
+ https://bugs.webkit.org/show_bug.cgi?id=237317
+
+ Reviewed by Youenn Fablet.
+
+ * Modules/cache/DOMCache.cpp:
+ (WebCore::createResponse):
+ * page/PerformanceNavigationTiming.cpp:
+ (WebCore::PerformanceNavigationTiming::navigationFinished):
+ * platform/network/NetworkLoadMetrics.cpp:
+ (WebCore::NetworkLoadMetrics::updateFrom):
+ (WebCore::NetworkLoadMetrics::NetworkLoadMetrics): Deleted.
+ * platform/network/NetworkLoadMetrics.h:
+
2022-03-17 Eric Carlson <[email protected]>
[iOS] Fix build breakage from r291361
Modified: trunk/Source/WebCore/Modules/cache/DOMCache.cpp (291440 => 291441)
--- trunk/Source/WebCore/Modules/cache/DOMCache.cpp 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.cpp 2022-03-17 21:19:27 UTC (rev 291441)
@@ -79,10 +79,16 @@
});
}
-static Ref<FetchResponse> createResponse(ScriptExecutionContext& context, const DOMCacheEngine::Record& record)
+static Ref<FetchResponse> createResponse(ScriptExecutionContext& context, const DOMCacheEngine::Record& record, MonotonicTime requestStart)
{
auto resourceResponse = record.response;
resourceResponse.setSource(ResourceResponse::Source::DOMCache);
+
+ auto metrics = Box<NetworkLoadMetrics>::create();
+ metrics->requestStart = requestStart;
+ metrics->responseStart = MonotonicTime::now();
+ resourceResponse.setDeprecatedNetworkLoadMetrics(WTFMove(metrics));
+
auto response = FetchResponse::create(&context, std::nullopt, record.responseHeadersGuard, WTFMove(resourceResponse));
response->setBodyData(copyResponseBody(record.responseBody), record.responseBodySize);
return response;
@@ -100,7 +106,8 @@
}
auto request = requestOrException.releaseReturnValue()->resourceRequest();
- queryCache(WTFMove(request), options, ShouldRetrieveResponses::Yes, [this, callback = WTFMove(callback)](auto&& result) mutable {
+ auto requestStart = MonotonicTime::now();
+ queryCache(WTFMove(request), options, ShouldRetrieveResponses::Yes, [this, callback = WTFMove(callback), requestStart](auto&& result) mutable {
if (result.hasException()) {
callback(result.releaseException());
return;
@@ -108,16 +115,16 @@
RefPtr<FetchResponse> response;
if (!result.returnValue().isEmpty())
- response = createResponse(*scriptExecutionContext(), result.returnValue()[0]);
+ response = createResponse(*scriptExecutionContext(), result.returnValue()[0], requestStart);
callback(WTFMove(response));
});
}
-Vector<Ref<FetchResponse>> DOMCache::cloneResponses(const Vector<DOMCacheEngine::Record>& records)
+Vector<Ref<FetchResponse>> DOMCache::cloneResponses(const Vector<DOMCacheEngine::Record>& records, MonotonicTime requestStart)
{
- return WTF::map(records, [this] (const auto& record) {
- return createResponse(*scriptExecutionContext(), record);
+ return WTF::map(records, [this, requestStart] (const auto& record) {
+ return createResponse(*scriptExecutionContext(), record, requestStart);
});
}
@@ -136,13 +143,14 @@
resourceRequest = requestOrException.releaseReturnValue()->resourceRequest();
}
- queryCache(WTFMove(resourceRequest), options, ShouldRetrieveResponses::Yes, [this, promise = WTFMove(promise)](auto&& result) mutable {
- queueTaskKeepingObjectAlive(*this, TaskSource::DOMManipulation, [this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
+ auto requestStart = MonotonicTime::now();
+ queryCache(WTFMove(resourceRequest), options, ShouldRetrieveResponses::Yes, [this, promise = WTFMove(promise), requestStart](auto&& result) mutable {
+ queueTaskKeepingObjectAlive(*this, TaskSource::DOMManipulation, [this, promise = WTFMove(promise), result = WTFMove(result), requestStart]() mutable {
if (result.hasException()) {
promise.reject(result.releaseException());
return;
}
- promise.resolve(cloneResponses(result.releaseReturnValue()));
+ promise.resolve(cloneResponses(result.releaseReturnValue(), requestStart));
});
});
}
Modified: trunk/Source/WebCore/Modules/cache/DOMCache.h (291440 => 291441)
--- trunk/Source/WebCore/Modules/cache/DOMCache.h 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.h 2022-03-17 21:19:27 UTC (rev 291441)
@@ -82,7 +82,7 @@
void batchPutOperation(const FetchRequest&, FetchResponse&, DOMCacheEngine::ResponseBody&&, CompletionHandler<void(ExceptionOr<void>&&)>&&);
void batchPutOperation(Vector<DOMCacheEngine::Record>&&, CompletionHandler<void(ExceptionOr<void>&&)>&&);
- Vector<Ref<FetchResponse>> cloneResponses(const Vector<DOMCacheEngine::Record>&);
+ Vector<Ref<FetchResponse>> cloneResponses(const Vector<DOMCacheEngine::Record>&, MonotonicTime);
DOMCacheEngine::Record toConnectionRecord(const FetchRequest&, FetchResponse&, DOMCacheEngine::ResponseBody&&);
String m_name;
Modified: trunk/Source/WebCore/page/PerformanceNavigationTiming.cpp (291440 => 291441)
--- trunk/Source/WebCore/page/PerformanceNavigationTiming.cpp 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/page/PerformanceNavigationTiming.cpp 2022-03-17 21:19:27 UTC (rev 291441)
@@ -142,7 +142,7 @@
void PerformanceNavigationTiming::navigationFinished(const NetworkLoadMetrics& metrics)
{
m_documentLoadTiming.markEndTime();
- m_resourceTiming.networkLoadMetrics() = metrics;
+ m_resourceTiming.networkLoadMetrics().updateFromFinalMetrics(metrics);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp (291440 => 291441)
--- trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp 2022-03-17 21:19:27 UTC (rev 291441)
@@ -30,16 +30,49 @@
namespace WebCore {
-NetworkLoadMetrics::NetworkLoadMetrics()
- : complete(false)
- , cellular(false)
- , expensive(false)
- , constrained(false)
- , multipath(false)
- , isReusedConnection(false)
- , failsTAOCheck(false)
- , hasCrossOriginRedirect(false) { }
+NetworkLoadMetrics::NetworkLoadMetrics() = default;
+void NetworkLoadMetrics::updateFromFinalMetrics(const NetworkLoadMetrics& other)
+{
+ MonotonicTime originalRedirectStart = redirectStart;
+ MonotonicTime originalFetchStart = fetchStart;
+ MonotonicTime originalDomainLookupStart = domainLookupStart;
+ MonotonicTime originalDomainLookupEnd = domainLookupEnd;
+ MonotonicTime originalConnectStart = connectStart;
+ MonotonicTime originalSecureConnectionStart = secureConnectionStart;
+ MonotonicTime originalConnectEnd = connectEnd;
+ MonotonicTime originalRequestStart = requestStart;
+ MonotonicTime originalResponseStart = responseStart;
+ MonotonicTime originalResponseEnd = responseEnd;
+
+ *this = other;
+
+ if (!redirectStart)
+ redirectStart = originalRedirectStart;
+ if (!fetchStart)
+ fetchStart = originalFetchStart;
+ if (!domainLookupStart)
+ domainLookupStart = originalDomainLookupStart;
+ if (!domainLookupEnd)
+ domainLookupEnd = originalDomainLookupEnd;
+ if (!connectStart)
+ connectStart = originalConnectStart;
+ if (!secureConnectionStart)
+ secureConnectionStart = originalSecureConnectionStart;
+ if (!connectEnd)
+ connectEnd = originalConnectEnd;
+ if (!requestStart)
+ requestStart = originalRequestStart;
+ if (!responseStart)
+ responseStart = originalResponseStart;
+ if (!responseEnd)
+ responseEnd = originalResponseEnd;
+
+ if (!responseEnd)
+ responseEnd = MonotonicTime::now();
+ complete = true;
+}
+
const NetworkLoadMetrics& NetworkLoadMetrics::emptyMetrics()
{
static NeverDestroyed<NetworkLoadMetrics> metrics;
Modified: trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h (291440 => 291441)
--- trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h 2022-03-17 21:12:13 UTC (rev 291440)
+++ trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h 2022-03-17 21:19:27 UTC (rev 291441)
@@ -75,6 +75,8 @@
bool isComplete() const { return complete; }
void markComplete() { complete = true; }
+ void updateFromFinalMetrics(const NetworkLoadMetrics&);
+
// https://www.w3.org/TR/resource-timing-2/#attribute-descriptions
MonotonicTime redirectStart;
MonotonicTime fetchStart;
@@ -92,14 +94,14 @@
uint16_t redirectCount { 0 };
- bool complete : 1;
- bool cellular : 1;
- bool expensive : 1;
- bool constrained : 1;
- bool multipath : 1;
- bool isReusedConnection : 1;
- bool failsTAOCheck : 1;
- bool hasCrossOriginRedirect : 1;
+ bool complete : 1 { false };
+ bool cellular : 1 { false };
+ bool expensive : 1 { false };
+ bool constrained : 1 { false };
+ bool multipath : 1 { false };
+ bool isReusedConnection : 1 { false };
+ bool failsTAOCheck : 1 { false };
+ bool hasCrossOriginRedirect : 1 { false };
PrivacyStance privacyStance { PrivacyStance::Unknown };