Title: [293679] trunk
Revision
293679
Author
you...@apple.com
Date
2022-05-02 13:15:27 -0700 (Mon, 02 May 2022)

Log Message

Cancel response stream if load is being cancelled by the web page
https://bugs.webkit.org/show_bug.cgi?id=239968

Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream.https-expected.txt:

Source/WebCore:

Add a cancel callback and use it to get the fetch client cancelling notification
to cancel the response body stream or response body load.

Covered by rebased test.

* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::cancelStream):
* Modules/fetch/FetchResponse.h:
* bindings/js/ReadableStream.cpp:
(WebCore::ReadableStream::cancel):
* bindings/js/ReadableStream.h:
* workers/service/context/ServiceWorkerFetch.cpp:
(WebCore::ServiceWorkerFetch::processResponse):
* workers/service/context/ServiceWorkerFetch.h:

Source/WebKit:

Use the cancel callback to pipe the order to cancel the stream.

* WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
(WebKit::WebServiceWorkerFetchTaskClient::cancel):
(WebKit::WebServiceWorkerFetchTaskClient::setCancelledCallback):
* WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (293678 => 293679)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-05-02 20:15:27 UTC (rev 293679)
@@ -1,3 +1,12 @@
+2022-05-02  Youenn Fablet  <you...@apple.com>
+
+        Cancel response stream if load is being cancelled by the web page
+        https://bugs.webkit.org/show_bug.cgi?id=239968
+
+        Reviewed by Chris Dumez.
+
+        * web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream.https-expected.txt:
+
 2022-05-02  Ziran Sun  <z...@igalia.com>
 
         [selection] Set correct selection range for TEXTAREA when updating default value

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream.https-expected.txt (293678 => 293679)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream.https-expected.txt	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream.https-expected.txt	2022-05-02 20:15:27 UTC (rev 293679)
@@ -5,5 +5,5 @@
 PASS Main resource built from a ReadableStream - delayed
 PASS Subresource built from a ReadableStream - fetch stream
 PASS Main resource built from a ReadableStream - fetch stream
-FAIL Cancellation in the page should be observable in the service worker assert_equals: expected "cancelled" but got "pending"
+PASS Cancellation in the page should be observable in the service worker
 

Modified: trunk/Source/WebCore/ChangeLog (293678 => 293679)


--- trunk/Source/WebCore/ChangeLog	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/ChangeLog	2022-05-02 20:15:27 UTC (rev 293679)
@@ -1,5 +1,27 @@
 2022-05-02  Youenn Fablet  <you...@apple.com>
 
+        Cancel response stream if load is being cancelled by the web page
+        https://bugs.webkit.org/show_bug.cgi?id=239968
+
+        Reviewed by Chris Dumez.
+
+        Add a cancel callback and use it to get the fetch client cancelling notification
+        to cancel the response body stream or response body load.
+
+        Covered by rebased test.
+
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::cancelStream):
+        * Modules/fetch/FetchResponse.h:
+        * bindings/js/ReadableStream.cpp:
+        (WebCore::ReadableStream::cancel):
+        * bindings/js/ReadableStream.h:
+        * workers/service/context/ServiceWorkerFetch.cpp:
+        (WebCore::ServiceWorkerFetch::processResponse):
+        * workers/service/context/ServiceWorkerFetch.h:
+
+2022-05-02  Youenn Fablet  <you...@apple.com>
+
         PWA in iOS use old assets after publish new servicerWorker/assets
         https://bugs.webkit.org/show_bug.cgi?id=199110
         <rdar://problem/51992077>

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (293678 => 293679)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2022-05-02 20:15:27 UTC (rev 293679)
@@ -487,6 +487,15 @@
     m_readableStreamSource = nullptr;
 }
 
+void FetchResponse::cancelStream()
+{
+    if (isAllowedToRunScript() && hasReadableStreamBody()) {
+        body().readableStream()->cancel(Exception { AbortError, "load is cancelled"_s });
+        return;
+    }
+    cancel();
+}
+
 void FetchResponse::feedStream()
 {
     ASSERT(m_readableStreamSource);

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (293678 => 293679)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2022-05-02 20:15:27 UTC (rev 293679)
@@ -96,6 +96,7 @@
 
     using ConsumeDataByChunkCallback = Function<void(ExceptionOr<Span<const uint8_t>*>&&)>;
     void consumeBodyReceivedByChunk(ConsumeDataByChunkCallback&&);
+    void cancelStream();
 
     WEBCORE_EXPORT ResourceResponse resourceResponse() const;
     ResourceResponse::Tainting tainting() const { return m_internalResponse.tainting(); }

Modified: trunk/Source/WebCore/bindings/js/ReadableStream.cpp (293678 => 293679)


--- trunk/Source/WebCore/bindings/js/ReadableStream.cpp	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/bindings/js/ReadableStream.cpp	2022-05-02 20:15:27 UTC (rev 293679)
@@ -136,6 +136,28 @@
     });
 }
 
