Title: [220927] trunk/Source/WebCore
Revision
220927
Author
[email protected]
Date
2017-08-18 12:32:17 -0700 (Fri, 18 Aug 2017)

Log Message

[Fetch API] Add support for a callback-based fetch
https://bugs.webkit.org/show_bug.cgi?id=175710

Patch by Youenn Fablet <[email protected]> on 2017-08-18
Reviewed by Alex Christensen.

No change of behavior.

Moving from a DOMPromise to a Callback taking an ExceptionOr<FetchResponse&>.
Updating window and worker call sites.

* Modules/fetch/DOMWindowFetch.cpp:
(WebCore::DOMWindowFetch::fetch):
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::fetch):
(WebCore::FetchResponse::BodyLoader::didFail):
(WebCore::FetchResponse::BodyLoader::BodyLoader):
(WebCore::FetchResponse::BodyLoader::didReceiveResponse):
(WebCore::FetchResponse::BodyLoader::stop):
* Modules/fetch/FetchResponse.h:
* Modules/fetch/WorkerGlobalScopeFetch.cpp:
(WebCore::WorkerGlobalScopeFetch::fetch):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (220926 => 220927)


--- trunk/Source/WebCore/ChangeLog	2017-08-18 19:20:23 UTC (rev 220926)
+++ trunk/Source/WebCore/ChangeLog	2017-08-18 19:32:17 UTC (rev 220927)
@@ -1,3 +1,27 @@
+2017-08-18  Youenn Fablet  <[email protected]>
+
+        [Fetch API] Add support for a callback-based fetch
+        https://bugs.webkit.org/show_bug.cgi?id=175710
+
+        Reviewed by Alex Christensen.
+
+        No change of behavior.
+
+        Moving from a DOMPromise to a Callback taking an ExceptionOr<FetchResponse&>.
+        Updating window and worker call sites.
+
+        * Modules/fetch/DOMWindowFetch.cpp:
+        (WebCore::DOMWindowFetch::fetch):
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::fetch):
+        (WebCore::FetchResponse::BodyLoader::didFail):
+        (WebCore::FetchResponse::BodyLoader::BodyLoader):
+        (WebCore::FetchResponse::BodyLoader::didReceiveResponse):
+        (WebCore::FetchResponse::BodyLoader::stop):
+        * Modules/fetch/FetchResponse.h:
+        * Modules/fetch/WorkerGlobalScopeFetch.cpp:
+        (WebCore::WorkerGlobalScopeFetch::fetch):
+
 2017-08-18  Brady Eidson  <[email protected]>
 
         Bounce ServiceWorker jobs to the Storage Process.

Modified: trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp (220926 => 220927)


--- trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp	2017-08-18 19:20:23 UTC (rev 220926)
+++ trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp	2017-08-18 19:32:17 UTC (rev 220927)
@@ -33,24 +33,31 @@
 #include "DOMWindow.h"
 #include "Document.h"
 #include "FetchResponse.h"
