Title: [291441] trunk
Revision
291441
Author
[email protected]
Date
2022-03-17 14:19:27 -0700 (Thu, 17 Mar 2022)

Log Message

PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
https://bugs.webkit.org/show_bug.cgi?id=237317

Patch by Alex Christensen <[email protected]> on 2022-03-17
Reviewed by Youenn Fablet.

Source/WebCore:

* 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:

LayoutTests:

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.

Modified Paths

Added Paths

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 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to