+void ReadableStream::cancel(const Exception& exception)
+{
+    auto& lexicalGlobalObject = *m_globalObject;
+    auto* clientData = static_cast<JSVMClientData*>(lexicalGlobalObject.vm().clientData);
+    auto& privateName = clientData->builtinFunctions().readableStreamInternalsBuiltins().readableStreamCancelPrivateName();
+
+    auto& vm = lexicalGlobalObject.vm();
+    JSC::JSLockHolder lock(vm);
+    auto scope = DECLARE_CATCH_SCOPE(vm);
+    auto value = createDOMException(&lexicalGlobalObject, exception.code(), exception.message());
+    if (UNLIKELY(scope.exception())) {
+        ASSERT(vm.hasPendingTerminationException());
+        return;
+    }
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(readableStream());
+    arguments.append(value);
+    ASSERT(!arguments.hasOverflowed());
+    invokeReadableStreamFunction(lexicalGlobalObject, privateName, JSC::jsUndefined(), arguments);
+}
+
 static inline bool checkReadableStream(JSDOMGlobalObject& globalObject, JSReadableStream* readableStream, JSC::JSValue function)
 {
     auto& lexicalGlobalObject = globalObject;

Modified: trunk/Source/WebCore/bindings/js/ReadableStream.h (293678 => 293679)


--- trunk/Source/WebCore/bindings/js/ReadableStream.h	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/bindings/js/ReadableStream.h	2022-05-02 20:15:27 UTC (rev 293679)
@@ -46,6 +46,7 @@
 
     std::optional<std::pair<Ref<ReadableStream>, Ref<ReadableStream>>> tee();
 
+    void cancel(const Exception&);
     void lock();
     void pipeTo(ReadableStreamSink&);
     bool isLocked() const;

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (293678 => 293679)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp	2022-05-02 20:15:27 UTC (rev 293679)
@@ -123,6 +123,10 @@
     client->didReceiveResponse(resourceResponse);
 
     if (response->isBodyReceivedByChunk()) {
+        client->setCancelledCallback([response = WeakPtr { response.get() }] {
+            if (response)
+                response->cancelStream();
+        });
         response->consumeBodyReceivedByChunk([client = WTFMove(client), response = WeakPtr { response.get() }] (auto&& result) mutable {
             if (result.hasException()) {
                 auto error = FetchEvent::createResponseError(URL { }, result.exception().message(), ResourceError::IsSanitized::Yes);

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h (293678 => 293679)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h	2022-05-02 20:15:27 UTC (rev 293679)
@@ -58,6 +58,7 @@
     virtual void didFinish(const NetworkLoadMetrics&) = 0;
     virtual void didNotHandle() = 0;
     virtual void cancel() = 0;
+    virtual void setCancelledCallback(Function<void()>&&) = 0;
     virtual void continueDidReceiveResponse() = 0;
     virtual void convertFetchToDownload() = 0;
 };

Modified: trunk/Source/WebKit/ChangeLog (293678 => 293679)


--- trunk/Source/WebKit/ChangeLog	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebKit/ChangeLog	2022-05-02 20:15:27 UTC (rev 293679)
@@ -1,3 +1,17 @@
+2022-05-02  Youenn Fablet  <you...@apple.com>
+
+        Cancel response stream if load is being cancelled by the web page
+        https://bugs.webkit.org/show_bug.cgi?id=239968
+
+        Reviewed by Chris Dumez.
+
+        Use the cancel callback to pipe the order to cancel the stream.
+
+        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
+        (WebKit::WebServiceWorkerFetchTaskClient::cancel):
+        (WebKit::WebServiceWorkerFetchTaskClient::setCancelledCallback):
+        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:
+
 2022-05-02  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [iOS] Add support for the "Markup Image" action when right clicking an image in editable content

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp (293678 => 293679)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2022-05-02 20:15:27 UTC (rev 293679)
@@ -207,7 +207,10 @@
 
 void WebServiceWorkerFetchTaskClient::cancel()
 {
+    ASSERT(!isMainRunLoop());
     m_connection = nullptr;
+    if (m_cancelledCallback)
+        m_cancelledCallback();
 }
 
 void WebServiceWorkerFetchTaskClient::convertFetchToDownload()
@@ -216,6 +219,12 @@
     continueDidReceiveResponse();
 }
 
+void WebServiceWorkerFetchTaskClient::setCancelledCallback(Function<void()>&& callback)
+{
+    ASSERT(!m_cancelledCallback);
+    m_cancelledCallback = WTFMove(callback);
+}
+
 void WebServiceWorkerFetchTaskClient::continueDidReceiveResponse()
 {
     RELEASE_LOG(ServiceWorker, "ServiceWorkerFrameLoaderClient::continueDidReceiveResponse, has connection %d, didFinish %d, response type %ld", !!m_connection, m_didFinish, static_cast<long>(m_responseData.index()));

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h (293678 => 293679)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h	2022-05-02 20:06:19 UTC (rev 293678)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h	2022-05-02 20:15:27 UTC (rev 293679)
@@ -59,6 +59,7 @@
     void cancel() final;
     void continueDidReceiveResponse() final;
     void convertFetchToDownload() final;
+    void setCancelledCallback(Function<void()>&&) final;
 
     void cleanup();
 
@@ -89,6 +90,7 @@
     WebCore::NetworkLoadMetrics m_networkLoadMetrics;
     bool m_didFinish { false };
     bool m_isDownload { false };
+    Function<void()> m_cancelledCallback;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to