+#include "JSFetchResponse.h"
 
 namespace WebCore {
 
-void DOMWindowFetch::fetch(DOMWindow& window, FetchRequest::Info&& input, FetchRequest::Init&& init, Ref<DeferredPromise>&& promise)
+using FetchResponsePromise = DOMPromiseDeferred<IDLInterface<FetchResponse>>;
+
+void DOMWindowFetch::fetch(DOMWindow& window, FetchRequest::Info&& input, FetchRequest::Init&& init, Ref<DeferredPromise>&& deferred)
 {
+    FetchResponsePromise promise = WTFMove(deferred);
+
     auto* document = window.document();
     if (!document) {
-        promise->reject(InvalidStateError);
+        promise.reject(InvalidStateError);
         return;
     }
 
     auto request = FetchRequest::create(*document, WTFMove(input), WTFMove(init));
     if (request.hasException()) {
-        promise->reject(request.releaseException());
+        promise.reject(request.releaseException());
         return;
     }
 
-    FetchResponse::fetch(*document, request.releaseReturnValue().get(), WTFMove(promise));
+    FetchResponse::fetch(*document, request.releaseReturnValue().get(), [promise = WTFMove(promise)](ExceptionOr<FetchResponse&>&& result) mutable {
+        promise.settle(WTFMove(result));
+    });
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (220926 => 220927)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-08-18 19:20:23 UTC (rev 220926)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-08-18 19:32:17 UTC (rev 220927)
@@ -32,7 +32,6 @@
 #include "FetchRequest.h"
 #include "HTTPParsers.h"
 #include "JSBlob.h"
-#include "JSFetchResponse.h"
 #include "ResourceError.h"
 #include "ScriptExecutionContext.h"
 
@@ -103,15 +102,16 @@
     return clone;
 }
 
-void FetchResponse::fetch(ScriptExecutionContext& context, FetchRequest& request, FetchPromise&& promise)
+void FetchResponse::fetch(ScriptExecutionContext& context, FetchRequest& request, NotificationCallback&& responseCallback)
 {
     if (request.isBodyReadableStream()) {
-        promise.reject(TypeError, "ReadableStream uploading is not supported");
+        if (responseCallback)
+            responseCallback(Exception { NotSupportedError, "ReadableStream uploading is not supported" });
         return;
     }
     auto response = adoptRef(*new FetchResponse(context, FetchBody::loadingBody(), FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
 
-    response->m_bodyLoader.emplace(response.get(), WTFMove(promise));
+    response->m_bodyLoader.emplace(response.get(), WTFMove(responseCallback));
     if (!response->m_bodyLoader->start(context, request))
         response->m_bodyLoader = std::nullopt;
 }
@@ -142,8 +142,8 @@
 void FetchResponse::BodyLoader::didFail(const ResourceError& error)
 {
     ASSERT(m_response.hasPendingActivity());
-    if (m_promise)
-        std::exchange(m_promise, std::nullopt)->reject(Exception { TypeError, String(error.localizedDescription()) });
+    if (auto responseCallback = WTFMove(m_responseCallback))
+        responseCallback(Exception { TypeError, String(error.localizedDescription()) });
 
 #if ENABLE(STREAMS_API)
     if (m_response.m_readableStreamSource) {
@@ -160,9 +160,9 @@
     }
 }
 
-FetchResponse::BodyLoader::BodyLoader(FetchResponse& response, FetchPromise&& promise)
+FetchResponse::BodyLoader::BodyLoader(FetchResponse& response, NotificationCallback&& responseCallback)
     : m_response(response)
-    , m_promise(WTFMove(promise))
+    , m_responseCallback(WTFMove(responseCallback))
 {
     m_response.setPendingActivity(&m_response);
 }
@@ -174,8 +174,6 @@
 
 void FetchResponse::BodyLoader::didReceiveResponse(const ResourceResponse& resourceResponse)
 {
-    ASSERT(m_promise);
-
     m_response.m_response = ResourceResponseBase::filter(resourceResponse);
     m_response.m_shouldExposeBody = resourceResponse.tainting() != ResourceResponse::Tainting::Opaque;
 
@@ -182,7 +180,8 @@
     m_response.m_headers->filterAndFill(m_response.m_response.httpHeaderFields(), FetchHeaders::Guard::Response);
     m_response.updateContentType();
 
-    std::exchange(m_promise, std::nullopt)->resolve(m_response);
+    if (auto responseCallback = WTFMove(m_responseCallback))
+        responseCallback(m_response);
 }
 
 void FetchResponse::BodyLoader::didReceiveData(const char* data, size_t size)
@@ -220,7 +219,7 @@
 
 void FetchResponse::BodyLoader::stop()
 {
-    m_promise = std::nullopt;
+    m_responseCallback = { };
     if (m_loader)
         m_loader->stop();
 }

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (220926 => 220927)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-08-18 19:20:23 UTC (rev 220926)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-08-18 19:32:17 UTC (rev 220927)
@@ -59,8 +59,8 @@
 
     static Ref<FetchResponse> create(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceResponse&& response) { return adoptRef(*new FetchResponse(context, WTFMove(body), WTFMove(headers), WTFMove(response))); }
 
-    using FetchPromise = DOMPromiseDeferred<IDLInterface<FetchResponse>>;
-    static void fetch(ScriptExecutionContext&, FetchRequest&, FetchPromise&&);
+    using NotificationCallback = WTF::Function<void(ExceptionOr<FetchResponse&>&&)>;
+    static void fetch(ScriptExecutionContext&, FetchRequest&, NotificationCallback&&);
 
     void consume(unsigned, Ref<DeferredPromise>&&);
 #if ENABLE(STREAMS_API)
@@ -98,8 +98,6 @@
 private:
     FetchResponse(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceResponse&&);
 
-    static void startFetching(ScriptExecutionContext&, const FetchRequest&, FetchPromise&&);
-
     void stop() final;
     const char* activeDOMObjectName() const final;
     bool canSuspendForDocumentSuspension() const final;
@@ -110,7 +108,7 @@
 
     class BodyLoader final : public FetchLoaderClient {
     public:
-        BodyLoader(FetchResponse&, FetchPromise&&);
+        BodyLoader(FetchResponse&, NotificationCallback&&);
         ~BodyLoader();
 
         bool start(ScriptExecutionContext&, const FetchRequest&);
@@ -128,7 +126,7 @@
         void didReceiveData(const char*, size_t) final;
 
         FetchResponse& m_response;
-        std::optional<FetchPromise> m_promise;
+        NotificationCallback m_responseCallback;
         std::unique_ptr<FetchLoader> m_loader;
     };
 

Modified: trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp (220926 => 220927)


--- trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp	2017-08-18 19:20:23 UTC (rev 220926)
+++ trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp	2017-08-18 19:32:17 UTC (rev 220927)
@@ -30,19 +30,26 @@
 #include "WorkerGlobalScopeFetch.h"
 
 #include "FetchResponse.h"
+#include "JSFetchResponse.h"
 #include "WorkerGlobalScope.h"
 
 namespace WebCore {
 
-void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope& scope, FetchRequest::Info&& input, FetchRequest::Init&& init, Ref<DeferredPromise>&& promise)
+using FetchResponsePromise = DOMPromiseDeferred<IDLInterface<FetchResponse>>;
+
+void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope& scope, FetchRequest::Info&& input, FetchRequest::Init&& init, Ref<DeferredPromise>&& deferred)
 {
+    FetchResponsePromise promise = WTFMove(deferred);
+
     auto request = FetchRequest::create(scope, WTFMove(input), WTFMove(init));
     if (request.hasException()) {
-        promise->reject(request.releaseException());
+        promise.reject(request.releaseException());
         return;
     }
 
-    FetchResponse::fetch(scope, request.releaseReturnValue().get(), WTFMove(promise));
+    FetchResponse::fetch(scope, request.releaseReturnValue().get(), [promise = WTFMove(promise)](ExceptionOr<FetchResponse&>&& result) mutable {
+        promise.settle(WTFMove(result));
+    });
 }
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to