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