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