Title: [292296] trunk
Revision
292296
Author
[email protected]
Date
2022-04-04 10:31:52 -0700 (Mon, 04 Apr 2022)

Log Message

Service-Worker-Navigation-Preload header not being sent when Navigation Preload is enabled.
https://bugs.webkit.org/show_bug.cgi?id=238564

Reviewed by Alex Christensen.

Source/WebKit:

We were cancelling the preload as soon as receiving a response through FetchEvent.respondWith.
But it is possible to answer with a synthetic response and then use the preload to fill the synthetic response body.
To allow this, we no longer cancel the preload when receiving a response in case of enabled navigation preload.

Test: http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html

* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:

LayoutTests:

* http/wpt/service-workers/resources/service-worker-iframe-preload-after-response-script.py: Added.
* http/wpt/service-workers/service-worker-iframe-preload-after-response-worker.js: Added.
* http/wpt/service-workers/service-worker-iframe-preload-after-response.https-expected.txt: Added.
* http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (292295 => 292296)


--- trunk/LayoutTests/ChangeLog	2022-04-04 17:21:16 UTC (rev 292295)
+++ trunk/LayoutTests/ChangeLog	2022-04-04 17:31:52 UTC (rev 292296)
@@ -1,3 +1,15 @@
+2022-04-04  Youenn Fablet  <[email protected]>
+
+        Service-Worker-Navigation-Preload header not being sent when Navigation Preload is enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=238564
+
+        Reviewed by Alex Christensen.
+
+        * http/wpt/service-workers/resources/service-worker-iframe-preload-after-response-script.py: Added.
+        * http/wpt/service-workers/service-worker-iframe-preload-after-response-worker.js: Added.
+        * http/wpt/service-workers/service-worker-iframe-preload-after-response.https-expected.txt: Added.
+        * http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html: Added.
+
 2022-04-04  Said Abou-Hallawa  <[email protected]>
 
         [GPU Process] [iOS] Sometimes the text drop shadow is not drawn

Added: trunk/LayoutTests/http/wpt/service-workers/resources/service-worker-iframe-preload-after-response-script.py (0 => 292296)


--- trunk/LayoutTests/http/wpt/service-workers/resources/service-worker-iframe-preload-after-response-script.py	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/service-worker-iframe-preload-after-response-script.py	2022-04-04 17:31:52 UTC (rev 292296)
@@ -0,0 +1,5 @@
+def main(request, response):
+    response.headers.set(b"Cache-Control", b"no-cache")
+    response.headers.set(b"Content-Type", b"text/html")
+    value = request.headers.get(b"Service-Worker-Navigation-Preload", b"NoPreload").decode("utf-8")
+    return "<html><body><div>test</div><script>window.value = '" + value + "';</script></body></html>"

Added: trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response-worker.js (0 => 292296)


--- trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response-worker.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response-worker.js	2022-04-04 17:31:52 UTC (rev 292296)
@@ -0,0 +1,13 @@
+self.addEventListener('fetch', async (event) => {
+    let stream = new TransformStream();
+    let resolve;
+    let promise = new Promise(r => resolve = r);
+    event.waitUntil(promise);
+    event.respondWith(new Response(stream.readable, { status: 200, headers: [["ContentType", "text/html"]] }));
+
+    await new Promise(resolve => setTimeout(resolve, 50));
+
+    const response = await event.preloadResponse;
+    response.body.pipeTo(stream.writable);
+    resolve();
+});

Added: trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https-expected.txt (0 => 292296)


--- trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https-expected.txt	2022-04-04 17:31:52 UTC (rev 292296)
@@ -0,0 +1,5 @@
+
+
+PASS Setup preloading worker
+PASS Service worker load uses preload after passing a response to fetch event handler
+

Added: trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html (0 => 292296)


--- trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html	2022-04-04 17:31:52 UTC (rev 292296)
@@ -0,0 +1,39 @@
+<!doctype html>
+<html>
+<head>
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+var url = ""
+
+promise_test(async (test) => {
+    let registration = await navigator.serviceWorker.register("/WebKit/service-workers/service-worker-iframe-preload-after-response-worker.js", { scope : url });
+    if (!registration.installing) {
+        registration.unregister();
+        registration = await navigator.serviceWorker.register("/WebKit/service-workers/service-worker-iframe-preload-after-response-worker.js", { scope : url });
+    }
+    const activeWorker = registration.installing;
+
+    let resolve;
+    let promise = new Promise(r => resolve = r);
+    activeWorker.addEventListener('statechange', () => {
+        if (activeWorker.state === "activated")
+            resolve();
+    });
+    await promise;
+
+    await registration.navigationPreload.enable();
+    await registration.navigationPreload.setHeaderValue("ThisIsAPreload");
+}, "Setup preloading worker");
+
+promise_test(async (test) => {
+    const frame = await withIframe(url);
+    assert_equals(frame.contentWindow.value, "ThisIsAPreload");
+}, "Service worker load uses preload after passing a response to fetch event handler");
+</script>
+</body>
+</html>

Modified: trunk/Source/WebKit/ChangeLog (292295 => 292296)


--- trunk/Source/WebKit/ChangeLog	2022-04-04 17:21:16 UTC (rev 292295)
+++ trunk/Source/WebKit/ChangeLog	2022-04-04 17:31:52 UTC (rev 292296)
@@ -1,3 +1,18 @@
+2022-04-04  Youenn Fablet  <[email protected]>
+
+        Service-Worker-Navigation-Preload header not being sent when Navigation Preload is enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=238564
+
+        Reviewed by Alex Christensen.
+
+        We were cancelling the preload as soon as receiving a response through FetchEvent.respondWith.
+        But it is possible to answer with a synthetic response and then use the preload to fill the synthetic response body.
+        To allow this, we no longer cancel the preload when receiving a response in case of enabled navigation preload.
+
+        Test: http/wpt/service-workers/service-worker-iframe-preload-after-response.https.html
+
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
+
 2022-04-04  Elliott Williams  <[email protected]>
 
         [XCBuild] WebKitLegacy's "Migrated headers" script does not emit task information

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp (292295 => 292296)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-04-04 17:21:16 UTC (rev 292295)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2022-04-04 17:31:52 UTC (rev 292296)
@@ -188,7 +188,8 @@
 
 void ServiceWorkerFetchTask::didReceiveResponse(WebCore::ResourceResponse&& response, bool needsContinueDidReceiveResponseMessage)
 {
-    cancelPreloadIfNecessary();
+    if (m_preloader && !m_preloader->isServiceWorkerNavigationPreloadEnabled())
+        cancelPreloadIfNecessary();
 
     processResponse(WTFMove(response), needsContinueDidReceiveResponseMessage, ShouldSetSource::Yes);
 }
@@ -258,6 +259,8 @@
     if (m_timeoutTimer)
         m_timeoutTimer->stop();
     sendToClient(Messages::WebResourceLoader::DidFinishResourceLoad { networkLoadMetrics });
+
+    cancelPreloadIfNecessary();
 }
 
 void ServiceWorkerFetchTask::didFail(const ResourceError& error)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to